Доброго времени суток, коллеги!

 

Возникла необходимость собирать несколько записей из справочников и затем все эти данные отправлять одним письмом в виде таблицы.

Какие есть варианты решения данного вопроса и можно ли это сделать стандартными средствами предоставляемые Studio?

 

Заранее спасибо!

Нравится

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

Добрый день.

 

Вы можете использовать бесплатное дополнение, которое позволяет встраивать таблицу с данными в e-mail сообщение, отправляемое из бизнес-процесса.

Добрый день.

 

Вы можете использовать бесплатное дополнение, которое позволяет встраивать таблицу с данными в e-mail сообщение, отправляемое из бизнес-процесса.

Добрый! Кроме данного дополнения больше никаких вариантов нет? Ибо при попытке работать с данным расширением оказалось, что оно не совсем рабочее. 

Mykhailo Kozlenko,

Добрый день.

Можно в элементе 'Задание-сценарий' сформировать таблицу, которую нужно отправлять, и записать её в параметр бизнес-процесса. Например, я делала вот таким образом:

const string quote = "\"";
const string siteRef = "http://site_name";
 
var userConnection = Get<UserConnection>("UserConnection");
var softwareInventoryTableHTML = String.Empty;
 
var esqSoftwareInventory = new EntitySchemaQuery(userConnection.EntitySchemaManager, "SoftwareInventory");
esqSoftwareInventory.AddColumn("Id");
esqSoftwareInventory.AddColumn("Number");
esqSoftwareInventory.AddColumn("Software.Name");
esqSoftwareInventory.AddColumn("LicenseKey.Name");
var expirationDateColumn = esqSoftwareInventory.AddColumn("LicenseExpirationDate");
expirationDateColumn.OrderDirection = OrderDirection.Ascending;
expirationDateColumn.OrderPosition = 1;
esqSoftwareInventory.AddColumn("Equipment.Name");
esqSoftwareInventory.AddColumn("Equipment.Id");
esqSoftwareInventory.Filters.Add(esqSoftwareInventory.CreateFilterWithParameters(FilterComparisonType.Equal,
	"LicenseStatus", new Guid("CDD71003-D5BB-43E7-8E06-280FE40BEBF8")));
DateTime dueDate = DateTime.Today.AddMonths(2);
esqSoftwareInventory.Filters.Add(esqSoftwareInventory.CreateFilterWithParameters(FilterComparisonType.Less,
	"LicenseExpirationDate", dueDate));
var softwareInventories = esqSoftwareInventory.GetEntityCollection(userConnection);
if (softwareInventories.Count > 0)
{
	var htmlTableBuilder = new StringBuilder();
	htmlTableBuilder.AppendLine("<table border='1' width='100%' cellpadding='5'>");
	var headerSB = new StringBuilder();
	headerSB.Append("<tr>");
	string[] columnNames = { "Номер", "Программное обеспечение", "Лицензионный ключ", "Дата окончания лицензии",
		"Оборудование" };
	foreach (string columnName in columnNames)
	{
		headerSB.Append("<td>" + columnName + "</td>");
	}
    headerSB.Append("</tr>");
    htmlTableBuilder.AppendLine(headerSB.ToString());
	foreach (var softwareInventory in softwareInventories)
	{
		var rowSB = new StringBuilder();
		rowSB.Append("<tr>");
		string Number = softwareInventory.GetTypedColumnValue<string>("Number");
		Guid recordId = softwareInventory.GetTypedColumnValue<Guid>("Id1");
		string softwareInventoryRef = siteRef + "/0/Nui/ViewModule.aspx#CardModuleV2/SoftwareInventory1Page/edit/" +
			recordId.ToString();
		string inventoryNumberRef = "<a href=" + quote + softwareInventoryRef + quote +">" + Number + "</a>";
		rowSB.Append("<td width=\"44\">" + inventoryNumberRef + "</td>");
		rowSB.Append("<td width=\"120\">" + softwareInventory.GetTypedColumnValue<string>("Software_Name") + "</td>");
		string licenseKey = softwareInventory.GetTypedColumnValue<string>("LicenseKey_Name");
		int licenseKeyLength = licenseKey.Length;
		int indexStr = 8;
		if (licenseKeyLength <= 8)
		{
			indexStr = licenseKeyLength;
		}
		rowSB.Append("<td width=\"110\">" + licenseKey.Substring(0, indexStr) + "</td>");
		DateTime licenseExpirationDate = softwareInventory.GetTypedColumnValue<DateTime>(expirationDateColumn.Name);
		string licenseExpirationDateStr = "";
		if (licenseExpirationDate != DateTime.MinValue) {
			licenseExpirationDateStr = licenseExpirationDate.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture);
		}
		rowSB.Append("<td width=\"83\">" + licenseExpirationDateStr + "</td>");
		rowSB.Append("<td width=\"106\">" +	softwareInventory.GetTypedColumnValue<string>("Equipment_Name") + "</td>");
		rowSB.Append("</tr>");
 
        htmlTableBuilder.AppendLine(rowSB.ToString());
	}
	htmlTableBuilder.AppendLine("</table>");	
	softwareInventoryTableHTML = htmlTableBuilder.ToString();
}
Set<string>("SoftwareInventoryTableHTML", softwareInventoryTableHTML);
return true;

