В BPMonline 7.6 Bank Sales в модуле страницы нужно сделать lookup-поле по справочнику "Страна" (Country) Я определяю lookup-поле следующим образом. В секции attributes пишу:

"Country": {
        name: "Country",
        caption: "Страна",
        dataValueType: Terrasoft.DataValueType.LOOKUP
}

В секции diff пишу:
{
        "operation": "insert",
        "parentName": "Header", // Здесь по-моему правильно.
        "propertyName": "items",
        "name": "Country",
        "values": {
                            "bindTo": "Country",
                            "layout": { "column": 1, "row": 1, "colSpan": 12 },
                            "caption": { "bindTo": "Resources.Strings.CountryFieldCaption" },
                            "contentType": Terrasoft.ContentType.ENUM,
                            "enabled": true
                      }
}

Опытному человеку такой код может показаться безграмотным. Но я до сегодняшнего дня не занимался описанием lookup-полей на javascript в модулях страниц. При запуске процесса, визуализирующего страницу, которая содержит это lookup-поле, в окне консоли отладчика браузера выводится следующая ошибка: Uncaught TypeError: Cannot set property 'resources' of undefined в строке 227 в модуле SchemaBuilderV2.js . Когда я перехожу к этому месту, то там в коде:
function(next) {
      this.getSchemaResources(schemaName, function(resources) {
             schema.resources = resources;
             next();
      }, this, isParent);
}

строка schema.resources = resources; подчёркнута красным - знак ошибки. Модуль SchemaBuilderV2.js - это, разумеется, не мой, а библиотечный - разработки Terrasoft. Мой, в котором я пытаюсь определить lookup, называется по другому. Напишите, пожалуйста, что мне нужно поправить в моём коде описания lookup-поля для того, чтобы это lookup-поле заработало?

Нравится

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

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

на странице редактирования, через Админку, вы создали Локализированную строку? в коде "Resources.Strings.CountryFieldCaption" данная строка, при выполнения биндинга, ищет Локализированную строку, и если не находит, выдет ошибку. Ключ "caption" нужно использовать если к примеру в схеме таблицы поле названо "Страна", а вы желаете его назвать по иному. в секцию "attributes" необязательно добавлять и описывать поле, если над данным полем ничего дополнительно не требуется делать, накладывать к примеру фильтры, выбирать из справочника дополнительные поля и т.д.

Евгений, вы не добавили стринг "CountryFieldCaption"

Да, добавил в самом начале перед первой публикацией модуля в раздел LocalizableStrings.

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

Ошибка не пропала. Исходник в текстовом файле ContactPersonInfoModule.txt. Модуль унаследован от Базовой схемы карточки из пакета NUI.

Скриншот открытой страницы "RIBContactPersonsInfoModule" из Админки еще скиньте. Чтобы увидеть глазами ее. Спасибо!!!

Вот она:

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

я просил у вас совсем другое. я просил зайти под правами Администратора "Дизайнер системы" --> "Управление конфигурацией" --> "Конфигурация", открыть на экране замещенную схему "RIBContactPersonsInfoModule", спозиционировать курсор на Локализированной строке "CountryFieldCaption" и сделать скриншот. Далее выложить на форум. Это все требуется сделать в BPMOnline 7.6.

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

Михаил, извините, пожалуйста. "RIBContactPersonsInfoModule" это не замещённый модуль, а один из моих прикладных модулей и в define модуля страницы, о котором мы говорим в этом посте, его название попало случайно. Сейчас я в define поменял это название на то, которое должно быть - "RIBRegistrationAddressByPassportPage" и поле "Страна" начало выводиться. НО выводится оно всё равно не так как мне нужно. Оно выводится, как поле- выпадающий список, в правой части которого присутствует значок "стрелка вниз", а мне нужно, чтобы оно выводилось как поле-выпадающий список, в правой части которого присутствует значок "лупа". Если возможно, то помогите мне разобраться с этим. Буду вам очень благодарен.

Евгений, я вам все верно описал. Если вы желаете иметь поле Выбора, а не выпадающий список, тогда удаляете  "contentType": Terrasoft.ContentType.ENUM, и будет у вас поле с возможностью открыть форму выбора.

Спасибо большое, Михаил. Получилось. Пока вопрос закрыт. Ещё раз благодарю.

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

Добрый день!
Хотела бы создать такой маршрут (запускающийся с определенной периодичностью),
которой бы считал кол-во обращений в группе,
и руководителю группу отправлял бы письмо по шаблону:
"В вашей группе столько-то ( кол-во) обращений"

Как запускать маршрут с определенной периодичностью понятно
Кол-во обращений в группе считать с помощью сценария на C#

А вот как в шаблон передать параметр - "кол-во обращений", и к нему потом в шаблоне обратиться?
Сейчас в шаблон можно только передать идентификатор конкретного обращения.

Можно ли сделать это средствами шаблонов в bpm?

Нравится

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

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

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

Добрый день, Михаил!
Шаблон почтового сообщения

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

