Конвейеры обработки сообщений

27.06.22

Разработка - Универсальные функции

Проект методики разработки решений для последовательной обработки сообщений или объектов данных по принципу построения конвейера.

Всё ниже изложенное является попыткой предложить и оценить применимость в 1С таких классических паттернов программирования, как:

  • цепочка ответственности (chain of responsibility);

  • конвейер (pipeline);

  • фабрика (factory);

  • промежуточное ПО (middleware).

 
-1. Описание проблемы.
 
0. Возможные существующие решения.
 
1. Предлагаемое решение.
 
2. Реализация.
 
3. Транзакционный конвейер.
 
4. Кэширование конвейеров.
 
5. Многопоточное выполнение.
 
6. Разработка.
 
7. Тестирование.
 
8. Эксплуатация.
 
9. Результат рефакторинга.

Старый код

Новый код

// Пример типичного кода обмена данными

Если Условие1 Тогда
   ОбработатьПоАлгоритму1(Сообщение);
Иначе
   ОбработатьПоАлгоритму2(Сообщение);
КонецЕсли;

Если Условие2 Тогда
   ПрерватьОбработкуСообщения();
КонецЕсли;

ОбъектДанных = КонвертироватьСообщение(Сообщение);

Если Условие3 Тогда
   ОбработатьПоАлгоритму3(ОбъектДанных);
Иначе
   ОбработатьПоАлгоритму4(ОбъектДанных);
КонецЕсли;

// И так далее ещё сотни строк кода … =)
Конвейер = ФабрикаКонвейеров.Создать("ВходящиеСообщения");

Результат = Конвейер.ОбработатьСообщения();

 

 

 

обмен данными конвейер обработки сообщений pipeline chain of responsibility middleware цепочка ответсвенности

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2933    2    John_d    11    

56

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    5232    atdonya    22    

52

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

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

30.11.2023    4154    ke.92@mail.ru    16    

62

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

28.08.2023    9566    YA_418728146    6    

143

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2295    28    progmaster    8    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16428    143    sapervodichka    112    

130

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7388    quazare    8    

110
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. quazare 3608 27.06.22 07:27 Сейчас в теме
как на счет того, чтобы использовать запуск одной и той же функции с разным массивом параметров?

это реализовано в БСП, например в модулях создания экземпляров фоновых заданий

https://infostart.ru/1c/articles/1663091/
2. zhichkin 1456 27.06.22 13:14 Сейчас в теме
(1) В публикации намеренно приведён минимально рабочий код - фактически шаблон. Поверх него можно накрутить очень много чего угодно. Например, я специально не стал затрагивать тему ветвления потока выполнения ковейера и прочие обвесы.
3. kalyaka 1069 27.06.22 14:12 Сейчас в теме
Какой уровень детализации в параметре Сообщение? Это просто какие то абстрактные данные? Предполагается ли здесь использование массивов для передачи между обработчиками? Может имеет смысл тогда условия типа ЭтоМоё вынести в условия отбора данных и для каждого набора определять свою цепочку обработчиков?
5. zhichkin 1456 27.06.22 14:54 Сейчас в теме
(3)
Какой уровень детализации в параметре Сообщение?

Сообщение - это любой объект данных: структура, объект конфигурации, массив. Зависит от логики конвейера.
Может имеет смысл тогда условия типа ЭтоМоё вынести в условия отбора данных и для каждого набора определять свою цепочку обработчиков?

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

	НаборДанных = ПолучитьНаборДанных(Параметры);

	Для Каждого ОбъектДанных Из НаборДанных Цикл
		_Следующий.Обработать(ОбъектДанных);
	КонецЦикла;

	// Альтернатива: цикл внутри другого вложенного конвейера.

	// ВложенныйКонвейер = ФабрикаКонвейеров.Создать("ВыборкаДанных");
	// ВложенныйКонвейер.Настроить(Параметры);
	// Результат = ВложенныйКонвейер.ВыполнитьОбработку();
	// Если Результат.ВсёХорошо Тогда
	//      Продолжаем выполнение текущего конвейера
	//	_Следующий.Обработать(Сообщение, Параметры);
	// КонецЕсли;