А потом этот параметр бизнес-процесса использовать в элементе 'Отправить email' в качестве макроса:

Обратите внимание, по данному программному обеспечению истек срок действия лицензии либо истечет в ближайшее время.
Пожалуйста, актуализируйте в срм информацию по этому ПО:
[#Software inventory table#]
 
С уважением,
Системный администратор crm

 

P.S. В скрипте, приведенном выше, ещё и гиперссылки на карточки сущностей в срм формируются.

 

 

 

 

Я однажды делал подобное следующим образом:
в БП в элементе "Задание-сценарий" вычитывал в коллекцию какие-то значения.
После кодом формировал html-код в виде:
<table>
<tbody>
  <tr>
    <td >Номер</td>
    <td >Колонка 1</td>
    <td >Колонка 2</td>
  </tr>
  <tr>
    <td >1</td>
    <td >Значение 1</td>
    <td >Значение 2</td>
  </tr>
</tbody>
</table>

где Значение 1 и Значение 2 значения из коллекции.
После использовал элемент БП "Отправка письма", где в тело подсовывал html-код в виде строки.
После отправки получатель увидит заполненную html-таблицу

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

Всем доброго времени суток!

 

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

 

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

 

Может где-то есть настройки работы таймера, чтобы проверить, все ли корректно работает и сравнить с тестовой платформой? Заранее благодарю!

Нравится

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

Я бы посмотрел в сторону Quartz, возможно с ним какие-то проблемы https://academy.terrasoft.ru/docs/developer/elements_and_components/qua…

 

Для начала увеличить значение в веб конфигах на более высокое (по умолчанию там 5), затем перезапустить iis.

<add key="quartz.threadPool.threadCount" value="5" />

Добрый день, коллеги.

Есть вероятность что таймеры попадают на то время когда пул приложения спит, тут может помочь настройка согласно публикации https://community.terrasoft.ru/articles/bespereboynaya-rabota-zadaniy-q…

 

Но в целом что стоит сравнить так это внешний Web.config с обеих сред. Возможно достаточно будет их заполнить одинаково, или если у вас на прод среде в разы больше задач для Quartz может понадобится настройка согласно статье https://academy.terrasoft.ru/docs/7-17/developer/elements_and_component…

 

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

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

Добрый день!

Два вопроса по таймеру в процессах:

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

2. Можно ли задавать время запуска в системных настройках?

Нравится

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

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

А зачем тогда настройка часового пояса в стартовом сигнале процесса Timer?
 

Владимир Соколов,

Добрый день!

Можно задавать время в формате UTC для таймера, тогда вопросов с часовыми поясами вообще не будет.

 

Подобные примеры доступны в статьях на академии: 

https://academy.terrasoft.ua/docs/user/biznes_processy/primery_nastrojk…

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

Добрый день.

Заметил особенность - оператор "включающего или" при  синхронизации действует схожим образом, как оператор "исключающего или".

Т. е. при вхождении в него 2 и более активированных ветвей,  он ожидает завершение первой пришедшей ветки. 

Ожидаемое поведение (цитата из Википедии):

  • Оператор включающего «или» (inclusive gateway) активирует одну или более исходящих ветвей, в случае, когда осуществляется ветвление. Если оператор используется для синхронизации, то он ожидает завершения выполнения всех активированных ветвей и активирует выходной поток.
  • Оператор исключающего «или», управляемый данными (англ. data-based exclusive gateway). Если оператор используется для ветвления, то поток управления направляется лишь по одной исходящей ветви. Если оператор используется для синхронизации, то он ожидает завершения выполнения одной входящей ветви и активирует выходной поток.

Ниже привожу пример БП.

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

Нравится

Поделиться

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

Добрый день!

Согласно Т.З. необходимо реализовать следующие пункты...

У нас есть раздел "Заказ на выполнение работ", а в нем реализована деталь "Перечень работ". При создании нового "Заказа на выполнение работ" с помощью бизнес-процесса в деталь "Перечень работ" добавляется 5 записей. Для обновления реестра детали необходимо использовать механизм отправки сообщений с серверной на клиентскую сторону, содержимое детали должно автоматически обновляться после завершения работы действия.

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

Нравится

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

Посмотрите данную статью, там есть пример https://academy.terrasoft.ru/docs/developer/front-end_development/webso…

 

Для обновления детали подойдет метод 

this.updateDetail({detail: "UsrDetail23d2c003", realoadAll: true})

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

Посмотрите данную статью, там есть пример https://academy.terrasoft.ru/docs/developer/front-end_development/webso…

 

Для обновления детали подойдет метод 

this.updateDetail({detail: "UsrDetail23d2c003", realoadAll: true})

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

Трефилов Павел Сергеевич,

Часть задания вроде бы как удалось сделать. А именно… Повторил в соответствии с примером применительно к своему заданию.

В объекте детали «Перечень работ» создал событийный подпроцесс, который срабатывает при добавлении записи в деталь, и передает Id новой записи детали. Сделал рассылку в созданном замещающем клиентском модуле с родителем ClientMessageBridge . Сделал подписку на сообщение в странице редактирования «Заказ на выполнение работ». Все работает, как и в примере.

Пока не получается обновить реестр детали. Делаю это следующим образом… В странице редактирования «Заказ на выполнение работ» в функции обработчике события полученного сообщения просто пишу this.reloadDetail("UsrListWorks"); (UsrListWorks – название объекта детали).

Что я делаю неправильно?

Pavel Litvinovich,

нужно писать не название объекта, а название делали в коде страницы. Смотрите блок details и там будет название детали. Пример:

		details: /**SCHEMA_DETAILS*/{
			"UsrMaterialDetail23d2c003": {
				"schemaName": "UsrMaterialDetail",
				"entitySchemaName": "UsrMaterial",
				"filter": {
					"detailColumn": "UsrParentMaterial",
					"masterColumn": "Id"
				}
			}
		}/**SCHEMA_DETAILS*/,

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

        messages: {
            "RefreshMaterial": {
                "mode": Terrasoft.MessageMode.BROADCAST,
                "direction": Terrasoft.MessageDirectionType.SUBSCRIBE
            }
        },

 

			onEntityInitialized: function() {
				this.callParent(arguments);
				this.sandbox.subscribe("RefreshMaterial", this.reloadFromProcess, this);
			},
 
			reloadFromProcess: function(args) {
				if(args === this.get("Id")) {
					this.updateDetail({detail: "UsrMaterialDetail23d2c003", realoadAll: true});
				}
			},

 

Трефилов Павел Сергеевич,

А что использовать init или onEntityInitialized? В примере используют init. А у меня в methods уже был onEntityInitialized, для реализации другого функционала.

И как проверить работает оно или нет (я имею ввиду обновление реестра с использованием механизма отправки сообщений)? Записи в деталь с помощью только лишь БП и так нормально добавлялись.

В данном случае нет разницы в init или onEntityInitialized, подписка будет работать в обоих случаях.

Если смотреть пример, то там есть строка 

window.console.info("текст");

Для отладки тоже можете в методе добавить подобное, если после запуска процесса в консоле появился текст, то значит пришел сигнал из бп. Если нет, то где-то ошибка. Либо лучше научиться отладки js, ставить точку останова и т.п.

 

А обновление реестра работает или нет, чисто визуально определить. У вас же БП что-то делает, то значит после выполнения бп данные должны обновиться без перезагрузки страницы.

Трефилов Павел Сергеевич,

Дело в том, что БП отрабатывает после создания новой записи в разделе "Заказ на выполнение работ" (а именно добавляет записи на деталь этой страницы). А при нажатии кнопки Сохранить страница автоматически закрывается. И получается что страница при последующем открытии в любом случае будет перезагружена. Хотя если присмотреться, за долю секунды то до того как страница закроется, на детали появляются записи. Походу, получается, работает правильно.

Обнаружил другую более существенную проблему. Если добавлять вручную записи в деталь нажимая на +, т.к. деталь с редактируемым реестром (при работе БП все хорошо), то появляется ошибка: Violation of PRIMARY KEY constraint 'PKOqfXc3lnQVBYwkElsuKFom04KY'. Cannot insert duplicate key in object 'dbo.UsrListWorks'. The duplicate key value is (9d4ea319-42ee-41b3-81ec-f556e4dc4517). The statement has been terminated. Не понятно почему, т.к. если посмотреть в базе данных, то детали с таким Id еще нет.

Pavel Litvinovich,

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

onSaved: function(response, config) {
if(this.isNew) {
config.isSilent;
}
this.callParent(arguments);
}
код не проверял на практике, но должен работать

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

Трефилов Павел Сергеевич,

Спасибо за помощь!

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

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

"Значение не может быть неопределенным. Имя параметра: 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 можно попробовать реализовать с помощью обработки коллекций данных в бизнес-процессах через многоэкземплярное выполнение элемента [ Подпроцесс ].

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