Как организовать асинхронную выгрузку данных в другую базу 1С без зависания интерфейса пользователя

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

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

Причины зависания и архитектурные ограничения

Проанализируем, почему выгрузка в момент проведения или нажатия кнопки блокирует работу клиента. Установка COM-соединения требует инициализации отдельного процесса и сеанса в целевой базе, что само по себе занимает от нескольких секунд до десятков секунд. Если выполнять эту операцию непосредственно в клиентском коде или внутри серверной транзакции проведения, происходят следующие негативные эффекты:

  1. Блокировка пользовательского интерфейса: Клиентское приложение ожидает ответа сервера, отображая окно ожидания и не позволяя пользователю открывать другие формы или вводить документы.
  2. Затягивание транзакций и взаимные блокировки: Если обращение к внешней базе выполняется в процедуре ОбработкаПроведения модуля объекта, транзакция СУБД остается открытой на все время сетевого обмена. Это приводит к длительным блокировкам таблиц и ошибкам параллельной работы других пользователей.
  3. Невозможность запуска фонового задания внутри транзакции: Метод ФоновыеЗадания.Выполнить запускает отдельный сеанс. Если вызвать его до фиксации транзакции проведения, фоновый процесс не увидит еще не зафиксированные данные в СУБД либо натолкнется на блокировку чтения.

Способ 1. Вынос выгрузки в фоновое задание после завершения транзакции

Рассмотрим базовый вариант решения задачи с использованием механизма фоновых заданий платформы. Главное правило — вызывать процедуру запуска фонового задания строго после завершения транзакции записи и проведения объекта.

Для этого в форме документа перенесем запуск отправки в событие ПослеЗаписи на клиенте:


&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
    // Запускаем отправку только если документ проведен
    Если Объект.Проведен Тогда
        ЗапуститьФоновуюВыгрузкуНаСервере(Объект.Ссылка);
    КонецЕсли;
КонецПроцедуры

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

Процедура в серверном модуле ИнтеграцияВыгрузка выполняет непосредственное подключение и перенос реквизитов:


Процедура ВыгрузитьДокументВФоне(СсылкаНаДокумент) Экспорт
    // Формируем COM-соединение на сервере
    Попытка
        COMConnector = Новый COMОбъект("V83.COMConnector");
        ПараметрыПодключения = "Srvr=""ServerBase"";Ref=""TargetBase"";Usr=""ExchangeUser"";Pwd=""SecretPass"";";
        ВнешняяБаза = COMConnector.Connect(ПараметрыПодключения);
        
        // Логика передачи данных объекта
        // ...
    Исключение
        ЗаписьЖурналаРегистрации("Интеграция.Выгрузка", УровеньЖурналаРегистрации.Ошибка, , СсылкаНаДокумент, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    КонецПопытки;
КонецПроцедуры

Ограничения использования COM-соединений на сервере

Разберем технические нюансы, с которыми можно столкнуться при использовании V83.COMConnector в фоновых заданиях:

  1. Операционная система сервера: Технология COM поддерживается исключительно в ОС Windows. Если рабочий сервер 1С функционирует под управлением Linux, COM-соединение работать не будет.
  2. Разрядность рабочего процесса: На 64-битном сервере 1С фоновые задания выполняются внутри 64-битного процесса rphost. Для успешного создания объекта требуется регистрация 64-битного COM-коннектора или настройка приложения COM+ (суррогатного процесса dllhost.exe).
  3. Накладные расходы и утечки памяти: При частых запусках фоновых заданий постоянное открытие и закрытие сеансов через COM создает избыточную нагрузку на целевую базу и потребляет лицензии.

Способ 2. Паттерн «Очередь сообщений» (Transactional Outbox)

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

Разберем по шагам реализацию этой схемы:

  1. Создание регистра сведений: Добавляем непериодический регистр сведений ОчередьИсходящихСобытий с измерениями Объект (Ссылка на документ) и ресурсами ДатаСоздания, Статус («К отправке», «В обработке», «Ошибка»), КоличествоПопыток.
  2. Регистрация события: В процедуре ОбработкаПроведения или через подписку на событие ПриЗаписи создаем запись в регистре очереди со статусом «К отправке». Это выполняется в той же транзакции, гарантируя целостность.
  3. Обработка очереди по расписанию: Регламентное задание запускается каждые 30–60 секунд, выбирает порцию неотправленных документов и передает их во внешнюю базу:

Процедура ВыполнитьВыгрузкуОчереди() Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 50
        |    Очередь.Объект КАК ДокументСсылка
        |ИЗ
        |    РегистрСведений.ОчередьИсходящихСобытий КАК Очередь
        |ГДЕ
        |    Очередь.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыОтправки.КОтправке)";
        
    Результат = Запрос.Выполнить().Выгрузить();
    
    Если Результат.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;
    
    // Инициализируем одно соединение на всю пачку документов
    // и выполняем пакетную передачу данных
КонецПроцедуры

Способ 3. Переход на HTTP-сервисы

Посмотрим на современную замену устаревшему механизму COM-соединений. В базе-приемнике создается собственный HTTP-сервис, принимающий данные в формате JSON, а база-источник выполняет асинхронный запрос через объект HTTPСоединение.

Преимущества перехода на HTTP-сервисы:

  1. Кроссплатформенность: Работает на любых операционных системах (Windows, Linux, macOS).
  2. Скорость выполнения: Отсутствуют накладные расходы на тяжеловесную инициализацию сеанса COM-объекта.
  3. Стабильность: Исключаются проблемы с разрядностью библиотек и утечками оперативной памяти на стороне сервера 1С.

Использование фоновых заданий в связке с механизмом очереди или легковесными HTTP-сервисами обеспечивает высокую отзывчивость системы для пользователей и гарантирует доставку данных между конфигурациями.

← На главную