Добрый день.
Нужна подсказка как реализовать поле на странице контакта, куда автоматически подтягивался бы номер телефона контрагента (по выбору контрагента, конечно). Поле должно быть виртуальное и только для просмотра.
Версия 7.6.0.840
Заранее спасибо за помощь

Нравится

4 комментария

Добрый день!!!

а какие у вас трудности? Работа с виртуальными полями ничем не отличается от работы полями получаемые их схем "Таблиц". Ничем не отличается Инициализация, Обработка, Валидация, Контроль и обработка событий. Вам нужен реальный пример, как решить вашу задачу. Или вам подсказать где в стандартном функционале, ваша задача уже решалась.

Михаил, здравствуйте.
Подошел бы как реальный пример, так и подсказка где такая задача реализована в системе.
Спасибо!

Коллеги, никто не может помочь в этом вопросе?

Ну вот так например
ассистент - тянем из связанной таблицы, по текущему контакту
на init я тоже вызывал метод getMainAssistant для заполнения поля

// diff
{
"operation": "insert",
"name": "Assistant",
"values": {
"caption": "Assistant",
"enabled": false
},
"parentName": "Header",
"propertyName": "items"
}
// attributes
"Assistant": {
dataValueType: Terrasoft.DataValueType.TEXT,
type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
dependencies: [
{
methodName: "getMainAssistant"
}
]
}
// methods
getMainAssistant: function() {
var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "UsrContactAssistents"});
esq.addColumn("UsrAssistant.Name", "UsrAssistantName");
esq.filters.add("UsrContactFilter", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "UsrContact", this.get("Id")));
esq.getEntityCollection(function(response) {
if (response && response.success) {
if (response.collection.getCount() > 0) {
var result = response.collection.getItems()[0];
this.set("MainAssistant", result.get("UsrAssistantName"));
}
}
}, this);
}

для связи с выбранным контрагентом например надо еще в добавить зависимость данного поля от контрагента
и attributes будет выглядеть так примерно

// attributes
"Assistant": {
dataValueType: Terrasoft.DataValueType.TEXT,
type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
dependencies: [
{
columns: ["Account"], // это для зависимости от контрагента
methodName: "getMainAssistant"
}
]
}
Показать все комментарии

Добрый день!
7.6
В разделе Пользователи есть деталь Правила доступа, на которой отображаются Сессии пользователя
!text

Можно ли как-то вывести информацию с этой детали в реестр(например, дату последнего входа) или хотя бы отфильтровать как-то по дате последнего сеанса в динамической папке.
Ни в связанных колонках в настройке реестра, ни в фильтрах с помощью связей подобной таблицы не нашла, чтобы присоединить ее

Нравится

12 комментариев

Здравствуйте, Дарья!

Данная деталь "смотрит" на объект Сеанс пользователя (SysUserSession). Колонка связи с разделом Пользователь.Id == Сеанс пользователя.Пользователь

Используя эти данные и правила фильтрации найденных записей, Вы можете вывести информацию о последнем сеансе пользователя в реестр.

"Демьяник Алексей Олегович" написал:правила фильтрации найденных записей

Вот только в списке связей при построении расширенного фильтра для "Объекта администрирования" "Сеанса пользователя" нет :wink:

Да, в том-то и дело, что не нахожу "Сеанса пользователя" для "Объекта администрирования" в расширенном фильтре при поиски связей

Дарья,

дело в том, что "Сеанс пользователя" является системным объектом (как и все объекты, которые начинаются с "Sys%")

Системные объекты не отображаются при фильтрации и настройке колонок.

"Системность" в данном случае определяется наличием объекта в одном из ядровых классов, недоступном из конфигурации.

Но можно попробовать создать представление на основе этой таблицы и по нему выполнять фильтрацию.

"Безродный Андрей" написал:Но можно попробовать создать представление на основе этой таблицы и по нему выполнять фильтрацию.

Адрей т.е если есть задачи где требуется пользователю предоставить возможным выполнять фильтрацию по системным таблицам, то лучше заранее делать "Представления". Я правильно вас понял? спасибо!!!

Добрый день!
Представление для таблицы "Сеанс пользователя" можно в этом случае создать как замещающий объект от "Сеанс пользователя" с установленной галкой "представление в БД" ?
или лучше вообще не выбирать для представления родительский объект в данном случае?

"Татаровская Дарья" написал:
Представление для таблицы "Сеанс пользователя" можно в этом случае создать как замещающий объект от "Сеанс пользователя" с установленной галкой "представление в БД" ?

или лучше вообще не выбирать для представления родительский объект в данном случае?

Да именно так и нужно Дарья сделать, а еще нужно написать SQL скрипт для создания представления, иначе представление в "Реальной БД" не появится. Примеры SQL сценариев можно подсмотреть в админке. Переходим "Конфигурация" -- > "SQL сценарии", В строке поиска указываем "vw%" и смотрим. примеры. и делаем свой Вьювер (представление)

про представления я знаю) и про sql скрипт тоже..
Меня интересует в этом конкретном случае - его лучше создать как все-таки замещающий объект или лучше ничего не указывать в родительском объекте?

Дарья день добрый!!!

В родительском объекте при Первом создании Представления указываем родительскую таблицу. К примеру создаю Представление для таблицы Контрагенты, следовательно в родительской таблице указываю Контрагенты и выставляю галочку, что это будет Представление. А уже после создаю SQL сценарий.

ну то есть представление в данном случае - это новый объект, не замещающий объект

спасибо

Создала представление. Теперь в расширенном фильтре появилось данное представления для связи - все получилось

Показать все комментарии

Не создаются лиды. При щелчке на кнопку добавить - ничего не происходит. При этом модуль редактирования раздела - не загружается. Версия 7.6.0.1666

Нравится

9 комментариев

Добрый день Екатерина!!!

первое впечатление, что не выполнена регистрация страницы, или слетела регистрации страницы. Выполните SQL запрос:

select * from SysModuleEdit
where CardSchemaUId='ddf8941f-92f3-4b10-9f59-faab18c12f46'

