Технические вопросы
7.x

Добрый день.

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

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 комментарий

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

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

Показать все комментарии
пароль
сложность
7.x

Добрый день!
7.6
Скажите, пожалуйста, можно ли где-то настроить сложность пароля?
Необходимо, чтобы пользователи не вводили легкие пароли типа 123, 111 и т.п.

Нравится

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

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

Такая настройка доступна в системе. Для этого используются системные настройки, хранящиеся в папке "Управление паролями":
1) Сложность пароля% (там несколько системных настроек)
2) Срок действия пароля
3) Количество попыток входа и другие

Важно! Данные настройки кэшируются - после внесения изменений необходимо очистить Redis командой flushall.

Спасибо

Показать все комментарии
7.6
PivotGrid
планирование
Технические вопросы
7.x

Добрый день,
Необходимо сделать раздел аналогичный разделу планирования, для начала сделал копию раздела, в 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:
Спасибо за участие

Показать все комментарии
карточка редактирования
Меню Действие
Технические вопросы
7.x

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

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

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

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

Нравится

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

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

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

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

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

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

Показать все комментарии
javascript
Технические вопросы
7.x

В 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, и будет у вас поле с возможностью открыть форму выбора.

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

Показать все комментарии
объект
справочника
7.x

Доброго времени суток!
Надо на карточке раздела создать выпадающий список(пиклист).
Как я понял для этого надо создать справочник. Пытаюсь это сделать, но про создании справочника надо указать объект. Как его создать?

Нравится

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

Виктор,

Вы можете выполнить добавление справочного поля в виде выпадающего списка с помощью мастера раздела:

http://academy.terrasoft.ru/documents/docs/product/bpm'online%20sales/omnichannel/7.6.0/BPMonlineHelp/chapter_section_wizard/section_wizard_page_fields_setup.htm

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

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

как вы желаете создать справочник, вручную или с помощью мастера-разделов? под словом "вручную " я подразумевал создание страниц раздела, справочника, деталей с помощью Админской части BPMOnline.
если с помощью мастера разделов, то вот ссылка на академию

Мастер-раздела

как вы желаете это сделать, поясните пожалуйста? спасибо!!!

Тo есть, что бы создать список со значениями:
Рука
Нога
Голова
Глаз

Мне надо создавать отдельный раздел и делать так что бы он не отображался с левой стороны для юзера?

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

А потом внесите(зарегистрируйте) этот справочник в разделе Справочники, и наполните значениями

Виктор, если вы желаете создать просто справочник с константными значениями, то вам достаточно средствами Админки, создать схему таблицы (Объекта). При создании схемы Объекта, присваиваем Имя объекта,в поле "Родительский объект" выбираем "Базовый справочник", Сохраняем и публикуем схему Объекта. После переходим "Дизайнер системы" --> "Справочники". Регистрируем созданный справочник, для этого в разделе Справочники нажимаем кнопку "Добавить справочник", в поле "Объект" выбираем нашу схему созданного Объекта, присваиваем справочнику Название и Сохраняем. После сохранения позиционируем курсор на созданном справочнике и жмем кнопку "Открыть наполнение". Выполняем наполнение созданного справочника. А уже далее если вам требуется отобразить созданный справочник на странице редактирования, в виде поля, пользуемся Мастером раздела.

Можно и так как посоветовала Дарья. Я рассказал ручной способ создания справочника. :smile: Мне так привычнее и удобнее.

Михаил, как разработчик мне так будет проще. Будем пробывать! Спасибо!!

Доброго времени суток!
Дабы не плодить новые темы задам вопрос тут.
Есть стандартный справочник Контакты. Мне надо создать его копию, но только так что бы в нем показывались только Контакты с нужным типом записи. Вопрос как добавить данный фильтр?

"Сенько Виктор" написал:Вопрос как добавить данный фильтр?

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

фильтр пользовательский или на уровне кода?

Я думаю в данном случае код не нужен. Но если надо так надо)
Просто я немного в шоке как сложно в данной crm сделать некоторые простые вещи)

Виктор, платформа BPMOnline разработана и продумана на самом высочайшем уровне. Программировать на платформе BPMOnline одно удовольствие. можно интегрировать новые инструменты сторонних разработчиков, можно создавать свои инструменты, никто вас Виктор в этом не ограничивает. Движок платформы развивается от версии к версии. SDK растет, SDK и инструменты внутри платформу конкуренты на рынке IT. BPMOnline уже заняла и занимает лучшие похвалы в Мире, и отмечена уже не одним изданием.

Ну не просто так мы переходим на данную crm.
Но вопрос открыт. Что делать?

Здравствуйте, Виктор!

Два варианта:
1) Создать объект в конфигурации. При этом в поле родительский объект Вам необходимо указать "Базовый объект". Далее Вы добавляете нужные колонки и публикуете объект.

