
Привет, Хабр!
Меня зовут Илья Вязников, я инженер сопровождения СОФРОС. Я делюсь практическими приёмами и полезными настройками платформы.
В интеграционных проектах на DATAREON довольно быстро появляется одна и та же проблема: код бизнес-алгоритмов разрастается, а повторяющаяся логика начинает копироваться между процессами.
Нормализация GUID, очистка строк, проверки на пустые значения, преобразование форматов, парсинг JSON — сначала это несколько строк кода, потом десятки одинаковых фрагментов в разных схемах обработки. В результате:
Алгоритмы становятся сложнее читать;
Исправления приходится вносить в нескольких местах;
Возрастает риск, что часть процессов останется со старой логикой.
В DATAREON Platform эту проблему можно решить через программные модули — механизм для хранения и повторного использования собственных функций на C#.
В статье покажу:
Как создать программный модуль;
Как добавить в него собственную функцию;
Как вызывать её из алгоритмов;
Какие сценарии особенно удобно выносить в модули на практике.
Зачем это нужно:
Повышение читаемости и поддерживаемости кода.
Централизованное хранение бизнес-логики.
Упрощение доработок - меняешь функцию в одном месте, а не в десятках алгоритмов.
В качестве примера разберём функцию нормализации GUID, которая часто встречается в интеграциях между разными системами.
Шаг 1. Создание программного модуля
В Центре настройки перейдите в раздел: Обработка данных → Схемы обработки.
Нажмите «Добавить»(+) → Программный модуль.

На вкладке Основные заполните:
Название: PM_ПрограммныйМодуль_Пример (или любое удобное вам)
Имя: PM_ПрограммныйМодуль_Пример

Перейдите на вкладку Код и добавьте нужные функции. Ниже представлен пример одной функции.
Для примера реализуем функцию нормализации GUID. Она:
возвращает пустой GUID для null и пустых значений;
приводит корректные GUID к единому формату;
удаляет лишние пробелы.
public static string НормализоватьГуид(object value) { if (value == null) { return Guid.Empty.ToString("D"); } string text = value.ToString(); if (Guid.TryParse(text, out Guid guid)) { return guid.ToString("D"); } return string.IsNullOrWhiteSpace(text) ? Guid.Empty.ToString("D") : text.Trim(); }Можно добавлять сколько угодно функций в один модуль.

Сохраните и примените изменения.
Шаг 2. Вызов функции в алгоритме
После сохранения модуль становится доступен из пользовательских алгоритмов по имени модуля и имени функции.
Для вызова используется специальный синтаксис:
{ИмяМодуля}.{НазваниеФункции}(параметры);
Пример использования в пользовательском алгоритме:
var testValues = new object[] { null, "", " ", "abc", " abc ", "6F9619FF-8B86-D011-B42D-00C04FC964FF", "{6F9619FF-8B86-D011-B42D-00C04FC964FF}", "invalid-guid", 123, Guid.Empty }; foreach (var value in testValues) { Строка = value?.ToString(); Logger.Info($"До вызова функции: {Строка}"); Строка = PM_ПрограммныйМодуль_Пример.НормализоватьГуид(value); Logger.Info($"После вызова функции: {Строка}"); }
Ожидаемый результат
После выполнения алгоритма в логах вы увидите корректную нормализацию значений, например:

Функция становится доступна во всех бизнес-процессах и алгоритмах системы.
Полезные советы:
Не превращайте модуль в «свалку функций» - Лучше разделять по зонам ответственности.
Выносите только повторяемую логику - Если код используется один раз, модуль может быть избыточен.
Делайте функции максимально детерминированными - Без скрытых побочных эффектов и зависимости от внешнего состояния.
Используйте единый нейминг - Это сильно упрощает поддержку больших проектов.
Чаще всего в модули удобно выносить:
Работу с GUID;
Очистку и нормализацию строк;
Преобразование дат;
Парсинг JSON/XML;
Формирование кодов, артикулов и идентификаторов;
Общие проверки входных данных.
Заключение
Программные модули в DATAREON Platform позволяют сделать алгоритмы компактнее, читаемее и проще в сопровождении.
Если в проекте появляется повторяющийся код хотя бы в нескольких процессах, это уже хороший сигнал вынести его в отдельную функцию и переиспользовать централизованно.
На практике такой подход сокращает количество ошибок при доработках и ускоряет поддержку интеграций.
А какие функции вы чаще всего выносите в программные модули?
Для тех кто хочет подробнее ознакомиться с функционалом описанным в статье - полезные ссылки:
