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

мы питаемся в Бизнес процесс добавить подпроцесс, и когда передает только значение Лида, все ок,

но в подпроцессе у нас есть параметр, текстовый, и на него вылетает ошибка:

"Значение не может быть неопределенным. Имя параметра: format"

Пробовали и заполнять этот параметр значением по умолчанию в подпроцессе, и передавать значение с процесса, 

если он присутствует всегда одна и та же ошибка.



Версия: 7.15.4.3055

Прикрепленные файлы

Нравится

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

Уточните, у Вас параметр назвается format или Name? Или это два разных параметра?

Здравствуйте, параметр называется - Name, с названием format у меня ничего нет.

Уверены, что дело именно в этом подпроцессе? Если запускать его из другого процесса, тоже такая ошибка?

Если переименовать Name как-то иначе, то тоже?

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

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

А в логи системы (стандартно в текстовом файле Error.log на веб-сервере) при этом что-то падает? В консоли браузера нет дополнительной информации в момент ошибки?

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

Добрый день, коллеги. Хочу с вами поделиться моими идеями по поводу улучшений функциональности БП.

Привожу список того, что бы мне хотелось иметь в БП.

 

1. Отсутствие возможности комментирования. Необходимость возникает в средних и сложных БП с N > 20, где N - количество элементов в нем. Возникают недостатки: читабельности (неоднозначность в действиях); группировки (чтобы визульно можно было разделить элементы БП по группам).

 

2. Свойство "Последовательное чтение" и "Выборочное чтение" (по умолчанию) в служебной команде "Чтение записи". Позволяет не зависеть от команды изменения записи в рекурсии. Последовательность автоматически формировать по выбранной пользователем сортировке и Id (на данный момент, при дубликатах). Идея в том, что при последовательном чтении скрытно добавляется дополнительный фильтр пользовательской сортировки (больше или равно) и в последнюю очередь Id (больше).

 

3. Отсутствие простого завершающего события. Так как в БП может быть 2 и более потока, то необходимо для каждого из них возвращать свое завершающее событие. На данный момент реализована схема: либо все либо ничего. Т. е. результатом БП является единственный останов. Это мешает рассматривать БП как полноценную систему, умеющую хорошо работать с потоками - отсутствует возможность уничтожить отдельный поток. Например: есть N подпроцессов, которые нужно выполнить либо последовательно либо параллельно и отчитаться по каждому из них. На данный момент в Creatio требуется задействовать внешний объект, файл и т. п., для выполнения этого задания придется отдельно вводить понятия "экземпляр главного процесса" и "результат выполнения". В https://community.terrasoft.ru/questions/id-suschnosti-bp рекомендуют привязывать БП к экземпляру объекта, что не соответствует нашей задаче.

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

Илья, спасибо за пожелания.

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

По второму и третьему завёл.

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

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

Илья, можете ещё раз более подробно описать по второму пункту, что Вам требуется?

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

Добрый день, мне надо. что бы при создании записи в разделе копировались значения и родительской записи, так как полей больше 70

Есть деталь, которая является раделом, т.е на ней отображены отфильтрованные записи раздела

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

Нравится

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

Да, возможно. Сделайте БП, запуск по записи. Читать родительскую запись, далее добавить запись в раздел и открыть страницу на редактирование только что созданной записи. У меня так реализовано добавление доп.соглашения к договору. 

Можно развить дальше и сделать отдельную кнопку для запуска процесса.

Алексей Следь,

мне надо что бы все 100+ полей копировались одной коллекцией, добавлять вручную такое мне не особо по душе

Dima Avdoshin,

Не понял. Один раз настроить в БП элемент добавить данные и все. Все 100+ полей будут копировать автоматически при создании новой записи. Если сложно настроить элемент добавить данные, то можно все сделать добавление данных скриптом в том же процессе. Можно через InsertSelect

Алексей Следь,

InsertSelect не вызвет событийную модель, что не есть хорошо.

Dima Avdoshin,

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

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

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

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

Владислав Литвинчук пишет:

InsertSelect не вызвет событийную модель, что не есть хорошо.

Если проблема только в этом, можно создавать Entity, наполнять её поля и затем вызывать Save. Или, как изначально предложили, средствами стандартных элементов БП для работы с данными.

 

По изначальному вопросу темы:

Вы хотите копировать из одноимённых полей одного объекта в другой?

А то, если просто создать копию записи, то в реестре есть кнопка копирования записи, при нажатии на неё создаётся новая запись с заполненными полями, у которых в объекте включена галка «Копировать данные при копировании записи».

Зверев Александр,

то в реестре есть кнопка копирования записи, при нажатии на неё создаётся новая запись с заполненными полями, у которых в объекте включена галка «Копировать данные при копировании записи».

Да именно это мне нужно, каким образом я могу вызвать ее программно?

Зверев Александр,

можно пример пожалуйста

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