КонецПроцедуры
Показать
4. kalyaka 1069 27.06.22 14:18 Сейчас в теме
А транзакционный конвейер у вас получается только на уровне записей в БД, а не данных в обработке. Т.е. здесь решается вопрос транзакционной целостности только для записанных в БД данных, а хотелось бы для обрабатываемых данных. Хотя последнее решается просто чистыми обработчиками без побочных эффектов
6. zhichkin 1456 27.06.22 14:58 Сейчас в теме
(4) Транзакционный конвейер инкапсулирует транзакцию - все его обработчики выполняются в ней. Обработчик может изменять данные, удалять их, записывать. Всё это будет в одной транзакции.

Обработчик тоже может быть транзакционным. Таким образом конвейер может содержать внутри несколько транзакций, инкапсулированных в соответствующих обработчиках. Если ещё немного докурутить, то можно сделать конвейер, инкапсулирующий в себе реализацию паттерна сага (saga).

Механизм очень гибкий. Можно настроить его под свои задачи. В публикации я не описывал возможные ветвления, например. Можно создать обработчики: ветвления (fork), соединения ветвления (join), фильтрации, логирования и т.д.
7. Steelvan 302 27.06.22 15:32 Сейчас в теме
В 1С:Шина аналогичным способом компонуются алгоритмы обработки сообщений.

Плюс этот подход можно пользовать в роботах, когда набор действий собирается из кубиков.
8. zhichkin 1456 27.06.22 15:57 Сейчас в теме
(7) Подход безусловно не новый. 1С:Шина - платный продукт и реализована на 1С:Предприятие.Элемент. Честно говоря, не вникал как там с возможностями программного расширения - нет доступной лицензии под рукой.
9. kalyaka 1069 27.06.22 15:59 Сейчас в теме
У вас есть уже разработка, в который вы применили описанный подход?
10. zhichkin 1456 27.06.22 16:13 Сейчас в теме
(9) И да и нет. Данный подход я использую в своём продукте DaJet на C# (можно сказать аналог 1С:Шина) для интеграции 1С и не-1С. В 1С для работы с DaJet есть общий модуль, который отвечает за экспорт и импорт сообщений. Исторически так сложилось, что модуль был написан как раз таки в парадигме процедурного программирования. Теперь встал вопрос о рефакторинге. Вот размышляю на досуге ... появилась эта публикация =)

Небольшое замечание для понимания сложности проблемы: речь идёт об обмене десятками миллионов объектов в сутки. Требования к производительности максимальные. То же самое касается вопросов разработки и эксплуатации. Любая поломка - почти катастрофа.
11. nixel 1408 05.07.22 11:30 Сейчас в теме
Как еще одну реализацию конвейерной обработки данных могу предложить посмотреть библиотеку для OneScript под названием fluent - https://github.com/nixel2007/oscript-fluent

Общий принцип примерно такой же - есть конвейер обработки (элементов коллекции) и операции, накидываемые на этот конвейер - фильтрация, преобразования, расширение, группировка, сортировка. В качестве хранения обработчика используется аналог 1Сного ОписаниеОповещения с ручным вызовом через ВыполнитьОбработкуОповещения.
zhichkin; +1 Ответить
12. zhichkin 1456 05.07.22 12:10 Сейчас в теме
(11) Мне показалось, что oscript-fluent больше похоже на Linq в C#. Считаю аналогию не совсем точной, но за oscript однозначно плюс =) Аналогом в C# для идей, описанных в данной статье, я бы наверное назвал TPL Dataflow. Думаю так поточнее будет.
13. nixel 1408 05.07.22 12:17 Сейчас в теме
(12) да, конечно, у Вашего инструмента несколько другая область применения. я скорее про сам шаблон разработки, про функциональный подход к обработке данных.
Оставьте свое сообщение