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

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 цепочка ответсвенности

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4825    Abysswalker    11    

47

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    9024    DeerCven    15    

63

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    57913    dimanich70    85    

175

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

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

1 стартмани

18.03.2024    8138    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

12.02.2024    72661    atdonya    31    

73

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

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

30.11.2023    10112    ke.92@mail.ru    17    

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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