row = dataSource.Rows[0].Clone() as Terrasoft.Core.Entities.Entity;
Guid currentUserContactId = Page.UserConnection.CurrentUser.ContactId;
EntityPrimaryColumnValue = Guid.NewGuid();
row.SetColumnValue(primaryColumnName, EntityPrimaryColumnValue);
row.SetColumnValue("CreatedOn", DateTime.Now);
row.SetColumnValue("CreatedById", currentUserContactId);
row.SetColumnValue("ModifiedOn", DateTime.Now);
row.SetColumnValue("ModifiedById", currentUserContactId);
var columnNames = new List<string>();
foreach (var column in row.Schema.Columns) {
	if (column.HasDefValue && 
		((column.IsLookupType || column.IsMultiLookupType) &&
		column.ReferenceSchema.PrimaryDisplayColumn != null) &&
		!columnNames.Contains(column.Name)) {
		columnNames.Add(column.Name);
	}
}
row.LoadLookupDisplayValues(columnNames);
dataSource.Insert(row);

У объекта Entity есть метод .Clone() (или вызываемый им же конструктор Entity(Entity source)). Запускаем его, получаем новый объект в памяти. При необходимости заполняем текущими датой и пользователем стандартные 4 поля, затем те поля, значения которых в Вашей логике нужно поменять относительно образца. Все остальные поля, у которых в дизайнере есть галочка, скопировались автоматически. Id, естественно, будет уже новый.

Цикл из примера не нужен, ведь поля для отображения справочников нас сейчас не интересуют. И в конце запускаем у своего Entity метод .Save(), чтобы эта запись из памяти попала в базу. Кажется, ничего не упустил.

 

Но это всё на уровне C#-скрипта в процессе. Если надо в JS-логике, подобно кнопке копирования, нужно смотреть, как она устроена.

 

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

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

Сегодня у нас встали все процессы где есть элемент Таймер. Просто останавливается на нем и все. Что можно сделать? Компиляция и генерация кода не исправляют ситуацию.

Нравится

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

Обратите внимание на  две похожих темы за недавнее время. Возможно, и у Вас та же причина и поможет то же изменение настроек.

Вот еще одна похожая тема. Проблема давняя и все предложенные варианты не помогают. teleartel, подскажите, пожалуйста, удалось ли решить проблему.

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

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

Добрый день!



Есть задача - добавлять в аудиторию письма (элемент "отправка письма" в процессе) коллекцию получателей (контакты, или их email'ы)

 

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



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



В коробке системы это уже реализовано в процессе, который уведомляет группы ответственных о получении обращения. Но там это реализовано кодом. 



Вопрос - каким образом задачу можно решить средствами low-code платформы? :)

Нравится

1 комментарий
Лучший ответ

Доброе утро.

 

Средствами low-code можно попробовать реализовать с помощью обработки коллекций данных в бизнес-процессах через многоэкземплярное выполнение элемента [ Подпроцесс ].

Доброе утро.

 

Средствами low-code можно попробовать реализовать с помощью обработки коллекций данных в бизнес-процессах через многоэкземплярное выполнение элемента [ Подпроцесс ].

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

В первом бизнес-процессе в элементе Задание-сценарий вызываю другой бизнес-процесс.

Во втором бизнес-процессе выполняется логика и заполняются два исходящих параметра. 

Как вычитать эти два параметр в первом бизнес-процессе

 var manager = context.UserConnection.ProcessSchemaManager;
 var processSchema = manager.GetInstanceByName("Второй процесс");
 var process = processSchema.CreateProcess(context.UserConnection);
 process.Execute(context.UserConnection);
       
 if (process.Status == Terrasoft.Core.Process.ProcessStatus.Done)
 {
        parameter1 = //вычитать параметр 1 второго процесса
        parameter2 = //вычитать параметр 2 второго процесса
  }

Прошу подсказать как можно вычитать параметры.

Спасибо.

Нравится

7 комментариев
Лучший ответ

Сразу после запуска точно нельзя, он ведь ещё не отработал. А если делать средствами БП, в одном элементе запустить подпроцесс, далее элементе «Формула» или в условии перехода обратиться к его параметру, как тут:

scr_process_creation_designer_conditional_formula.png

Для получения:

var parametr1 = Get<Тип данных параметра>

("Код параметра");

 

Для присвоения:

Set("Код параметра", parametr1);

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

 

Сергей, если поискать, в SynchronizeWithGoogleModuleProcess есть пример такого получения параметров:

public virtual void LaunchProcess() {
	var entityManager = UserConnection.EntitySchemaManager;
	var manager = UserConnection.ProcessSchemaManager;
	var processSchema =  (ProcessSchema)manager.FindInstanceByUId(IntegrationProcessId);
	if (processSchema == null) {
		return;
	}
	var moduleProcess = processSchema.CreateProcess(UserConnection);
	moduleProcess.Execute(UserConnection);
	var syncGContactProcessUId = new Guid("2e4ae0af-2b8a-446f-bd58-7a66e3848de2");
	var syncGCalendarProcessUId = new Guid("0eceffe6-2795-439f-b915-118580947959");
	if (IntegrationProcessId == syncGContactProcessUId ||
		IntegrationProcessId == syncGCalendarProcessUId) {
		SyncProcessResult = (string)moduleProcess.GetPropertyValue("SyncResult");
	}
}

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

