Как реализовать оперативный обмен объектами между базами 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Проблема обмена в транзакции: почему нельзя делать «в лоб»

Первое побуждение многих разработчиков — использовать подписку на событие ПриЗаписи или ОбработкаПроведения и внутри неё вызывать внешний Web-сервис. Проанализируем ситуацию: когда пользователь нажимает кнопку «Провести», база данных открывает транзакцию. Если внутри этой транзакции программа начинает ожидать ответа от другой информационной базы по сети, возникают критические риски.

Во-первых, если база-приемник недоступна или сеть «подтормаживает», пользователь будет ждать окончания тайм-аута соединения (который может длиться 30-60 секунд). Всё это время транзакция в исходной базе остается открытой, блокируя таблицы для других участников процесса. Это убивает параллельную работу в системе.

Во-вторых, если в базе-приемнике произойдет ошибка при записи, транзакция в базе-источнике может откатиться, что приведет к путанице. Разберем по шагам правильные архитектурные решения.

Решение 1: Использование планов обмена и асинхронного подхода

Наиболее надежный метод — это асинхронный обмен с использованием механизма ПланыОбмена. Разберем этот алгоритм. Вместо того чтобы пытаться передать данные немедленно, мы регистрируем изменение объекта в плане обмена. Это происходит мгновенно и не нагружает систему.

Далее в работу вступает асинхронный процесс (например, регламентное задание). Рассмотрим преимущества этого метода:

  1. Гарантированная доставка: Платформа хранит информацию о том, какие данные еще не были успешно переданы (через номера сообщений).
  2. Отказоустойчивость: Если база-приемник выключена, данные просто накопятся в очереди и уйдут сразу после восстановления связи.
  3. Производительность: Основной сеанс пользователя никак не связан с процессом передачи данных.

Для реализации "мгновенности" в рамках этого метода можно настроить расписание регламентного задания на интервал в 10–30 секунд. На практике пользователи воспринимают это как обмен в режиме реального времени.

Решение 2: Синхронизация данных через БСП

Если ваши конфигурации построены на базе Библиотеки стандартных подсистем (БСП), нет смысла изобретать велосипед. Проанализируем возможности стандартной синхронизации. В современных версиях БСП реализованы механизмы, которые позволяют минимизировать задержку:

Рассмотрим пример, как можно инициировать обмен программно, не блокируя интерфейс пользователя, используя фоновые задания:


// В обработчике события ПриЗаписи или после него
Процедура ПослеЗаписиНаСервере(ТекущийОбъект)
    ПараметрыЗадания = Новый Массив;
    ПараметрыЗадания.Добавить(ТекущийОбъект.Ссылка);
    ФоновыеЗадания.Выполнить("МойМодульОбмена.ВыполнитьМгновеннуюОтправку", ПараметрыЗадания);
КонецПроцедуры

В данном примере функция ВыполнитьМгновеннуюОтправку запустится в отдельном потоке. Пользователь сможет продолжить работу, а система в фоне попытается передать данные через HTTPСервис или WSСсылку.

Решение 3: HTTP-сервисы и формат JSON

Для оперативного обмена "поштучно" рекомендуется использовать HTTP-сервисы вместо классических Web-сервисов (SOAP). Выясним причину: SOAP (XML) — это тяжеловесный протокол с большим объемом служебной информации. Формат JSON значительно легче, а сериализация объектов 1С в JSON происходит быстрее.

Проанализируем пример структуры кода для отправки данных через HTTP-запрос:


Соединение = Новый HTTPСоединение("server-buh", , "login", "password");
Запрос = Новый HTTPЗапрос("/v1/data/invoice");
Запрос.УстановитьТелоИзСтроки(ДанныеВФорматеJSON, КодировкаТекста.UTF8);

Попытка
    Ответ = Соединение.ОтправитьДляОбработки(Запрос);
    Если Ответ.КодСостояния = 200 Тогда
        // Успешно обработано
    КонецЕсли;
Исключение
    // Записываем лог ошибки, объект отправим позже регламентным заданием
КонецПопытки;

Такой подход в сочетании с фоновым заданием обеспечивает высокую скорость отклика системы.

Решение 4: Современные брокеры сообщений и 1С:Шина

В высоконагруженных системах, где количество документов исчисляется тысячами в час, стоит рассмотреть использование брокеров сообщений (RabbitMQ, Apache Kafka) или специализированного продукта 1С:Шина.

Разберем, как это работает: База-источник публикует сообщение в очередь брокера. Это происходит сверхбыстро (миллисекунды). База-приемник подписана на эту очередь и забирает документ, как только он там появляется. Это эталон реализации асинхронного обмена, который исключает прямую зависимость баз друг от друга. 1С:Шина позволяет настроить такие маршруты визуально, обеспечивая мониторинг и гарантированную доставку «из коробки».

Решение 5: Использование OData (REST API)

Посмотрим на ситуацию, когда нам нужно передать данные в базу, где мы не хотим писать принимающий код. Платформа 1С поддерживает стандартный интерфейс OData. Достаточно включить объект в состав автоматического REST-сервиса в базе-приемнике. После этого база-источник может напрямую отправлять POST или PATCH запросы к таблицам базы-приемника. Это упрощает архитектуру, так как исключает необходимость создания специфических веб-сервисов на стороне получателя.

Подведем итоги и выберем стратегию

Выбор метода зависит от требований к надежности и сложности системы:

  1. Типовые базы: Настраиваем стандартную синхронизацию БСП через файлы или прямое подключение с интервалом 1 минута.
  2. Самописные решения и высокая скорость: Используем HTTP-сервисы + JSON, вызываемые через ФоновыеЗадания для асинхронности.
  3. Максимальная надежность: Реализуем собственный механизм на ПланахОбмена с контролем номеров сообщений и гарантированной доставкой.
  4. Корпоративный сектор: Внедряем брокеры сообщений или 1С:Шину.

Важный совет: всегда ведите лог обмена. Даже "мгновенный" обмен должен оставлять след, чтобы в случае расхождения данных между базами вы могли выяснить причину ошибки и повторно отправить объект.

← На главную