вопрос второй какими инструментами инициируете рассылку, или отправку сообщения? где происходит обращение к Шаблону сообщений, на уровне Бизнес-процесса, или на уровне приложения (клиента)? поясните пожалуйста еще данный вопрос. Спасибо!!!

на уровне бизнес-процесса

Вашу задачу Дарья можно решить следующим путем.

Первый способ
1. Редактируете шаблон сообщения. добавляете требуемый параметр, к примеру "#CountGroupCase#.
2. Создаете новое действие процесса, по образу и подобию как схема действия "FillEmailTemplateUserTask".
3. Редактируете "Сценарий" действия процесса. В конце добавляете строчку

UpdateConsts("#CountGroupCase#", GetCountGroupCaseString());

Функцию конечно создаете заранее внутри Нового Действия процесса или Отдельным сервисом.
4. Изменяете существующий бизнес-процесс, удаляете старое действие "Обработать шаблон письма с макросами" и добавляете на процесс новое созданное действие процесса.

Второй способ
Подсмотреть в схему "RegistrationHelper" и создать свои функции по обработке и замещению Шаблона, отправки почты.

Вот такие предложения.

Подскажите, пожалуйста, а где у самого шаблона сообщения можно добавить требуемый параметр?
Шаблон сообщения находится в Справочники-Шаблоны сообщений

Дарья, Шаблоны да находятся Справочники --> Шаблоны e-mail сообщений. Открываете данный справочник, находите требуемый шаблон и редактируете его.

Дарья, просто редактируйте текст сообщения, дополнительных действий вроде бы не требуется...

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

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

Добрый день! как раз хотела написать)

Создала новое действие процесса, по образу и подобию как схема действия "FillEmailTemplateUserTask"
Отредактировала "Сценарий" действия процесса. В конце добавила строчку
UpdateConsts("#CountGroupCase#", "5");
Вместо функции пока константа - для проверки вывода.

Отредактировала шаблон сообщения - добавилатребуемый параметр "#CountGroupCase#.
Вот так вот [#CountGroupCase#]

При формировании письма по шаблону в макрос #CountGroupCase# в итоге ничего не подставляется.
То есть он так и выглядит в результате - [#CountGroupCase#]

Более того, в самом шаблоне есть уже какие-то предустановленные макросы - хотела на них проверить подстановку таких макросов

А они оказываются тоже не работают почему-то.

"Татаровская Дарья" написал:Создала новое действие процесса, по образу и подобию как схема действия "FillEmailTemplateUserTask"

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

а новое действие, что создали на бизнес-процессе разместили, т.е на бизнес-процессе вы должны были удалить старое действие "Обработать шаблон письма с макросами" и добавить свое новой действие на схему бизнес-процесса. После выполнить публикацию бизнес-процесса, и проверить работоспособность. Вы так сделали?

Добрый день!
Да, конечно, делала - процесс работает, письмо по нему отправляется.
Только вот письмо выглядит вот так

т.е. в макрос нужное значение не подставляется

Спасибо Дарья за информацию, сейчас воспроизведу вашу ситуацию на своей Базе данных, проанализирую почему не заполняется и дам вам ответ.

Спасибо. У меня 7.6

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

очень интересный инцидент попался :) У меня все работает, у вас нет. Мистика. Расскажу как я делал.
1. Я создал новое действие процесса FillEmailTemplateUserTask, назвал его MpoFillEmailTemplateUserTask. Имя новому действию присвоил "Обработать шаблон письма с макросами (Customer), чтобы при подборе в Бизнес-процессе можно было быстро найти и не перепутать "Действия".
В конец "сценария" нового действия добавил тестовый код:

UpdateConsts("#CountGroupCase#", "5");

2. Далее я создал Шаблон в котором просто указал один параметр "#CountGroupCase#", Сохранил его. Дал шаблону название.
3. Чтобы воспроизвести все в реальной ситуации, решил клонировать бизнес процессы "SendEmailToCaseContactProcess", "IncidentManagement".
4. в первом клонированном бизнес-процессе "SendEmailToCaseContactProcess", под названием "MpoSendEmailToCaseContactProcess" и именем "Отправка email сообщения контакту обращения (customer)", я удалил элемент бизнес процесс "FillEmailUserTask" и добавил свое
"пользовательское действие процесса", под названием "Обработать шаблон письма с макросами (Customer)", Входящие параметры действия - RecordId, TemplateId, SysEntitySchemaId, заполнил как было в исходном процессе. Соединил связи между элементами процесса и опубликовал его.
5. во втором клонированном бизнес-процессе "IncidentManagement" , под названием "Процесс управления инцидентами (customer), у элемента процесса "SubProcess4", я изменил связь подпроцесса с "Отправка email сообщения контакту обращения" на "Отправка email сообщения контакту обращения (customer)". Во входящем параметре "TemplateId" - указал ссылку на свой созданный новый шаблон с единственным параметром. Все сохранил и опубликовал

После я исполнил новый бизнес-процесс "Процесс управления инцидентами (customer)" дошел до момента отправки уведомления, и посмотрел что мне придет на почту. Пришло письмо с цифрой "5" в теле письма.

Вот теперь думаю чтобы уже голову не ломать. Поделитесь своими бизнес-процессами Дарья. Я их из MD файлов загружу себе и попробую через дебаггер найти где спотыкается бизнес-процесс и из-за чего у вас не происходит замена параметра.

Добрый день!
Да, конечно
Во вложении - действие и процесс.

Скажите, пожалуйста, а какая у вас версия bpm?
У вас отрабатывают в шаблоне вот такие вот предустановленные макросы(которые в шаблонах предлагаются во всех)

У меня Дарья как у мамонта :smile: старая версия ITIL еще первую 7.6 когда раздавали, я ее скачал и после этого не обновлял. Недавно запрашивал актуальные версии, вот обновлюсь сегодня и уже завтра с утра, посмотрю на ваши процессы. Сегодня я просто физически не осилю. Очень много было умственного процесса. Поэтому если терпит до завтра, то посмотрю на ваши процессы обязательно с самого утра.

да, конечно, спасибо вам

Добрый день, Михаил!
Подскажите, пожалуйста, у вас тоже не отображается макрос из шаблона или отображается?

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

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

Добрый день.
Скажите, пожалуйста, как в BPMonline 7.6 Bank Sales в модуле страницы на Javascript описать:
1) Поле, представляющее выпадающий список, в правом краю которого изображён значок лупы, при щелчке по которому открывается список значений. Такое поле, как я понимаю, является полем справочного типа. Именно в моём случае, оно должно показывать содержимое справочника стран (этот справочник в системе называется, по-моему, Country - Страна).
2) Поле, представляющее выпадающий список, в правом краю которого изображена стрелочка вниз.
Дайте, пожалуйста, код, с помощью которого такие поля определяется в модуле страницы. Или ссылку на хорошие примеры.

Нравится

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

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

чтобы в LookupEdit поле настроить вид выбадающего списка требуется в "values:" добавить следующее: "contentType": Terrasoft.ContentType.ENUM," вот пример:

                {
                    "operation": "insert",
                    "parentName": "GeneralInfoLeft_OurSide",
                    "propertyName": "items",
                    "name": "UpoSupplierBillingInfo",
                    "values": {
                        "bindTo": "UpoSupplierBillingInfo",
                        "layout": { "column": 12, "row": 1, "colSpan": 12 },
                        "caption": { "bindTo": "Resources.Strings.SupplierBillingInfoCaption" },
                        "contentType": Terrasoft.ContentType.ENUM,
                        "enabled": { "bindTo": "IsLifeCycleRegistration" }
                    }
                },

Спасибо большое, Михаил. Попробую применить. Lookup (кстати в Delphi этот механизм был очень удобен) - это как я понимаю, когда справа изображён значок лупы. А вот привязка

"enabled": { "bindTo": "IsLifeCycleRegistration" }

её обязательно надо указывать? Или можно просто указать:

"enabled": true

или

"enabled": false

?

Евгений я вам привел как пример. если требуется Запретить редактирование или разрешить, указываете "enabled":. Если требуется запретить без условий, то можно указать "enabled": false. Если требуется указаний условий, тогда уже указываем ссылку на Функцию. А какие Теги (ключи) в "values" вы желаете использовать Евгений, данное решение вы уже принимаете сами. Перед описанием реквизитов страницы.

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

Здравствуйте!

Возникла необходимость реализовать ТС в терминале, версия - 3.4.0.142.
сделал rdp-файл, Террасофт в терминале заработал, НО - появилась проблема -
при открытии файлов из Библиотеки, например Word - пытается открыть файл, но
в итоге выводит сообщение об ошибке:

"Компонент недоступен. За дополнительными сведениями обращайтесь к системному администратору".

запустил файл: TSMSOfficeConfig, поставил галочки напротив - Word, Excell, также пробовал копать
в сторону прав доступа - создавал пользователей с именем аналогичным учетке в ТС и разрешал
доступ к папке: С:\users\user-1. Не помогло.

Как можно это исправить?

Нравится

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

Проблема как мне кажется не в TS, а в установленном офисе - система сообщает что компонент офиса недоступен. У вас эти файлы там же на терминале под той же учеткой Word нормально сам по себе открывает?

"VLAD_admin" написал:запустил файл: TSMSOfficeConfig, поставил галочки напротив - Word, Excell,

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

после того как поставили Галочки. Запустите к примеру Word и посмотрите дополнительная панель Террасофта появилась на экране. Если нет, то это как раз говорит о том, что модули (DLL) Террасофта не зарегистрировались в ворде и экселе. Я бы попробовал вручную зарегистрировать данные компоненты.

второй вопрос, а ранее у вас все работало? если да, то что делали на терминальном сервере, после чего перестало работать.

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

Добрый день!

Подскажите, возможно ли использование SVN для разработки на платформе on-demand? И если да, то как настроить интеграцию bpm'online on-demand с SVN сервером (не нашел пункт меню для редактирования списка SVN хранилищ, аналогичный on-site продуктам)?

Нравится

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