проверьте пожалуйста заполнено или нет поле "SysModuleEntityId". Если не заполнено, подскажу как повторно перерегистрировать страницу редактирования "Лиды". Если поле заполнено, тогда прошу к консоли браузера посмотреть не выдаются ли ошибки при нажатии на кнопку "Добавить"

Нет. Не заполнено. Не могли бы Вы побольше рассказать про регистрацию страниц и разделов в системе.?

Добрый день Екатерина!!!

1. Выполните запрос:

select * from SysModuleEntity
where SysEntitySchemaUId='41af89e9-750b-4ebb-8cac-ff39b64841ec'

2. Если в пункте №1 запрос вернул не нулевой результат, Выполните Update в системе, исполнив следующий запрос:

update p set
p.SysModuleEntityId=(select top 1 q.Id from SysModuleEntity as q where q.SysEntitySchemaUId='41af89e9-750b-4ebb-8cac-ff39b64841ec')
from SysModuleEdit as p
where p.CardSchemaUId='ddf8941f-92f3-4b10-9f59-faab18c12f46'

Если в пункте №1 запрос вернул нулевой результат, тогда выполните запрос по регистрации схемы "Lead" в системе, для этого исполните запрос:

INSERT INTO [dbo].[SysModuleEntity]
           ([Id]
           ,[CreatedOn]
           ,[CreatedById]
           ,[ModifiedOn]
           ,[ModifiedById]
           ,[TypeColumnUId]
           ,[ProcessListeners]
           ,[SysEntitySchemaUId])
     VALUES
           (newid()
           ,getdate()
           ,null
           ,getdate()
           ,null
           ,null
           ,0
           ,'41AF89E9-750B-4EBB-8CAC-FF39B64841EC')

После выполнения Insert, начните алгоритм выполнения с пункта №1

3. Выполните полную компиляцию системы. После выполните очистку Кеша, и перезайдите в систему.

4. Проверьте работоспособность раздела Лиды, а именно выполните "Добавление" лида.

Если будут Екатерина еще проблемы, ошибки пишите, буду рад вам помочь.

А Вы не могли бы скинуть ссылку, где можно посмотреть данные о системных таблицах, участвующих в процедуре [dbo].[tsp_RegisterSection] , кроме как http://www.terrasoft.ru/bpmonlinesdk/CreateStandartSection.html. Ещё есть где-нибудь информация. Просто возникает вопрос какую из частей процедуры необходимо выполнять, если необходимо зарегистрировать не полностью новый раздел, а ещё один раздел по уже существующему объекту?

И ещё вопрос по поводу конфигурирования: если я какую-то страницу раздела изменила в конфигураторе, я потом этот раздел не могу править из мастера раздела?

"Турышева Екатерина" написал:И ещё вопрос по поводу конфигурирования: если я какую-то страницу раздела изменила в конфигураторе, я потом этот раздел не могу править из мастера раздела?

На сколько мне известно, то нет и лучше этого не стоит делать. Но могу ошибаться и лучше чтобы данный вопрос осветили специалисты Технической поддержки. Из своего опыта скажу, мастером раздела с момента его появления я так не разу и не пользовался, старался все писать вручную. Чтобы уже на этапе написания кода исключить ошибки, и правильно оптимизировать код.

"Турышева Екатерина" написал:А Вы не могли бы скинуть ссылку, где можно посмотреть данные о системных таблицах,

здесь могу только поделиться своими собственными скриптами по регистрации отдельно раздела, детали, страницы редактирования, схемы таблицы. я это разделил на отдельные SQL скрипты

Спасибо огромное. Буду тогда смотреть, разбираться сама с процедурой.

Будут вопросы Екатерина обращайтесь, буду рад вам помочь!!!

Показать все комментарии

Добый день, уважаемые разработчики!
Пожалуйста, помогите решить следующую проблему.
При переходе из разделов Контакты\Контрагенты в другие разделы и возвращении обратно, перестает работать кнопка Отложить напоминание в этих разделах, а иногда
и попросту становится неактивной.

Зараннее благодарю !
TS CRM 3.2.0.87

Нравится

20 комментариев

Добрый день Дмитрий!!!

подскажите у вас какая версия платформы 3.Х. Я конечно могу ошибаться, но насколько помню из Версии Terrasoft XRM 3.5, кнопка "Отложить напоминания" была во всплывающем окне "Напоминаний", и это была абсолютно отдельная сущность, которая работала без привязки к разделам. И переходы между разделами на данное всплывающее окно никак не могли повлиять. Можно пожалуйста более детально описать суть вашей проблемы, встречается ли данная проблема при переходе между другими разделами?

Михаил, Дмитрий писал, что у него «Консультанты и Тренеры 3.2.0.87 (Лабитек)».

Это партнёрское решение и, похоже, логика напоминаний там переделана относительно стандартной.
А партнёр этим продуктом уже не занимается.

В предыдущей теме на подобный вопрос написали:


В таком случае я бы Вам рекомендовал обратиться к менеджеру Terrasoft, если не знаете своего менеджера, то с этим вопросом можете обратиться в службу поддержки Terrasoft по e-mail: support@terrasoft.ru.
В данном случае тяжело сказать в чем причина такого поведения приложения, ведь в базовой линейки продуктов Terrasoft, такой проблемы не наблюдалось.
Для решения подобных проблем необходим доступ к конфигурации

- Используем Консультанты и Тренеры 3.2.0.87.
- Всплывающее окно, это общее окно куда сводятся все напоминания, время которых подошло и в нем есть кнопка Отложить, так же как и на деталях Напоминания в разделах Контрагенты, Контакты, Продукты, Воздействия, Ресурсы где их изначально создаешь. Т.о. откладывать можно и там и там. Проблем с откладыванием времени во всплывающем окне нет.
Проблема появляется либо в разделе Контрагенты , либо Контакты именно когда начинаешь делать переходы между разделами. Может и в других, но не анализировал. В большей степени проблема проявляется в разделе Контрагенты.
Допустим повесил напоминание на "через 10 минут" на определенного контрагента, потом сходил в раздел Контакты, потом в раздел Воздействия, еще что-нибудь сделал, потом вернулся обратно в Контрагенты и решил что через 10 минут туда еще рано звонить и нужно отложить допустим на целый час. Выставляешь время
в окошечке - 1ч, жмешь на кнопку, а время как было так и есть. Иногда вообще кнопка становится неактивной(серой).
Если работаешь только в одном разделе с самого начала запуска системы, то все работает как надо.
Т.е. если сразу окрыл раздел Контакты, то можешь сколько угодно раз переключаться по карточкам контактов(или переставлять курсор в реестре) и менять время напоминания у них - все работает как часы.
Такое ощущение, что при заходе в другие разделы прилипают сущности этих разделов и при возврате
необходимо что-то обновить , а вот что?

