При автоматизации бизнес-процессов часто возникает задача оперативной передачи данных между различными конфигурациями, например, из базы складского учета в бухгалтерскую. Основным требованием в таких случаях выступает "мгновенность" появления документа в базе-приемнике. Однако техническая реализация такой задачи скрывает множество нюансов: от падения производительности системы до риска потери данных при обрыве связи. Рассмотрим подробнее, как грамотно организовать процесс обмена, какие инструменты предоставляет платформа 1С и какие современные подходы позволяют добиться надежной и быстрой синхронизации.
Первое побуждение многих разработчиков — использовать подписку на событие ПриЗаписи или ОбработкаПроведения и внутри неё вызывать внешний Web-сервис. Проанализируем ситуацию: когда пользователь нажимает кнопку «Провести», база данных открывает транзакцию. Если внутри этой транзакции программа начинает ожидать ответа от другой информационной базы по сети, возникают критические риски.
Во-первых, если база-приемник недоступна или сеть «подтормаживает», пользователь будет ждать окончания тайм-аута соединения (который может длиться 30-60 секунд). Всё это время транзакция в исходной базе остается открытой, блокируя таблицы для других участников процесса. Это убивает параллельную работу в системе.
Во-вторых, если в базе-приемнике произойдет ошибка при записи, транзакция в базе-источнике может откатиться, что приведет к путанице. Разберем по шагам правильные архитектурные решения.
Наиболее надежный метод — это асинхронный обмен с использованием механизма ПланыОбмена. Разберем этот алгоритм. Вместо того чтобы пытаться передать данные немедленно, мы регистрируем изменение объекта в плане обмена. Это происходит мгновенно и не нагружает систему.
Далее в работу вступает асинхронный процесс (например, регламентное задание). Рассмотрим преимущества этого метода:
Для реализации "мгновенности" в рамках этого метода можно настроить расписание регламентного задания на интервал в 10–30 секунд. На практике пользователи воспринимают это как обмен в режиме реального времени.
Если ваши конфигурации построены на базе Библиотеки стандартных подсистем (БСП), нет смысла изобретать велосипед. Проанализируем возможности стандартной синхронизации. В современных версиях БСП реализованы механизмы, которые позволяют минимизировать задержку:
Рассмотрим пример, как можно инициировать обмен программно, не блокируя интерфейс пользователя, используя фоновые задания:
// В обработчике события ПриЗаписи или после него
Процедура ПослеЗаписиНаСервере(ТекущийОбъект)
ПараметрыЗадания = Новый Массив;
ПараметрыЗадания.Добавить(ТекущийОбъект.Ссылка);
ФоновыеЗадания.Выполнить("МойМодульОбмена.ВыполнитьМгновеннуюОтправку", ПараметрыЗадания);
КонецПроцедуры
В данном примере функция ВыполнитьМгновеннуюОтправку запустится в отдельном потоке. Пользователь сможет продолжить работу, а система в фоне попытается передать данные через HTTPСервис или WSСсылку.
Для оперативного обмена "поштучно" рекомендуется использовать HTTP-сервисы вместо классических Web-сервисов (SOAP). Выясним причину: SOAP (XML) — это тяжеловесный протокол с большим объемом служебной информации. Формат JSON значительно легче, а сериализация объектов 1С в JSON происходит быстрее.
Проанализируем пример структуры кода для отправки данных через HTTP-запрос:
Соединение = Новый HTTPСоединение("server-buh", , "login", "password");
Запрос = Новый HTTPЗапрос("/v1/data/invoice");
Запрос.УстановитьТелоИзСтроки(ДанныеВФорматеJSON, КодировкаТекста.UTF8);
Попытка
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния = 200 Тогда
// Успешно обработано
КонецЕсли;
Исключение
// Записываем лог ошибки, объект отправим позже регламентным заданием
КонецПопытки;
Такой подход в сочетании с фоновым заданием обеспечивает высокую скорость отклика системы.
В высоконагруженных системах, где количество документов исчисляется тысячами в час, стоит рассмотреть использование брокеров сообщений (RabbitMQ, Apache Kafka) или специализированного продукта 1С:Шина.
Разберем, как это работает:
База-источник публикует сообщение в очередь брокера. Это происходит сверхбыстро (миллисекунды). База-приемник подписана на эту очередь и забирает документ, как только он там появляется. Это эталон реализации асинхронного обмена, который исключает прямую зависимость баз друг от друга. 1С:Шина позволяет настроить такие маршруты визуально, обеспечивая мониторинг и гарантированную доставку «из коробки».
Посмотрим на ситуацию, когда нам нужно передать данные в базу, где мы не хотим писать принимающий код. Платформа 1С поддерживает стандартный интерфейс OData. Достаточно включить объект в состав автоматического REST-сервиса в базе-приемнике. После этого база-источник может напрямую отправлять POST или PATCH запросы к таблицам базы-приемника. Это упрощает архитектуру, так как исключает необходимость создания специфических веб-сервисов на стороне получателя.
Выбор метода зависит от требований к надежности и сложности системы:
БСП через файлы или прямое подключение с интервалом 1 минута.HTTP-сервисы + JSON, вызываемые через ФоновыеЗадания для асинхронности.ПланахОбмена с контролем номеров сообщений и гарантированной доставкой.1С:Шину.Важный совет: всегда ведите лог обмена. Даже "мгновенный" обмен должен оставлять след, чтобы в случае расхождения данных между базами вы могли выяснить причину ошибки и повторно отправить объект.