Здравствуйте.
По умолчанию для сайтов на On-Demand возможность использования SVN не активирована. Для настройки SVN Вам нужно сформировать соответствующий запрос. В конфигурационном файле web.config, будет включена опция "UseSvn". Далее Вы устанавливаете SVN-сервер, публикуете его в "мир" и указываете путь к нему в системе.

Здравствуйте.
По умолчанию для сайтов на On-Demand возможность использования SVN не активирована. Для настройки SVN Вам нужно сформировать соответствующий запрос. В конфигурационном файле web.config, будет включена опция "UseSvn". Далее Вы устанавливаете SVN-сервер, публикуете его в "мир" и указываете путь к нему в системе.

Понял. Спасибо :)

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

В BPMonline 7.6, в каждой записи детали, замещающей BaseCommunicationDetail, справа от поля ввода средства связи (например поля ввода телефонного номера или адреса e-mail) нужно выводить галочку (checkbox) с подписью "Основной". Не получается. При попытке добавить запись в деталь "Средства связи" на странице "Юр. лицо", в консоли отладчика браузера выводится сообщение об ошибке; "Uncaught TypeError: Cannot read property 'changeMethod' of undefined" в модуле all-combined.js в строке 291. Я посмотрел по этому исходнику, там внутри функции setControlPropertyValue проверяется if(a.config.changeMethod) и на этом месте ошибка. Ниже привожу код, который я добавил в функцию getItemViewConfig() для вывода checkbox'а в модуле, замещающем BaseCommunicationDetail из пакета NUI. Замещающий модуль имеет то же имя - BaseCommunicationDetail и находится в пакете Custom.

var checkboxConfig = {
        className: "Terrasoft.CheckBoxEdit",
        classes: {wrapClass: ["communication-lookup-img-user-class", "detail-edit-user-class"]},
        value: {
                        bindTo: "RIBIsBase",
                        bindConfig: {converter: "updateLinkUrl"}
        },
        href: {
                        bindTo: "Link"
        },
        linkclick: {bindTo: "onLinkClick"}
};

Этот код я ввёл сразу после кода для отображения элемента TextEdit, который представляет поле для ввода средства связи. Ниже привожу строки кода, включающего эти элементы в конфигурацию, Эти строки завершают тело функции getItemViewConfig().
config.items.push(typeButtonConfig, editConfig, checkboxConfig, iconTypeButtonConfig);
itemConfig.config = config;
this.set("itemViewConfig", config);
На заметку: Когда я переносил зависимости замещаемого модуля в замещающий, то зависимость "Средства связи контакта" в замещаемом модуле была из пакета Base, а в замещающем - из пакета Base эта зависимость не подцепилась и пришлось взять её из пакета NUI. Других отличий нет.
Что нужно сделать, для того, чтобы checkbox выводился как описано выше ?

С уважением.

Нравится

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

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

я еще вчера хотел вам отписать в вашем предыдущем посте. Но раз вы уже создали новый, пишу здесь. Ранее вы говорили что поле CheckBox вы желаете использовать для понимания какой телефон основной а какой нет, какой емайл основной а какой нет. Я так и не начал воплощать в жизнь вашу идею, так как при разработки и использовании системы в первую очередь нужно по максимому использовать стандартный функционал системы, а вот если уже невозможно обойтись стандартными средствами, вести разработку. Вашу идею на детали "Средства связи контрагента или контакта" можно воплотить расширив список типов "Тип средства связи", схема таблицы "CommunicationType", по умолчанию уже есть тип "Основной телефон" предлагаю вам добавить к примеру тип "Основной e-mail" и уже если вам нужно через Запрос получить основной телефон контрагента то вы с легкостью это сделаете. Так как "Тип средства связи" пользователь редактировать не может и следовательно это константные величины.

не придумывайте сейчас сложных путей, идите по легкому пути.

Здравствуйте, Михаил.
Спасибо за ценный комментарий.

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

P.S. И я делаю его на замещённой детали "Базовая схема детали средств связи", а не на детали "Средства связи контрагента и контакта". И, кстати, где можно посмотреть определение класса CheckBoxEdit?

Форумчане, помогите, пожалуйста!

"Бузин Евгений" написал:И, кстати, где можно посмотреть определение класса CheckBoxEdit?

Путь для конфигурации BPMOnline - OnSite (мой пример)
C:\BPMOnlineOmniChannel7_6_0.Site\Terrasoft.WebApp\Resources\ui\Terrasoft\controls\checkboxedit

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

Благодарю, Михаил. Буду ждать.

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

Добрый день.
Переношу доработки на базу клиента средствами SVN (перенос рабочей копии).
после этого приходится открвать каждый объект (созданый или замещённый) и публиковать его.
Это довольно затратно по времени
Каким образом можно опубликовать сразу все нужные объекты?

Нравится

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

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

