При настройке синхронизации данных между конфигурациями 1С (например, Управление торговлей 10.3 и Розница) по правилам обмена через direct COM-соединение нередко возникает специфическая задача. Если сеанс обмена прерывается из-за сбоя сети или ошибки записи на стороне приемника, весь выгружаемый пакет данных отправляется повторно при следующем запуске. Чтобы избежать дублирования передачи уже записанных объектов, разработчики стремятся снимать объекты с регистрации изменений сразу же после их успешной выгрузки в базу-приемник.
Рассмотрим детально, как устроена передача данных через COM-соединение, где именно в типовой обработке ОбменДаннымиXML происходит запись элементов и какими способами можно реализовать очистку регистрации.
Проанализируем алгоритм работы типовой обработки ОбменДаннымиXML. При обмене через файл данные сначала формируются в единый XML-документ, и только после его полная загрузка в приемнике генерирует файл-ответ (квитанцию), который очищает регистрацию в источнике. Однако при установленном флаге НепосредственноеЧтениеВИБПриемнике = Истина (прямое COM-соединение) передача данных происходит динамически.
Каждый объект сериализуется в XML-строку и передается в информационную базу-приемник через процедуру ПередатьИнформациюОЗаписиВПриемник. При этом результат записи возвращается сразу, что позволяет определить, успешно ли сохранился конкретный объект на стороне получателя.
Разберем по шагам доработку модуля обработки ОбменДаннымиXML на стороне базы-источника. Основная точка входа для отправки порций данных — процедура ЗаписатьВФайл. В случае использования COM-соединения фактической записи во временный файл на диске не происходит, а данные передаются напрямую в приемник.
Посмотрим на структуру процедур взаимодействия:
Процедура ЗаписатьВФайл(Узел)
Если ТипЗнч(Узел) <> одТипСтрока Тогда
ИнформацияДляЗаписиВФайл = Узел.Закрыть();
Иначе
ИнформацияДляЗаписиВФайл = Узел;
КонецЕсли;
Если НепосредственноеЧтениеВИБПриемнике Тогда
СтрокаОшибкиВБазеПриемнике = "";
ПередатьИнформациюОЗаписиВПриемник(ИнформацияДляЗаписиВФайл, СтрокаОшибкиВБазеПриемнике);
Если Не ПустаяСтрока(СтрокаОшибкиВБазеПриемнике) Тогда
ВызватьИсключение СтрокаОшибкиВБазеПриемнике;
Иначе
// Объект успешно записан в базе-приемнике.
// Здесь можно вызвать снятие с регистрации текущего объекта
КонецЕсли;
Иначе
ФайлОбмена.ЗаписатьСтроку(ИнформацияДляЗаписиВФайл);
КонецЕсли;
КонецПроцедуры
Для снятия конкретного документа или справочника с регистрации изменений применяется метод платформы ПланыОбмена.УдалитьРегистрациюИзменений(). Выясним, как правильно сформировать вызов данного метода:
// УзелОбмена - Ссылка на узел плана обмена, для которого выполняется выгрузка
// СсылкаНаОбъект - Ссылка на выгруженный справочник или документ
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, СсылкаНаОбъект);
Также доработку можно разместить в функции ВыгрузкаОбъектаВыборки или обработчике события ВызватьСобытияПослеВыгрузкиОбъекта. Если глобальный флаг ошибки Отказ равен Ложь, программа выполняет очистку регистрации для текущей ссылки:
Если Не Отказ Тогда
УзелОбмена = НастройкиОбмена.УзелИнформационнойБазы;
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, ВыгружаемыйОбъект.Ссылка);
КонецЕсли;
Если нет необходимости вносить изменения в программный код типовой обработки ОбменДаннымиXML, рекомендуем использовать стандартную схему квитирования platform 1С, настроив двухсторонний обмен.
Разберем данный вариант по шагам:
Розница) создается настройка обмена с узлом базы-источника (УТ).При таком подходе база-приемник сформирует ответное сообщение с номером принятого пакета. При чтении квитанции база-источник автоматически удалит регистрацию всех объектов, которые вошли в успешно обработанный пакет, средствами платформы без риска нарушения целостности данных.
Проанализируем технические нюансы, которые следует учитывать при реализации пообъектного снятия изменений:
УдалитьРегистрациюИзменений на каждый объект в цикле приводит к большим накладным расходам и частым блокировкам системных таблиц регистрации. Оптимальнее накапливать ссылки выгруженных объектов в массив и очищать их порциями (например, по 50–100 штук).ПланыОбмена.УдалитьРегистрациюИзменений() требует передачи ссылки для элементов и документов, но для регистров сведений и накопления необходимо передавать объект НаборЗаписей с заполненным отбором или ключ записи. Передача ссылки для регистра приведет к ошибке выполнения.