Ведь на момент выполнения функции Execute код скрипта продолжает выполняться, а дочерний БП ещё даже не запустился, process.Status не будет равен Terrasoft.Core.Process.ProcessStatus.Done.

Александр, именно. Нужно получить параметры с вызываемого процесса.

 

Исходя из Вашего комментария понимаю, что забрать обратно параметры нельзя в интерпретируемых процессах?

Сразу после запуска точно нельзя, он ведь ещё не отработал. А если делать средствами БП, в одном элементе запустить подпроцесс, далее элементе «Формула» или в условии перехода обратиться к его параметру, как тут:

scr_process_creation_designer_conditional_formula.png

 У меня дело в том, что через подпроцесс должна пройти коллекция записей. Коллекцию я получаю в Задании-сценарий. 

Придётся менять архитектуру логики.

Александр, спасибо за отклик. 

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

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

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

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

Изображение удалено.

Нравится

5 комментариев
Лучший ответ

Дмитрий, поскольку Ваша колонка ссылается не на физическую таблицу в БД, а на представление, то при установленных галочках «индексируемая» и при контроле целостности, система пыталась добавить внешний ключ в представление после чего и последовала  ошибка. Если перед публикацией снять галочку индексации и установить галочку «Не контролировать целостность», как показано на скриншоте ниже, публикация такого объекта пройдет без проблем. Для отображения всех свойств колонки, необходимо выбрать «все» в следующем меню. Наглядные скриншоты прикрепил.

Добрый день.

 

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

 

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

 

 

Алла Савельева пишет:

Добрый день.

Вам нужно в свойствах данного объекта установить признак 'Представление в базе данных', как на скриншоте ниже:

Нет. Это совет, как создать представление, на не в объекте ссылку на представление. 

Эта ошибка происходит из-за того, что система пытается создать внешний ключ (foreign key) на представление, а СУБД такой возможности не дает.



Нужно в свойствах справочной колонки, которая ссылается на представление указать признак "Не контролировать целосность". Это не будет создавать внешний ключ в БД.

 

Дмитрий, поскольку Ваша колонка ссылается не на физическую таблицу в БД, а на представление, то при установленных галочках «индексируемая» и при контроле целостности, система пыталась добавить внешний ключ в представление после чего и последовала  ошибка. Если перед публикацией снять галочку индексации и установить галочку «Не контролировать целостность», как показано на скриншоте ниже, публикация такого объекта пройдет без проблем. Для отображения всех свойств колонки, необходимо выбрать «все» в следующем меню. Наглядные скриншоты прикрепил.

Зверев Александр,

Это то что нужно, спасибо!

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

Добрый день.

На нашей системе 7.16.3 воспроизводится следующий баг.

Создаем процесс.

1. Создаем элемент читать данные с чтением всех колонок

2. Создаем условный переход по данным из этого элемента

3. Создаем Добавить данные с данными из элемента п.1.

Изображение удалено.

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

Изображение удалено.

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

 

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

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

Добрый день.

Я бы назвала это скорее недоработкой, но замечание толковое. Плюсую...

Алексей, спасибо за информацию, зафиксировал идею.

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

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

 

Какие манипуляции необходимо выполнить для этого?

Нравится

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

Владимир, см. статью.

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

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

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

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

 

Для бизнес-процесса создал служебный справочник с настройками.

В ходе бизнес процесса читается данный справочник и если записей, соответствующих параметрам нет, то добавляется новая строка процессом. Если запись есть, то в одном из полей добавляется порядковый номер +1.

Процесс валится у пользователей в связи с тем, что у них нет прав доступа на операцию CanManageLookups.

Как можно продолжить процесс с изменением/добавлением значений только в этом справочнике, не раздавая при этом доступ к CanManageLookups?

Нравится

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

Добрый день.

 

Проверка по правам доступа на операцию CanManageLookups выполняется для всех объектов, которые унаследованы от BaseLookup (Базовый справочник).

 

Можно попробовать сменить родителя у объекта Вашего справочника на BaseObject (Базовый объект).

В этом случае не забудьте добавить поля Name и Description, которые есть в базовом справочнике, но нет в базовом объекте.

 

Внесение таких изменений лучше выполнять на тестовой версии.

Алла, зачем менять родителя, просто во встроенном БП справочника перезатереть пустой функцию проверки CheckCanManageLookups.

public override void CheckCanManageLookups() {
}

Так сделано у ряда коробочных справочников, например, у Department.

Зверев Александр,

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

Зверев Александр,

Александр, спасибо за ответ. Буду пробовать в это направлении.

 

Алла Савельева,

Алла, ваш вариант тоже подходит, так как использование справочника было лишь номинальным и для удобства администрирования - поля Name и Desc мне не нужны, так как используются поля других справочников: Account + 2 поля Int.

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