Если вы переносите свои доработки средствами SVN, то после загрузки из Хранилища в первую очередь нужно выполнить "Структура БД --> Обновить для требующих обновления", далее "Данные --> Установить для требующих установки", а уже после желательно вручную исполнить все SQL скрипты, чтобы видеть что вы исполняете. И когда все сделано достаточно нажать "Конфигурация --> Компилировать все" и ваша новая конфигурация будет собрана.
Так как не забываем о том, что при переходе к примеру с 7.4 на 7.5, изменилась структура пакетов и их зависимости друг от друга. Некоторые схемы перемещены в новые пакеты. И вам обязательно нужно проконтролировать, а все ли зависимости в ваших доработках видят требуемые схемы.
А вообще мой совет вам Игорь прежде чем загружать из SVN свои доработки нужно изучить структуру новой конфигурации. Проанализировать как и где хранятся замещаемые схемы. Чтобы после загрузки в новую конфигурацию вы уже будете знать, куда перенести схемы с доработками, какие новые пакеты создать и т.д. Просто на загрузить надеется не нужно.

Спасибо. В данном случае пернос доработок производится в рамках одного билда.

Ещё один вопрос есть/планируется ли механизм переноса пакетов между разными версиями BPMOnline, например, между 7.4 и 7.5?
Я столкнулся с тем, что разработка велась на 7.4, но после этого потребовалось обновление до 7.5.
Но в базовых пакетах 7.5 отсутствует ряд схем, которые были в 7.4 и замещались в рамках разработки.

Подскажите пример какие схемы или лучше набора схем которые были в 7.4 и в 7.5 их не оказалось. Я посмотрю у себя. Проанализирую и скажу куда данный функционал перенесли или от него отказались из-за ненадобности или появления нового функционала.

"Власов Михаил Викторович" написал:Если вы переносите свои доработки средствами SVN, то после загрузки из Хранилища в первую очередь нужно выполнить "Структура БД --> Обновить для требующих обновления", далее "Данные --> Установить для требующих установки", а уже после желательно вручную исполнить все SQL скрипты, чтобы видеть что вы исполняете. И когда все сделано достаточно нажать "Конфигурация --> Компилировать все" и ваша новая конфигурация будет собрана.

Не помогло. В новой конфигурации был создан замещающий объект Contaract. После описаных действий при создании новой записи выдало ошибку Invalid column name на всех новых полей.

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

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

Подскажите пример какие схемы или лучше набора схем которые были в 7.4 и в 7.5 их не оказалось. Я посмотрю у себя. Проанализирую и скажу куда данный функционал перенесли или от него отказались из-за ненадобности или появления нового функционала.


ActPageV2, CorrespondencePagev2

"Коновалов Игорь" написал:ActPageV2, CorrespondencePagev2

Игорь как я и писал ранее, прежде чем обновляться нужно изучить до конца новую конфигурацию. А уже после обновляться. Данные схемы что вы описали были удалены. Так как раздел Документы что был в 7.4 в 7.5 претерпел изменения. И в результате появилось 2 раздела Договора и Документы. К примеру у меня было много доработок связанных с разделом Документы в 7.4. Чтобы не потерять ничего, я перед переносом просто клонировал все схемы и создал свой раздел Документы. И далее его переименовал просто в свой раздел и далее стал его развивать (это уже после переноса). Поэтому еще раз повторюсь нужно сначала изучить новую конфигурацию, подготовить старую конфигурацию к переносу. И далее выполнять перенос через SVN.

"Безродный Андрей" написал:каждый объект необходимо публиковать отдельно для обновления структуры каждого из них в базе данных.

Андрей сколько уже с обновлением кошек и собак съел, но отдельно объекты не публиковал никогда (после переноса). Всегда если это таблицы Или обновлял командой "Обновить для требующих обновления", или выделял просто таблицы удерживая Ctrl и "Обновлял выделенные" и все проходило на отлично без всяких траблов. Да так как это было создание впервые к примеру на 7.5. Ну да подольше ждал пока создадутся все таблицы.

И данный совет мне давали в технической поддержки. Даже переписку могу найти если требуется.

Михаил, да, Вы правы.

Но не касательно команды "Обновить для требующих обновления" - данная команда актуальна для объектов, для которых таблица в базе данных отсутствует в принципе. Если у объекта обновилась структура, но таблица в базе уже создана, действие не должно сработать.

Второй вариант с множественным выбором объектов и "обновлением выделенных" в этом случае должен помочь.

"Безродный Андрей" написал: Если у объекта обновилась структура, но таблица в базе уже создана, действие не должно сработать.

Действие в настоящий момент работает. И пожалуйста не нужно его убирать :smile: Выделять вручную тоже достаточно сложно и много времени занимает. А так все отлично, движемся в правильном направлении, в отличном настроение!!! Спасибо Андрей!!!

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

Здравствуйте!
Подскажите пожалуйста, возможно ли сделать поле комментарий при отклонении визы обязательным?

Нравится

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

Александр, здравствуйте!

Проконсультировался с Product Owner'ом продукта.
К сожалению изменение данного функционала невозможно выполнить пользовательски.

Мы зарегистрировали Ваше обращение для реализации в будущих версиях продукта.

Спасибо!

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

