Когда enterprise-инфраструктура разрастается до десятков разнородных учетных баз, интернет-магазинов, CRM и WMS-систем, интеграция по принципу «точка-точка» заводит сопровождение в тупик. Количество связей растет лавинообразно, регламенты обменов конфликтуют, а поиск ошибок превращается в сложный аудит. В этот момент возникает необходимость перехода на сервисную шину данных (Enterprise Service Bus, ESB) или архитектуру очередей сообщений. Рассмотрим подробно, с чего начать проектирование интеграционного слоя, какие архитектурные паттерны использовать в 1С и как избежать типовых ошибок.
Развертывание шины данных бессмысленно, если в компании не выстроена единая модель управления мастер-данными (Master Data Management, MDM / НСИ). Главная проблема гетерогенного контура — рассинхронизация и дублирование справочников (контрагенты, номенклатура, договоры), когда изменения могут вноситься параллельно в разных базах.
Проанализируем организацию передачи данных через шину. Распространенной ошибкой является попытка передавать между системами узкоспециализированные внутренние структуры конкретной конфигурации 1С.
Для построения гибкой архитектуры соблюдаем следующие принципы:
Прямой вызов внешнего REST/SOAP-сервиса шины или брокера прямо из транзакции проведения документа в 1С — критическая архитектурная ошибка. При сетевых задержках или сбоях внешней системы блокируются таблицы СУБД, вызывая таймауты у пользователей.
Разберем надежную схему гарантированной отправки через локальную исходящую очередь (Transactional Outbox):
ПланыОбмена) внутри той же транзакции базы данных.200 OK или 202 Accepted, либо AMQP ACK) запись в регистре помечается как отправленная или удаляется.Большинство брокеров сообщений (например, RabbitMQ) и шин данных гарантируют доставку по модели at-least-once («как минимум один раз»). Это означает, что при обрыве связи в момент подтверждения сообщение будет отправлено повторно. Принимающая сторона в 1С обязана быть идемпотентной.
Посмотрим на пример логики проверки входящего сообщения в HTTP-сервисе или обработчике очередей:
Функция ОбработатьВходящееСообщение(ИдентификаторСообщения, ТелоСообщения) Экспорт
// Проверяем, обрабатывалось ли сообщение ранее
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ЖурналВходящихСообщений.ИдентификаторСообщения
|ИЗ
| РегистрСведений.ЖурналВходящихСообщений КАК ЖурналВходящихСообщений
|ГДЕ
| ЖурналВходящихСообщений.ИдентификаторСообщения = &ИдентификаторСообщения";
Запрос.УстановитьПараметр("ИдентификаторСообщения", ИдентификаторСообщения);
Если НЕ Запрос.Выполнить().Пустой() Тогда
// Сообщение является дубликатом - игнорируем тело и возвращаем успешный статус
Возврат Истина;
КонецЕсли;
// Начинаем транзакционную обработку нового пакета
НачатьТранзакцию();
Попытка
ОбработатьБизнесДанные(ТелоСообщения);
// Фиксируем факт успешной обработки
МенеджерЗаписи = РегистрыСведений.ЖурналВходящихСообщений.СоздатьМенеджерЗаписи();
МенеджерЗаписи.ИдентификаторСообщения = ИдентификаторСообщения;
МенеджерЗаписи.ДатаОбработки = ТекущаяДатаСеанса();
МенеджерЗаписи.Записать();
ЗафиксироватьТранзакцию();
Возврат Истина;
Исключение
ОтменитьТранзакцию();
ЗаписьЖурналаРегистрации("Интеграция.Ошибка", УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение;
КонецПопытки;
КонецФункции
Если 1С выступает приемником входящих данных от шины через встроенные HTTP-сервисы, нельзя выполнять тяжелую обработку и проведение документов в синхронном потоке HTTP-сеанса. Длительные вызовы приводят к исчерпанию пула соединений веб-сервера и блокировке лицензий платформы.
Оптимальный алгоритм работы HTTP-сервиса:
202 Accepted с идентификатором зарегистрированного пакета.При передаче файлов (сканы договоров, PDF-накладные, медиафайлы) перегружается буфер брокера и оперативная память процессов сервера 1С. В интеграциях применяется паттерн Claim Check: файл выгружается в S3-совместимое объектное хранилище, а через шину данных передается только легкий JSON с метаданными и ссылкой на скачивание.
Для сообщений, которые не могут быть обработаны из-за ошибок в данных (например, битая кодировка или неверный реквизит), настраивается очередь недоставленных сообщений (Dead Letter Queue, DLQ). После заданного количества безуспешных попыток (Retry Policy) сообщение исключается из основного потока и переносится в DLQ для ручного разбора администратором, что исключает блокировку остальных очередей.