При работе с крупными системами на базе 1С:ERP 2.4 часто возникает необходимость синхронизации данных между двумя абсолютно одинаковыми информационными базами. Традиционный путь — использование Библиотеки стандартных подсистем (БСП) и создание правил конвертации в программе "Конвертация данных 2.0". Однако этот метод накладывает серьезные обязательства по поддержке правил в актуальном состоянии при каждом обновлении конфигураций.
В этой статье мы разберем альтернативный и более элегантный способ: настройку обмена через Планы обмена без использования внешних файлов правил. Этот механизм основан на встроенной XDTO-сериализации БСП, которая позволяет объектам «узнавать» друг друга в разных базах без лишних посредников.
Когда мы создаем свой план обмена на основе типового механизма БСП и не указываем правила обмена, система переходит в режим прямой сериализации. На первый взгляд все работает, но при детальном анализе возникают две критические проблемы:
Объект не найден.ОбменДанными.Загрузка = Истина). При этом движения по регистрам не формируются, и документы остаются непроведенными.Проанализируем ситуацию и найдем способы решения этих задач без возврата к сложным правилам конвертации.
Выясним причину, по которой справочники не уходят вместе с документами. В стандартном режиме обмена без правил БСП ориентируется на таблицу регистрации изменений. Если вы включили авторегистрацию только для документов, то справочники просто не попадают в выборку. Попытка зарегистрировать все справочники целиком — плохая идея, так как это перегрузит каналы связи и создаст в базе-приемнике массу ненужной информации.
Для правильной реализации нам необходимо задействовать программный интерфейс БСП. Рассмотрим, как это сделать через Модуль менеджера плана обмена или через расширение общего модуля ОбменДаннымиСервер. Основная задача — переопределить настройки состава выгрузки.
В модуле менеджера вашего плана обмена следует обратить внимание на процедуру, которая определяет параметры выгрузки. Нам нужно программно установить свойство ВыгружатьОбъектыПоСсылке. Рассмотрим пример логики, которую можно внедрить:
// В общем модуле ОбменДаннымиСервер или в расширении
Процедура ПриОпределенииНастроекПлановОбмена(Настройки) Экспорт
// Находим наш план обмена и устанавливаем параметры
Если Настройки.ИмяПлановОбмена = "МойПланОбменаБезПравил" Тогда
Настройки.ВыгружатьОбъектыПоСсылке = Истина;
КонецЕсли;
КонецПроцедуры
При такой настройке система, встречая ссылку на справочник внутри документа, автоматически включит этот справочник в XML-пакет. Важный нюанс: сопоставление объектов в этом режиме происходит строго по GUID (Уникальному Идентификатору). Если вы создавали контрагентов вручную в обеих базах, их идентификаторы не совпадут, и система создаст дубль. Поэтому для работы «без правил» базы должны иметь общую историю или справочники должны быть предварительно синхронизированы.
Разберем, почему документы не проводятся автоматически. Механизм ПрочитатьXML(), используемый БСП при загрузке, записывает объект с установленным флагом ОбменДанными.Загрузка = Истина. Это блокирует все стандартные обработчики событий, включая ОбработкаПроведения.
Чтобы решить эту проблему красиво, мы можем использовать механизм дополнительных свойств объекта. Посмотрим на пример доработки в расширении для процедуры ВыполнитьСтандартнуюЗагрузкуПорцииДанных общего модуля ОбменДаннымиСервер:
&После("ВыполнитьСтандартнуюЗагрузкуПорцииДанных")
Процедура ПостОбработкаЗагрузки(КомпонентОбмена, ЧтениеXML)
// После успешной загрузки порции данных, нам нужно
// отобрать документы и поставить их в очередь на проведение.
Для Каждого ОбъектДляЗаписи Из КомпонентОбмена.СписокОбъектовДляЗаписи Цикл
Если Метаданные.Документы.Содержит(ОбъектДляЗаписи.Метаданные()) Тогда
СсылкаНаДокумент = ОбъектДляЗаписи.Ссылка;
// Вариант 1: Прямое проведение (не рекомендуется для тяжелых баз)
// ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
// ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
// Вариант 2: Добавление в очередь отложенного проведения БСП
ОбменДаннымиСервер.ЗарегистрироватьОтложенноеПроведение(СсылкаНаДокумент);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Использование метода ЗарегистрироватьОтложенноеПроведение — это Best Practice для 1С:ERP. Это позволяет системе выполнить проведение в фоновом режиме, не блокируя процесс обмена и не перегружая сервер транзакциями загрузки.
Если вы хотите избежать написания кода в расширениях, проанализируем штатную возможность ERP — синхронизацию через Универсальный формат (EnterpriseData). Это современный стандарт обмена, который также не требует ручного создания файлов правил (xml из КД 2.0).
Преимущества EnterpriseData для идентичных конфигураций:
GUID в базах различаются.Для настройки такого обмена достаточно зайти в раздел НСИ и Администрирование — Синхронизация данных, выбрать «Новая синхронизация» и указать тип «Синхронизация через универсальный формат». При выборе версии формата (например, 1.13) убедитесь, что обе базы поддерживают её.
Мы рассмотрели два основных пути реализации обмена без правил обмена. Выясним, какой выбрать именно вам:
Выбирайте свой план обмена с прямой сериализацией, если:
GUID в обеих базах.Выбирайте EnterpriseData, если:
Помните, что создание обмена через расширение модуля ОбменДаннымиСервер — это мощный инструмент, но он требует внимательного тестирования на больших объемах данных, чтобы избежать блокировок при автоматическом проведении документов.