предлагаю вам вариант решения вашей проблемы. Для решения вашего вопроса требуется выполнить замещения схемы VisaHelper. В данной схеме требуется заместить Три функции. Ниже привожу листинг данных функций.

        function baseAction(caption, buttonCaption, entity, action, callback, scope) {
            var checkRightCallback = function() {
                Terrasoft.utils.inputBox(caption, function(result, arg) {
                        if (result === Terrasoft.MessageBoxButtons.YES.returnCode) {
                            var comment = prepareComment(arg.name.value);
                            action.apply(scope || this, [entity, comment, callback]);
                        }
                    }, [{
                        className: 'Terrasoft.Button',
                        caption: buttonCaption,
                        returnCode: 'yes'
                    }, 'cancel'], this,
                    {
                        name: {
                            dataValueType: Terrasoft.DataValueType.TEXT,
                            caption: resources.localizableStrings.UpoComments,
                            customConfig: {
                                className: 'Terrasoft.MemoEdit',
                                height: '77px'
                            },
                            isRequired: true
                        }
                    },
                    {
                        defaultButton: 0,
                        style:  {
                            borderStyle: 'ts-messagebox-border-style-blue ts-messagebox-border-no-header',
                            buttonStyle: 'blue'
                        }
                    }
                );
            };
        function reject(entity, comment, callback) {
            if (Ext.isEmpty(comment)) {
                this.showInformationDialog(resources.localizableStrings.UpoCommentsIsEmptyError);
                return;
            }
            setStatus(entity, rejectStatus, comment, callback, this);
        }
        function approve(entity, comment, callback) {
            if (Ext.isEmpty(comment)) {
                this.showInformationDialog(resources.localizableStrings.UpoCommentsIsEmptyError);
                return;
            }
            setStatus(entity, approveStatus, comment, callback, this);
        }

Во вложении прилагаю MD файл замещенной схемы VisaHelper

Михаил, спасибо, очень помогли.

Михаил, а возможно сделать так, чтобы окно визирования не закрывалось при подтверждении или отклонении визы?

Александр, судя по
this.methods.approve = function() {
VisaHelper.approveAction(this, this.onSaved, this);
};
в VisaPage, попробуйте перекрыть метод onSaved, не вызывая callParent

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

Коллеги, подскажите, как устранить проблему.
Есть 3 кнопки в AcccountSectionV2. Каждая из них вызывает свой бизнес-процесс, первым элементом в которых стоит открытие страницы редактирования (новой Активности, Счёта или Заказа соответственно). Проблема заключается в том, что после нажатия Отмена на странице редактирования (к примеру, страницы редактирования Счёта) все кнопки в карточке контрагента перестают реагировать на нажатия. По журналу бизнес-процессов видно, что привязанные к кнопкам бизнес-процессы не запускаются, т.е. не отрабатывается код кнопок. Он начинает работать, только если обновить страницу.
Часть кода, создающая кнопки:

{
                                "operation": "insert",
                                "parentName": "CombinedModeActionButtonsCardLeftContainer",
                                "propertyName": "items",
                                "name": "MakeInvoiceButton",
                                "values": {
                                        itemType: Terrasoft.ViewItemType.BUTTON,
                                        caption: "+ Счёт",
                                        style: Terrasoft.controls.ButtonEnums.style.BLUE,
                                        click: {bindTo: "onMakeInvoiceButtonClick"},
                                        "layout": {
                                                "column": 1,
                                                "row": 6,
                                                "colSpan": 1
                                        }
                                }
                        }

Часть кода - запуск привязанного бизнес-процесса:
onMakeInvoiceButtonClick: function() {
                                debugger;
                                var AccountId = this.get("ActiveRow");
                                var processArgs = {
                                        sysProcessName: "UsrOnMakeInvoiceButtonClick",
                                        parameters: {
                                                IncomingAccountId: AccountId
                                        }
                                };
                                ProcessModuleUtilities.executeProcess(processArgs);
                        }

Бизнес-процесс:
Схема

Нравится

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

Антон,

что видно в консоли браузера в момент нажатия на эти кнопки?

P.S. Прикрепите, пожалуйста, скриншот процесса.

в момент вызова нового процесса в браузере видно следующее сообщение:

При выполнении запроса возникла ошибка
статус ответа: 400 (Bad Request)
url запроса: http://crm:82/0/ServiceModel/ProcessEngineService.svc/UsrOnMakeNeedCall…null
метод: POST
данные запроса: {}

Похоже, что после запуска предыдущего при повторном запуске система не передаёт ID Открытой карточки клиента в повторный процесс. Однако - в журнале процессов нет второго запуска процесса.

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

конечно Бизнес-процесс у вас маленький, но если честно цель данного бизнес-процесса непонятно. Что вы хотели данным процессом достичь? Проконтролировать заполнено ли определенное поле и если да, то открыть карточку редактирования счета? Или же вы хотели сначала проконтролировать наполняемость всех полей, и если определенные поля заполнены, открыть на редактирование карточку счета. Если так, то в процессе не хватает действий для проверки. Это первое, а второе когда вы Первый раз запустили процесс, то в Процесс (через входящие параметры) запоминает Id контрагента, и когда вы не заново, а продолжаете процесс, тогда система уже начинает с того места где остановилась и при этом помнит уже все входящие параметры.

Михаил, цель простая - открыть предзаполненную карточку счёта из карточки клиента. В начале процесса проверяю условия - указан ли ID контрагента, по которому нужно открыть счёт, а также чтобы тип этого контрагента был равен "Клиент". В иных случаях счёт нам не нужен.
По сути, это аналог кнопки "Добавить" в детали Счета в карточке контрагента.

Последний Ваш комментарий не понял - я отменил выполнение предыдущего процесса и запускаю новый из той же карточки. Вот новый у меня и не начинается из-за того, что система не передаёт второй раз ID контрагента, карточка которого открыта в настоящий момент

"Антон Кравченко" написал: Вот новый у меня и не начинается из-за того, что система не передаёт второй раз ID контрагента, карточка которого открыта в настоящий момент

Антон вопрос так откуда вы вызываете бизнес-процесс из Раздела или Открытой карточки редактирования. Так как обращение и получение Id контрагента будут разными. Если из раздела, то нужно еще проверить, а не включен ли режим "Выбора нескольких записей" и если да получить массив Id и передать в процесс, если это карточка редактирования то напрямую получить "this.get(this.entitySchema.primaryColumnName)" и все. И еще один совет если в Бизнес-процесс передаются Массив значений, Id и не только то обязательно, прежде чем вызвать процесс, вы добавьте условия проверки на "Существование" и "Заполненность" передаваемых значений а уже после запускайте процесс. И уже на экране у вас уже не будут появляться ошибки, а вы будите видеть, что процесс запустился или нет. И вот если уже не запустился это уже будет означать, что сработал ваш "IF". Я бы так сделал.

Михаил, хорошо, давайте проверим:
1. Код кнопки у меня расположен и в *Page и в *Section. Из Section в процесс передаётся this.get("ActiveRow"), из Page - this.get("ID")
2. Режим "Выбора нескольких записей не включен 100%
3. При проверке открыта карточка контрагента через Section (т.е. слева есть список других контрагентов, а ссылка в браузере выглядит как .../ ... Section ... / UsrAccountType1Page / edit / ID
4. Вы пишете про проверку на существование и заполненность. Чем Вам первое условие в моём процессе не нравится? в нём как раз и проверяю, что переданный ID != Guid.Empty

Я подозреваю, что после запуска процесса система как бы "выходит" из режима, когда выделена одна из записей реестра (т.е. this.get("ActiveRow") возвращает null), а после обновления страницы снова выделяет того контрагента, чья карточка на экране (т.е. this.get("ActiveRow") возвращает ID выделенной записи).
Как можно проверить данное предположение?

"Антон Кравченко" написал:в нём как раз и проверяю, что переданный ID != Guid.Empty

Антон во первых в процесс может, через входящий параметр, передаться значение ("", String.Empty, т.е пустое значение) или передаться значение "undefined". Можно конечно это все проверить на C# в бизнес-процессе, но зачем если это можно сделать на клиенте. На C# нужно будет не забывать про правила конвертации, чтобы синтаксис был правильный. На JavaScript это проще. Это всего лишь моя рекомендация.
Возвращаясь к вашему вопросу хочу сказать, что по умолчанию в конфигурациях BPMOnline есть маленький баг. Но он быстро правиться. Проверяется этот баг очень просто. Открываете карточку редактирования (к примеру Контрагента) из раздела. И на карточке в любом LookupEdit поле выполняете "Выбор из справочника" и при выборе к примеру редактируете выбираемую запись сохраняете и смотрите. Если слева, где список контрагентов, теряется фокус. То тогда да, ваше предположение может быть, что при подачи команды  this.get("ActiveRow") возвращается "null" или "неопределено", то тогда я вам подскажу где этот маленький баг исправить. Я его уже давно обнаружил, еще в 7.3. Проведите эксперимент если фокус потеряется, я вам подскажу как это поправить.

Михаил, фокус не теряется при Вашем способе с LookupEdit, однако в нашей ситуации с кнопками теряется - см. скриншоты

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

выполните замещение схемы GridUtilitiesV2, исправьте Функцию "ensureActiveRowVisible"
ниже приведен исправленный текст функции. Жирным выделена строка, что добавлена.

            /**
             * Прокручивает реестр, чтобы была видна активная строка.
             * @protected
             */
            ensureActiveRowVisible: function() {
                var grid = this.getCurrentGrid();
                var activeRow = this.get("ActiveRow");
                if (grid && activeRow) {
                    var activeRowDom = grid.getDomRow(activeRow);
                    if (activeRowDom && activeRowDom.dom) {
                        // TODO: Добавлена строка по фиксации активной записи реестра
                        grid.setActiveRow(activeRow);
                        var el = activeRowDom.dom;
                        if (el.scrollIntoViewIfNeeded) {
                            el.scrollIntoViewIfNeeded(false);
                        } else {
                            el.scrollIntoView(false);
                        }
                    }
                }
            },

Выполните пожалуйста замещение схемы и проверьте результат. У меня сейчас фокус никогда не теряется. При замещение схемы не забываем копировать не одну функцию а все. Иначе перестанет работать функционал.

Михаил, доброго утра!
Заместил GridUtilitiesV2, полностью скопировал код из замещаемой в замещающую страницу, исправил функцию ensureActiveRowVisible ... и ничего не изменилось - фокус по-прежнему теряется.
P.S. Вы пишете, что жирным выделена добавляемая в функцию ensureActiveRowVisible строка, но в Вашем коде не вижу строки с жирным шрифтом ..

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

воспроизвел вашу ситуацию на своей базе данных. Действительно Фокус теряется и информация о текущей записи теряется. Буду сегодня в отладчике искать, где происходит сбой. Как найду выход из данной ситуацию. Опубликую результат с ответом.

Антон самый быстрый способ который я нашел и советую вам его использовать. Это сохранение ID в профиль пользователя. Вот как я сделал и после отмены или закрытия карточки редактирования (вызванная из процесса) фокус сейчас у меня нормально возвращается. вот листинг. так же замещаем схему GridUtilitiesV2.

            /**
             * Восстановление выделенной записи в реестре.
             */
            onAfterReRender: function() {
                if (this.cachedActiveRow && !this.get("MultiSelect"))  {
                    var gridData = this.getGridData();
                    if (gridData && gridData.contains(this.cachedActiveRow)) {
                        this.set("ActiveRow", this.cachedActiveRow);
                    }
                } else if (!this.cachedActiveRow && !this.get("MultiSelect"))  {
                    var profile = this.getProfile();
                    var activeRow = !Ext.isEmpty(profile.ActiveRow) ? profile.ActiveRow : this.Terrasoft.GUID_EMPTY;
                    if (!Ext.isEmpty(activeRow)) {
                        this.set("ActiveRow", activeRow);
                    }
                }
            },
            /**
             * Событие на изменение значения ActiveRow.
             */
            onActiveRowChange: function() {
                this.cachedActiveRow = this.get("ActiveRow") || this.cachedActiveRow;
                if (!Ext.isEmpty(this.cachedActiveRow)) {
                    var profile = this.getProfile();
                    var key = this.getProfileKey();
                    if (profile && key) {
                        profile.ActiveRow = this.cachedActiveRow;
                        this.Terrasoft.utils.saveUserProfile(key, profile, false);
                    }
                }
            },

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

Михаил, отлично! Ваше решение работает) Спасибо большое

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

а я её (первую доработку) там и оставил )

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