Дмитрий, в коробке такое поведение не наблюдается. Видимо, это специфическая логика, доработанная партнёрами.

А партнер в настоящее время не может уже помочь? или продукт у партнера снят с поддержки?

Уже не поддерживают.

Сразу из коробки кажется работало, но там было много багов\глюков которые исправляли.
Были и доработки ..., в какой момент появилось уже трудно вспомнить. Может у кого-нибудь есть мысли что проверять, в каком месте проверять или в каком направлении проверять ? Может какой-нибудь супер\refresh воткнуть при переходах в разделы? Нужен код!
Кстати, а как в комментарии грузить картинку со своего компьютера?

В таком случае нужно подключаться, изучать код и разбираться.
Дмитрий, обратитесь к менеджеру, пусть подскажет, кто и когда может таким заняться.

Картинку можно грузить по ссылке «Прикрепленные файлы» под полем ввода текста.

Прикрепить можно , а в сам текст комментария как вставить?

Судя по скриншоту, это явно не совсем стандартная логика.

В маленьком окошечке выпадающий список разных интервалов времени от 5 минут до 2 недель, я еще 1 минуту добавил. Одну кнопку растянул, которой больше всего пользуюсь, одну переименовал, может что-то местами поменял и все. Что Вы имеете ввиду под нестандартной логикой ? Наличие окошка с выбором времени задержки выстреливания сообщения? :smile:

Сам список с интервалами на этой детали в стандартной CRM отсутствует.
Смотрю на коробку 3.2 на стр. 87 тут.

А это значит, что логику в этом продукте по сравнению с базовой поменяли. То есть, либо нужно обратиться к партнёру, который делал эту версию, и узнать, кто сейчас оказывает её поддержку. Либо обращаться в Террасофт к менеджеру, заказывать услуги поддержки проекта, после согласования организовать удалённый доступ или выложить копию базы для изучения.

Кстати, я не понимаю почему отсутствует, ведь это более удобно!

Возможно, действительно удобно. Но платформа 3.Х уже не развивается, и маловероятно, что где-то ещё такое сделают.

Можете проверить, как устроено создание напоминаний в актуальной версии bpm'online 7 и если там такого нет, но было бы кстати, написать в раздел «Идеи» этого сайта.

В bpm'online 7 есть доступ к JScript?

Дмитрий, добрый день,

Судя по скриншоту, мы (Лабитек) не делали такой функциональности, я бы запомнил :)
Поднял дамп, с которого делалась инсталляция "Консультанты и тренеры" - в нем напоминания работают и выглядят точно также, как в стандартной конфигурации. Вам нужно связаться с тем, кто дорабатывал конфигурацию под ваши задачи после приобретения.

Странно, мне кажется, что окошко для выбора интервала уже было. Может просто забыл, и на самом деле
была доработка.

Добрый день.
Исходя из предоставленной выше информации, затруднительно дать какие-либо рекомендации, в сложившийся ситуации рекомендую найти человека (компанию) который вносил доработки в систему.

Показать все комментарии

Добый день, уважаемые разработчики!
Пожалуйста, помогите решить задачу, которая на первый взгляд, кажется не сложной, но ни как у меня не поддается решению. Все перепробовал.
Как из открытой карточки Контакта выгрузить в excel-файл Полное имя контакта?
Допустим, я создал кнопку на карточке по нажатию на которую Полное имя контакта должно экспортироваться в ячейку файла excel. Пожалуйста, подскажите хотя-бы примерно какой код можно было бы прописать на событие onButtonClick ? Зараннее благодарю!

TS CRM 3.2.0.87

Нравится

4 комментария

Вопрос решил сам - вопрос снимаю

Можно пример кода?

С примером кода по выгрузке данных в Excel вы можете ознакомиться по ссылке.
Значение поля карточки можно получить из датасета карточки dlData.Dataset('название поля').

Создал кнопку на карточке ред. контакта.
Пример моего кода по нажатию кнопки на карточке(экспортирую три поля в файл EXPORT.xls). Код пишем в scr_ContactEdit:
function ButtonOnClick(Control) {

var ExcelApp = new ActiveXObject("Excel.Application");
var ExcelSheet = new ActiveXObject("Excel.Sheet");

ExcelSheet.Application.Visible = false;
var Dataset = dlData.Dataset;

ExcelSheet.ActiveSheet.Cells(1,1).Value = Dataset.Values('Communication4');
ExcelSheet.ActiveSheet.Cells(1,2).Value = Dataset.Values('Short');
ExcelSheet.ActiveSheet.Cells(1,3).Value = Dataset.Values('Dear');

ExcelSheet.SaveAs( "C:\EXPORT.xls" );
ExcelSheet.Application.Quit();

}

Показать все комментарии

Не получается вывести checkbox на странице. Для его вывода написал следующий код.
В секции attributes:

"IsStreetInFIAS": {
        name: "IsStreetInFIAS",
        dataValueType: Terrasoft.DataValueType.BOOLEAN,
        type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
        value: false
}

В секции diff:

{
        "operation": "insert",
        "parentName": "Header",
        "propertyName": "items",
        "name": "IsStreetInFIAS",
        "values": {
                "bindTo": "IsStreetInFIAS",
                "caption": {
                        bindTo: "Resources.Strings.IsStreetInFIAS_checkbox_Caption"
                },
                "layout": {"column": 1, "row": 5, "colSpan": 1},
                "controlConfig": {
                        "className": "Terrasoft.CheckBoxEdit",
                        "checkedchanged": {
                                "bindTo": "OnIsStreetInFIASChanged"
                        }
                "checked": false
        }
}

При запуске процесса вывода страницы, содержащей CheckBoxEdit, в окне консоли отладчика браузера выводится следующее сообщение об ошибке: "Свойство checked Не было определено в классе Terrasoft.controls.Label". Как мне поправить исходник, чтобы чекбокс выводился?

Нравится

7 комментариев

Евгений добрый день!!!

привожу пример как создать к примеру "Напоминания ответственному", как изображено на картинке ниже:

....
            attributes: {
                /**
                 * Напомнить ответственнному
                 */
                "UpoRemindToOwner": {
                    dataValueType: Terrasoft.DataValueType.BOOLEAN,
                    dependencies: [
                        {
                            columns: ["UpoRemindToOwner"],
                            methodName: "onRemindToOwnerChanged"
                        }
                    ]
                }
            },
....
            methods: {
                /**
                 * Обработчик события изменения поля Напомнить ответсвенному
                 * @protected
                 */
                onRemindToOwnerChanged: function() {
                    var remindToOwner = this.get("UpoRemindToOwner");
                    if (remindToOwner) {
                        var startDate = this.Terrasoft.deepClone(this.get("UpoStartDate"));
                        if (!Ext.isDate(startDate)) {
                            return;
                        }
                        startDate = this.Terrasoft.clearSeconds(startDate);
                        this.set("UpoRemindToOwnerDate", startDate);
                        this.set("UpoRemindToOwnerDateEnabled", true);
                    } else {
                        this.set("UpoRemindToOwnerDate", null);
                        this.set("UpoRemindToOwnerDateEnabled", false);
                    }
                }
            },
....
            diff: /**SCHEMA_DIFF*/[
                {
                    "operation": "insert",
                    "parentName": "GeneralInfoLeft_Remind",
                    "propertyName": "items",
                    "name": "UpoRemindToOwner",
                    "values": {
                        "bindTo": "UpoRemindToOwner",
                        "layout": { "column": 0, "row": 1, "colSpan": 12 },
                        "labelConfig": {
                            "caption": { "bindTo": "Resources.Strings.RemindToOwnerCaption" }
                        }
                    }
                },
                {
                    "operation": "insert",
                    "parentName": "GeneralInfoLeft_Remind",
                    "propertyName": "items",
                    "name": "UpoRemindToOwnerDate",
                    "values": {
                        "bindTo": "UpoRemindToOwnerDate",
                        "layout": { "column": 12, "row": 1, "colSpan": 12 },
                        "enabled": { "bindTo": "UpoRemindToOwnerDateEnabled" },
                        "labelConfig": {
                            "caption": { "bindTo": "Resources.Strings.RemindDateCaption" }
                        }
                    }
                },
            ]/**SCHEMA_DIFF*/,

если разделить на этапы:
1. В Аттрибутах создаем и описываем атрибут "UpoRemindToOwner" - это и есть CheckBox поле, система при генерации страницы и выводе на экран по типу поля сама определяет, что это CheckBox поле и выводит его на экран.
2. в Методах создаем метод "onRemindToOwnerChanged", который контролирует изменения реквизита на экране
3. Выводим на экран.

Выше привел пример кода.

Михаил, извините, а что это за контейнер GeneralInfoLeft_Remind? Какой-то контейнер, созданный самим разработчиком (в данном случае вами)?
У меня чекбокс так и не выводится ни с

"parentName": "GeneralInfoLeft_Remind"

ни с

"parentName": "Header"

Хотя ошибок ни при публикации модуля страницы, ни при запуске процесса, открывающего эту страницу, не выдаётся ни в первом, ни во втором случае.

Чекбокс появился. Я закомментировал

columns: ["UpoRemindToOwner"]

и он стал визуализироваться.

Большое спасибо за помощь, Михаил.

Евгений мой пример полностью копипастить не нужно, это пример.

"parentName": "GeneralInfoLeft_Remind"

да это мой GRID_LAYOUT. в вашем случае это может быть совсем иной GRID_LAYOUT, но не забываем следующее:
1. Прежде чем вывести информацию на экран требуется схематично, на листе пумаге, в графическом редакторе разрисовать схематично Контейнеры, Назначить им имя Классов (если потребуется верстка, то по имени класса контейнера, мы обращаемся к нему), и далее пишем код. Не забываем, что в BPMOnline используется технология Bootstrap для визуализации и отображении информации на экране.
2. Прошу отдельно изучить и ознакомиться как строятся и формируются страницы Bootstrap. Я это все вам Евгений рекомендую, чтобы вы в будущем, прежде чем писать код для начало рисовали схематично свою страницу. Понимали в каких контейнерах где что будет располагаться, понимали какие стили верстки требуется применить дополнительно, чтобы визуально было все эстетично и красиво.
3. На схематично созданной страницы, описали бы для начала какие поля будут изменяемыми, какие поля будут зависимыми. Какие события будут получены экранной формой, какие события будут переданы и какому адресату.
4. И только после этого приступать к программированию.

как я вам и говорил ранее Евгений. Чтобы мы с вами говорили на одном языке, прошу вас записаться на сайте Академия Террасофт на обучение по программированию на платформе.

По вашему сообщению. Для анализа и воспроизводства ошибки у себя на экране, прошу пожалуйста , во вложении, выслать следующим постом Листинг вашей схемы страницы редактирования. Спасибо!!!

Спасибо за помощь и поддержку, Михаил. Checkbox воспроизвёлся - отобразился на экране. Ошибок, при этом, не было. У меня сейчас такая ситуация, что приходится работать - рисовать страницы на Jscript и вместе с этим изучать этот язык, т.к. я с ним раньше никогда не сталкивался. Ещё раз благодарю за помощь.

Добрый день Евгений!!!

рекомендую в первую очередь прочесть информацию опубликованную на Академии террасофт. Вот ссылка на SDK по платформе SDK BPMOnline 7.6

Показать все комментарии

BpmOnline 5.4
Подскажите, как работает это свойство.
Установил галочку в реестре, но никаких изменений в работе не обнаружил.
TreeGrid

Нравится

4 комментария

Иван, похоже в нынешних версиях платформы это свойство можно задать, но не используется.:confused:

Иван день добрый!!!

не буду сейчас ничего утверждать, под руками нет платформы 5.4. Подскажите по образу и подобию , то что вы хотите, разве нет в вашей системе? На сколько мне помниться платформа 5.4, была и остается тоже достаточна богата своими инструментами для программирования и работы.

Добрый день.
Задача открывать карточку редактирования объекта типа справочник, из реестра.
В качестве примера - открывать карточку контрагента из реестра инцидентов одним нажатием.

Добрый день Иван!!!

задача полностью понятна. Сегодня вечером разверну платформу BPMOnline 5.4 Service Desk, вспомню и проанализирую код. И подскажу вам как реализовать ваши пожелания. Спасибо!!!

Показать все комментарии

Добрый день.

В Бизнес-процессе происходит ошибка на блоке Чтение данных Лида:

System.Data.SqlClient.SqlException (0x80131904): The INSERT statement conflicted with the FOREIGN KEY constraint "FKkw7kQYErf0GdDIOp9FOjniv8". The conflict occurred in database "bpm2", table "dbo.SysProcessData", column 'Id'. The statement has been terminated. в System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) в System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) в System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) в System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds) в System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) в System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) в System.Data.SqlClient.SqlCommand.ExecuteNonQuery() в Terrasoft.Core.DB.DBExecutor.FailoverExecute[TResult](DbCommand command, Func`1 func) в Terrasoft.Core.DB.DBExecutor.Execute(String sqlText, QueryParameterCollection parameters) в Terrasoft.Core.DB.BaseInsert.Execute() в Terrasoft.Core.Process.ProcessActivity.RegisterInDB(UserConnection userConnection, ProcessStatus status, String errorDescription) в Terrasoft.Core.Process.ProcessActivity.Execute(ProcessExecutingContext context) ClientConnectionId:c5f93541-d8d3-4e86-bb4d-6fdac350a321

Возможно у кого-то есть идеи с чем это может быть связано.

Нравится

1 комментарий

Александра, добрый день!

Данное сообщение возникает в следствии того, что несколько потоков по двум или более веткам приходят к элементу “Добавить данные”. В результате происходит попытка добавить/изменить одну у ту же сущность более одного раза.
Еще возможен вариант, когда процесс уже завершен по одной из веток, а процесс пытается выполнить элементы в другой ветке.

Показать все комментарии

Добрый день,
Необходимо сделать раздел аналогичный разделу планирования, для начала сделал копию раздела, в js коде заменил все переменные на свои, но все равно подгружается стандартная ForecastTab в новом разделе. Подскажите где вообще идет инициализация какую страницу должен загружать модуль, я думал что это делается в ForecastsModule

initSchemaName: function() {
  this.schemaName = "ForecastTab";
},

поставил тут свое значение, но все равно грузится ForecastTab

Нравится

34 комментария

Добрый день Олег!!!

поделюсь опытом как я выполняю клонирование группы схем. К примеру мне требуется клонировать раздел Планирование.

1. Нахожу все формы, которые относятся и работают в разделе. Это формы раздела, страницы редактирования, детали, схемы таблиц, схемы бизнес-процессов
2. Поочередно выгружаю, через функцию экспорт все схемы
3. Выполняю замену "UId" схем в файлах на новые. Новые генерирую к примеру на SQL Management Studio, подав команду "select newid()". Замену выполняю с помочью программы "Far manager", для начала в файлах "*.md" нахожу старый "UID" и заменю на новые UID.
4. Выполняю замену названий схем на новые к примеру схема называлась "ContractPageV2" я внутри файла "ContractPageV2.md" переименовываю имя схемы на новое, к примеру на "MpoContractPageV2"
5. Действия 3,4 выполняю для всех выгруженных файлов.
6. Создаю новый пакет, прописываю необходимые зависимости, чтобы все схемы, что будут импортированы работали
7. Выполняю импорт
8. После импорта проверяю все ли "зависимости" целые на формах редактирования, формах раздела, деталях, бизнес-процессах, схемах таблиц. Проверку провожу по все загруженным схемам
9. Выполняю регистрацию, страниц редактирования, деталей, разделов.
10. Копирую для деталей, разделов их профили, средствами SQL Management Studio
11. Добавляю зарегистрированные Раздел на определенный Рабочий стол.
12. Проверяю работоспособность клонированного раздела
13. Веду дополнительную доработку, согласно своего технического задания.

Самый быстрый и рабочий на сегодня у меня способ клонирования любых схем, чтобы не сидеть и вручную не создавать клона.

Михаил, спасибо, но проблема не совсем в этом, раздел скопировался нормально, связи везде вроде заменил на свои, но они почему то не отрабатывают, был бы это обычный раздел проблемы бы вообще не возникло.

В .md файлах js модулей описан код тот же что я могу посмотреть и изменить в js файлах, так что не вижу смысла переводить их сначала в .md для редактирования

"Глобин Олег" написал:для начала сделал копию раздела, в js коде заменил все переменные на свои, но все равно подгружается стандартная ForecastTab в новом разделе.

Добрый день Олег!!!

подскажите пожалуйста, после создания вы выполнили регистрацию раздела в таблицах SysModule, SysModuleLcz, SysModuleEntity? и так же второй вопрос выполнили ли вы регистрацию страниц редактирования в таблицах SysModuleEdit, SysModuleEditLcz? данные действия выполнили?

Да, данные действия выполнял вызывая хранимые процедуры RegisterSection и RegisterPage которые собственно и делают записи в указанных Вами таблицах, после этого привязал раздел к рабочему месту, он стал отоюражаться в меню, он открывается но неверно вызывается страница которую отрисовывает модуль

Олег, во вложении скиньте листинг раздела. А лучше конечно MD файл. Я его посмотрю, листинг и сам MD. Подготовлю SQL запросы, исполните и скажите в результате на экране, все появляется или нет. Есть подозрение что некорректно выполнена регистрация раздела. Но нужно смотреть, листинг и ваш MD. MD страницы редактирования тоже кидайте, чтобы корректно вам в ответ я подготовил запросы. Спасибо!!!

Спасибо Михаил, прикрепил .md файлы трех основных js модулей которые исполняются для загрузки раздела, на всякий случай и .md страницы редактирования прицепил

Продолжаем разговор. :smile:

не успел еще подготовить SQL запросы, что обещал но сразу вопрос. Объект таблицы "SxForecast" в системе вы тоже создали, и зарегистрировали его в таблице SysModuleEntity? Ну и подчиненные таблице так же должны быть созданы:
- SxForecastDimension
- SxForecastIndicator
- SxForecastItem
- SxForecastItemValue

Созданы данные таблицы?
Если да то буду далее анализировать ваш код. И еще вопрос. Клонировать раздел, вы для каких целей собрались? не дешевле было переделать существующий?

Я как ранее и говорил из данного раздела, брал только подход работы, и создавал свой раздел, в котором ведется Заполнение и обработка экономических таблиц БДР, БДДС

Да, объекты конечно же есть необходимые, к сожалению по заданию необходим и базовый раздел Планирования, так что остается только сделать копию и уже ее менять, в принципе она практически идентиченая только таблица более сложная чем в оригинальном планировании

Давайте поступим так, чтобы вы уже Олег увидели на экране свой клонированный раздел Планирование, вышлите мне пожалуйста еще MD файл "SxForecast", как я и говорил подготовлю SQL запросы, чтобы убедиться регистрация прошла верно или нет. Если нет то подготовлю вам SQL скрипты по регистрации раздела, и его страниц.

Я сам еще раз повторюсь никогда не пользуюсь скриптами, для выполнения регистрации, всегда пишу под каждую задачу свои скрипты, чтобы уже быть точно уверенным, что регистрация прошла успешно и верно.

"Власов Михаил Викторович" написал:

увидели на экране свой клонированный раздел Планирование


Как я и говорил выше он удачно отображается и открывается, но страница на нем не загружается, т.е. проблема именно в js файлах
Точнее загружается страница раздела вверху название раздела, вкладки как в Планирование а вот ниже пусто
Сейчас попробую пересоздать объекты и страницы, заново все зарегистрирую и отпишусь по итогу

Олег, то что сейчас ошибочно выводиться на экран, покажите пожалуйста в виде скриншота, чтобы хоть представлять в какой схеме при генерации страницы мог произойти баг. так как у раздела планирования своя ViewModel и свой ViewModelGenerator.

Добрый день Олег!!!

по вашей задачи есть еще проблемы и вопросы? дайте пожалуйста обратную связь. Спасибо!!!

Добрый день Михаил,
Сейчас заново регистрирую раздел и страницы, отпишусь по завершению, скину скриншоты того что загружается

Итак, создал все нужные объекты и страницы, зарегистрировал раздел и страницы следующим запросом

DECLARE @SysEntitySchemaUId NVARCHAR(255);
DECLARE @SysModuleEntityId NVARCHAR(255);
DECLARE @SectionModuleSchemaUId NVARCHAR(255);
 
SET @SectionModuleSchemaUId = (SELECT TOP 1 Uid FROM SysSchema WHERE Name = 'SxForecastModule');
SET @SysEntitySchemaUId = (SELECT TOP 1 UId FROM SysSchema WHERE Name = 'SxForecast');
 
 
INSERT INTO SysModuleEntity (SysEntitySchemaUId) VALUES (@SysEntitySchemaUId);
 
SET @SysModuleEntityId = (SELECT TOP 1 Id FROM SysModuleEntity WHERE SysEntitySchemaUId = @SysEntitySchemaUId);
 
INSERT INTO SysModule (Caption, SysModuleEntityId, FolderModeId, GlobalSearchAvailable, HasAnalytics, HasActions, HasRecent, Code, ModuleHeader, SectionModuleSchemaUId) 
VALUES ('Прогнозирование', @SysModuleEntityId, 'B659D704-3955-E011-981F-00155D043204', 1, 1, 1, 0, 'SxForecast', 'Список: Прогнозирование', @SectionModuleSchemaUId);
 
INSERT INTO SysModuleLcz (RecordId, ColumnUId, SysCultureId, Value)
VALUES (@SysModuleEntityId, '3DA3C3B2-02FB-4CCA-80C3-7946D4E8F565', '1A778E3F-0A8E-E111-84A3-00155D054C03', 'Прогнозирование');
 
INSERT INTO SysModuleLcz (RecordId, ColumnUId, SysCultureId, Value)
VALUES (@SysModuleEntityId, '7B904E78-84BF-408C-A7A1-1287E66837D3', '1A778E3F-0A8E-E111-84A3-00155D054C03', 'Прогнозирование');
 
-- Регистрация страницы
 
INSERT INTO SysModuleEdit (SysModuleEntityId, UseModuleDetails, CardSchemaUId)
VALUES (@SysModuleEntityId, 1, (SELECT TOP 1 Uid FROM SysSchema WHERE Name = 'SxForecastPage'));
 
DECLARE @SysModuleEditId NVARCHAR(255);
SET @SysModuleEditId = (SELECT TOP 1 Id FROM SysModuleEdit WHERE SysModuleEntityId = @SysModuleEntityId);
 
INSERT INTO SysModuleEditLcz (RecordId, ColumnUId, SysCultureId, Value)
VALUES (@SysModuleEditId, 'A19BF4BF-E22B-49B5-B6E0-918FF6290020', '1A778E3F-0A8E-E111-84A3-00155D054C03', 'Прогнозирование');
 
INSERT INTO SysModuleEditLcz (RecordId, ColumnUId, SysCultureId, Value)
VALUES (@SysModuleEditId, 'A19BF4BF-E22B-49B5-B6E0-918FF6290020', '1A778E3F-0A8E-E111-84A3-00155D054C03', 'Прогнозирование');

скопировал коды страниц, получил следующую ошибку (прикреплена в файле), подобное уже встречалось, вспомню как исправлял отпишусь дальше

Ошибку исправил, немного поправили код страниц, в итоге раздел открывается но страницы не подгружается которая должна отрисовывать содержимое раздела. Скриншот в прикрепленном файле. В консоле браузера никаких ошибок не выдает

P.S. забыл добавить, вручную добавил запись в SxForecastItem чтобы проверить правильно ли идет запрос, чтобы вытягивало его во вкладки, на скриншоте его видно, вроде запрос отрабатывает нормально. Также почему то подтягиваются базовые схемы ForecastTab, ForecastModule, ForecastBuilder

Олег добрый день!!!

при удачном клонировании раздела Планирования, у вас в правом углу должна быть шестеренка с выпадающем меню. Как на картинке, что показана ниже.

Нажав на "Шестеренка"-->Добавить, у вас должна открыться страница редактирования "Элемента планирования", с возможностью добавления Измерения, Периода, Названия. Данная страница открывается? Шестеренка, как на картинке есть в Правом верхнем углу? Я уже удалил конечно свой клонированный раздел, но на выходных ради эксперимента выполнял клонирование, данного раздела, у меня все прошло без ошибок.

По скриптам регистрации страниц. Здесь ошибок не вижу, все верно.

Михаил, шестеренка есть, но добавление заблокировано, доступно только "Настроить права доступа"

Олег день добрый!!!

посмотрите пожалуйста в дебаггере консоли браузера в функции "checkForecastCanEditRights" схемы "ForecastTab" (это старое название схемы), новое не знаю как у вас называется. Установите точку останова, и посмотрите что в строчке  this.set("AddButtonEnabled", Ext.isEmpty(result)); присваивается. Вот вам отправная точка поиска. Так как "Доступность" пунктов меню "Добавить", "Изменить", "Удалить" регулируется программно.

Добрый день Михаил, как оказалось модуль SxForecastTab (который должен был запускаться вместо ForecastTab) даже не запускается, т.е. не заходит в его метод init

Вместо этого упорно запускается стандартный ForecastTab, подтягивая за собой все остальные стандартные модули вроде ForecastModule, ForecastBuilder

P.S.

"Власов Михаил Викторович" написал:

в функции "checkForecastCanEditRights" схемы "ForecastTab" (это старое название схемы), новое не знаю как у вас называется. Установите точку останова, и посмотрите что в строчке this.set("AddButtonEnabled", Ext.isEmpty(result)); присваивается


Это значение отвечает за кнопку добавить на странице планирования.
1
В том меню за enable отвечает следующий код в ForecastBuilder'е

"enabled": {
    "bindTo": "ForecastRightLevel",
    "bindConfig": {"converter": "isSchemaCanAppendRightConverter"}
}

Здравствуйте, Олег!

У Вас на скриншоте написано в адресной строке – ForecastsModule
А значит, по нажатию в левом меню вызывается именно он, а не Ваш модуль.
Вызываемый модуль можно посмотреть в консоли, Terrasoft.configuration.ModuleStructure

Добрый день, Юрий,
Простите на каком из моих скриншотов вы смогли адресную строку найти? Вообще в последнем сообщение действительно стандартное планирование, чтобы показать кнопку и это не относилось к общему вопросу.

Оказалось что не заменил имя в методе LoadModule на свое, поэтому и тянуло стандартные схемы, заменил на свое и появилась следующая ошибка, видимо Module вызывается почему то дважды
1

Вероятная причина данной ошибки заключается в том, что sandbox не корректно загрузил модуль. Скорее всего, дело в том, как
Генерируются идентификаторы для модулей. Вам необходимо выполнить отладку клиентского кода.
http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/ClientCode…

Доброго времени суток. У меня аналогичная задача - скопировать раздел планирование.
Проблема следующая: раздел отображается, но не отображаются созданные записи. При загрузке раздела не удается получить структуру схемы ForecastTab (в SchemaBuilderV2 в методе requireAllSchemaHierarchy getSchemaStructure возвращает undefined). Код схемы скопирован с базовой.

Олег день добрый!!!

подскажите пожалуйста по вашему последнему посту проблема сохранилась? помощь требуется? готов завтра в течение дня вам помочь правильно скопировать раздел.

Добрый день, Михаил.
Да, проблема сохранилась. Есть подозрение, что я неправильно указал зависимости пакета (я уже с таким сталкивался). Завтра попробую, и отпишусь.

Оказалось дело не в связях. Хотя может дело не в ForecastTab (после добавления связей схемы пересоздать нужно, а я пересоздал только ее)
UPD: получилось исправить ошибку получения структуры ForecastTab. Теперь при добавлении записи появляется просто пустая страница. Ошибок в консоли нет.
UPD2: Получилось отрисовать страницу. Дело было в именах контейнеров.

Добрый день Олег!!!

я не знаю с чего вы начали при клонировании и изменении под свои нужды раздела Планирование, я расскажу свой опыт знакомства и клонирование под свои задачи Раздела Планирование. Все началось с постановки задачи. "Требуется создать раздел в котором бы Экономист с легкостью смог бы вести БДДР и БДС при планирование бюджета на предприятие."
конечно для этих целей за основу можно было взять раздел Планирование. Первое что я изучил как устроен раздел планирование, как он работает, какая структура данных задумана компанией Террасофт, требуется или нет переделывать структуру данных под себя, требуется или нет переделывать PivotGrid под себя. На данном этапе я понял, что структура базы данных компанией Террасофт задумана идеально и даже с запасом под разные другие задачи, и ее я сильно изменять не стал. Внес только пару новых полей. Далее что я проанализировал это как работает схема PivotGrid, что она умеет, что она не умеет, какая схема Бралась за основу. И понял что самое главное что не умеет схема PivotGrid это отрабатывать Табуляцию при позиционирование курсора в столбце и переходу к следующей ячейки текущей строки. Мне стало интересно почему же программисты компании Террасофт изначально при создании PivotGrid отключили событие по отработки Табуляции. И понял, что PivotGrid это перевернутый стандартный грид и при нажатии на Табуляцию курсор перемещается вниз по столбцу, а не вправо по строке.
вот именно эту задачу я первую и решил. Вторая проблема, что возникла это отсутствие промежуточных итогов, как к примеру они есть Сводной таблице в экселе. И данную проблему я решил путем доработки PivotGrid, решил так же проблему позиционирование курсора в иерархии и при обновление Grid-a, по умолчанию иерархический список всегда сворачивался и позиция курсора всегда пропадала, так себя ведет стандартный Grid и эту проблему я решил. Вот с чего я начал.
но а дальше я стал просто клонировать все схемы из пакета CoreForecast. Делал это все вручную, сначало выгрузил все схемы, через Экспорт на диск, и в полученных файлах сменил все UID на новые. Выполнял данную операцию посредствам Far Manager-a. При замене UId-дов всегда нужно не забывать что к примеру UID схемы таблицы Forecast пожет встречаться как в виде ссылки в других схемах. Для этого в Фаре я сначало выполнял поиск по файлам *.md, в поле "Содержащий текст" указывал искомый UId. После того как вхождения UID было найдено менял на новый UID.
После замены всех старых UId на новые я выполнил переименование всех выгруженных схем. И только после этого я выполнил Импорт схем обратно в Базу данных. После импорта я вылнил регистрацию требуемых схем в базе данных. Т.е новый раздел "ForecastsModule" зарегистрировал в таблице SysModule, SysModuleLcz. Страницы редактирования зарегистрировал в таблицах SysModuleEdit, SysModuleEditLcz. Провайдер уведомлений зарегистрировал в таблице NotificationProvider. Новую схему "Forecast" зарегистрировал в таблице SysModuleEntity. И все клонированный раздел заработал на 5 с плюсом. Ну конечно пришлось еще изменить много стандартных схем под свою задачу, но самое главное Олег чтобы у вас появилось понимание, что такое Генерация схем, ядром системы, как система это делает. Какая последовательность в генерации происходит. В данном разделе Планирование это очень хорошо прослеживается вся идеалогия MVVM модели, которую компания террасофт заложила как базись в свою систему. Без данного понимания и умения создавать свои Custom схемы с нуля, очень сложно будет создавать новые инструменты.
ведь BasePageV2, BaseSectionV2, BaseDetailV2 это всего лишь стандартные схемы облегчающие создание стандартных страниц, а если требуется создать нестандартую страницу, как раздел Планирование, то здесь нужно четкое понимание MVVM модели и понимание работы ядра системы, какой модуль (схема) за что отвечают при генерации страниц.

И если Олег после прочитанного поста остались все таки вопросы, а я желаю вам помочь создать свою страницу, прошу более подробно описать что и как вы уже сделали, и что конкретно в понимание или коде у вас не получается. спасибо!!!

Спасибо, Михаил. Именно после переноса схем md файлами у меня наконец-то заработала ForecastTab, впредь так и буду поступать. Единственное для замены GUID я использовал не Far Manager, а Sublime. Особых проблем в принципе не возникло. Есть одна мелочь, которую я все еще не знаю как решить - я добавил новую колонку, и ее Caption длиннее других, и выходит так что он выводится в две строки. Буду благодарен, если подскажете каким образом можно расширить размер колонки, чтоб caption отображался одной строкой (желательно не меняя размер остальных).

Попробуйте переопределить CSS стили для реестра

Разобрался. Ширина задается для каждой колонки отдельно в ForecastTab.

Появилась другая проблема - изменил типы колонок с INTEGER на FLOAT и теперь вручную в поле План нельзя вписать значение - только скопировать.
UPD: спас тип MONEY

Олег сейчас все у вас получилось или есть проблемы?

Была проблема с переключением между вкладками - значение ActiveTab терялось, но с этим я уже разобрался. Сейчас кажется все работает, Михаил. Над данной "новой и интересной задачей" пришлось поломать голову :smile:
Спасибо за участие

Показать все комментарии

Добрый день уважаемые коллеги!!!

вопрос следующий. Есть карточка редактирования. Открываем (не создаем) карточку редактирования из раздела. Во время открытия происходит инициализация меню Действия. При инициализации меню действия, форма еще не отрисована. К примеру в меню Действия есть пункт меню "Выставить счет", при инициализации ,через виртуальную колонку, выставляю доступность пункта меню "Выставить счет" значение "false". Во время работы формы хочу, чтобы при изменении к примеру статуса формы, становилась доступной пункт меню "Выставить счет". но как я только не пробовал, изменяя значение виртуальной колонки на "true", доступным пункт меню у меня так и не стал.

вопрос, как во время редактирования формы управлять доступностью меню "Действие". подскажите пожалуйста.

уже все перепробовал не хочет. помогите пожалуйста. спасибо!!!

Нравится

2 комментария

Михаил, добрый день!

Если Вам необходимо регулировать доступность данного действия только при редактировании записи, попробуйте реализовать метод, определяющий доступность в зависимости от статуса (и возвращающий булевое значение), не в коде карточки редактирования, а в коде раздела. Потом в карточке указать название этого метода в свойстве bindTo элемента меню "Выставить счет".

Возможно, данное поведение выглядит странным, но только на первый взгляд. Если вспомнить, что в режиме редактирования главным на странице является модуль раздела, а модуль карточки редактирования просто подгружается в отдельный контейнер, расположенный в модуле раздела, всё становится на свои места.

Добрый день Олег!!!

спасибо за информацию. Я уже подглядел в код и обнаружил что моя задача уже решалась в системе, а именно при инициализации кнопок "Подписаться на обновление ленты", "Отменить подписку на обновление ленты". Я пошел этим же путем и реализовал все у себя, так же. И да я про это не забыл, что при редактировании Страницы редактирования, главный у нас раздел. Просто, когда уже писал инцидент на форуме, было поздно и голова видимо плохо работала, вот и спросил совета. А сегодня с утра голова выспалась, и сразу все решилось. Спасибо за совет!!!

Показать все комментарии