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

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    7456    Abysswalker    11    

48

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

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

14.05.2025    12666    DeerCven    15    

64

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

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

21.05.2024    65463    dimanich70    87    

177

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

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

1 стартмани

18.03.2024    8700    7    John_d    13    

59

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

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

12.02.2024    82125    atdonya    31    

75

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

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

30.11.2023    12640    ke.92@mail.ru    18    

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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