При этом создается таблица в БД.
Далее, Вы регистрируете справочник, указывая созданный Вами объект.

2) В мастере разделов добавить новое справочное поле, выбрать вид отображения - выбор из списка, выбрать "Новый справочник", задать название и заголовок новому справочнику (с этих данных будет создан объект) (*).
Сохраните внесенные изменения, перейдите в справочники и зарегистрируйте справочник по заголовку объекта, который Вы указали в шаге (*).

я еще раз Виктор с вашего позволения продублирую свой вопрос:

Какой фильтр вам привести в пример, как создавать, пользовательский или на уровне кода?

"Сенько Виктор" написал:Есть стандартный справочник Контакты. Мне надо создать его копию, но только так что бы в нем показывались только Контакты с нужным типом записи.

Что по данному вопросу вам посоветовать, подсказать, какими примерами поделиться?

Буду очень рад если вы приведете пример для двух способов. Вчера Вы мне хорошо помогли.

Первый способ Виктор пользовательский:

в первую очередь советую ознакомиться с Хелпом, "Как работать с фильтрами в разделах." Вот ссылка: Работа с фильтрами, Настройка фильтров.

после прочтения Хелпа можно приступать к созданию динамических Фильтров.
Для этого:
1. Открываем раздел "Контакты"
2. Открываем левую панель по работе в Фильтрами. Для этого в выпадающем меню "Фильтр", выбираем пункт меню "Показать группы"
3. Добавляем Динамическую группу. Для этого, на левой панель Фильтры, в выпадающем меню "Добавить группу", выбираем "Динамическую". Присваиваем имя и начинаем выполнять настройку Динамического фильтра.
4. Настраиваем фильтры, для этого нажимаем "Добавить условия", в появившемся окне выбираем колонку "Тип" = "Клиент". Как приведено на картинке ниже.

5. Сохраняем и Применяем созданных динамический фильтр.

Вот так последовательно можно Создавать динамические фильтры.
Рекомендую уже ознакомиться с преднастроенными динамическими фильтрами, что идут в поставке системы. Чтобы иметь предстваление какие простые или сложные условия можно создавать и использовать в работе.

Эм... Мне не надо фильтр в самом разделе.
Мне надо сделать так, что бы в данном диалоговом окне можно было выбрать только те Контакты, у которых Тип записи допустим Клиент. И только клиент. Выбор каких то любых контактов запрещен.

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

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

Нет не создавал. Но все еще впереди. Так что буду благодарен за инфу

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

прежде чем приступать к разработка на платформе BPMOnline 7.6 рекомендую ознакомиться с документацией по платформе. Вот ссылка на SDK по платформе BPMOnline 7.6: SDK BPMOnline 7.6

по вашей задачи вот ссылки на документацию.
1. как выполнить замещение схемы: Как создать замещающую схему страницы или раздела
2. применение фильтров к справочным полям: Добавление правила [FILTRATION] на страницу редактирования, Применение фильтров к справочным полям, Настройка полей страницы редактирования с помощью бизнес-правил

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

Показать все комментарии
e-mail
шаблон
Технические вопросы
7.x

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

Как запускать маршрут с определенной периодичностью понятно
Кол-во обращений в группе считать с помощью сценария на 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" вы желаете использовать Евгений, данное решение вы уже принимаете сами. Перед описанием реквизитов страницы.

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

Добрый день!
7.6
Есть теги (новая функциональность 7.6) - личные, корпоративные, публичные, можно установить их, искать по ним в тегах и прочее.

А есть еще поле такое "Теги" в фильтрах

Они никак не связаны? Какую роль тогда играет это поле?
По тегам нельзя настроить папку фильтрации?

Нравится

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

По тэгам можно настроить папку - для этого в расширенном фильтре "провалитесь" по "+" в связанные объекты, там будет "Тег в записи раздела база знаний (по колонке Объект)". Выбираете его и "Количество". "Количество" меняете на "Существует", ну а дальше само значение тэга из справочника в подчиненном фильтре. Картинку того, что получится, прикрепил

тэг

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

В данном случае «Теги» в разделе «База знаний» это текстовая колонка, которая «перекочевала» еще с первых версий 7.х. В других разделах данной колонки нет.
До версии 7.6 использовалась именно эта колонка для быстрой фильтрации.

Также по умолчанию в версии 7.6 колонка «Теги» не отображается. Для фильтрации по данной колонки Вам необходимо вывести ее через мастер раздела и заполнять необходимыми значения (Рис. 1-2).


Рис. 1


Рис. 2

Спасибо

Показать все комментарии
Технические вопросы
7.x

Добрый день!

Подскажите, возможно ли использование 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-сервер, публикуете его в "мир" и указываете путь к нему в системе.

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

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