Скажите, пожалуйста, как добавить в деталь ContactCommunicationDetailV2 поле логического типа ? Что для этого нужно написать в этом её модуле ?

Нравится

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

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

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

Михаил, я прошу прощения - надо добавить логическое поле не в ContactCommunicationDetailV2, а в BaseCommunicationDetail из пакета NUI, заместив его своим клиентским модулем. Я уже заместил объект AccountCommunication из пакета Base (и добавил в замещающий объект логическое поле) и теперь разбираю листинг детали BaseCommunicationDetail в часности функцию getItemViewConfig(), формирующую конфигурацию представления элемента средства связи. Мне нужно будет, как я понимаю, заместить BaseCommunicationDetail своим клиентским модулем детали и в замещающем - добавить это логическое поле. А где (в каком месте исходника) и как (с точки зрения мнемоники Javascript) ? Это логическое поле должно визуализироваться в записи детали (в UI) в виде галочки (чекбокса).

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

подскажите пожалуйста в детали средства связи вы данный функционал хотите реализовать, что ниже на картинке?

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

Нужно в каждой записи детали: средство связи и справа от него рядом галочка. Т.е., например: поле ввода номера телефона и рядом справа - галочка. А подпись у галочки - "Основной". Помогите, пожалуйста.

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

вот как вы желаете. Вопрос чтобы вам помочь, реализовать у себя, и поделиться куском кода. К примеру представим в каждом добавляемом поле Будь то "Телефон", "Email" и т.д. появилась данная галочка. Вопрос нажав на нее что должно происходить, какое поведение вы закладываете в данные галочки? Что должно происходить на экране, что должно происходить в Базе данных. Уточните пожалуйста, тогда еще раз повторюсь. Реализую у себя и поделюсь куском кода. Может и мне в моих проектах будет полезно :smile:

Минуту....

Она должна отмечать основное средство связи с контактным лицом. Ведь не зря её подпись - "Основной". Т.е., если выведено несколько средств связи, например, Телефон домашний и Телефон мобильный, то установить её можно только для одного из них. Т.е., она (в установленном состоянии) указывает основное средство связи из имеющихся у данного контактного лица. И галочка - не внутри поля номера телефона или e-mail, а рядом с ним справа от него. А в БД, по сути, соответствующее её логическое поле в записи при её установке изменяет значение с false на true, а при сбросе - обратно.

Михаил, помогите, пожалуйста.

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

Хорошо, спасибо. Я пока создал модуль, замещающий BaseCommunicationDetail.

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