Как организовать обмен данными между идентичными конфигурациями 1С:ERP без использования правил обмена?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет
← На главную

При работе с крупными системами на базе 1С:ERP 2.4 часто возникает необходимость синхронизации данных между двумя абсолютно одинаковыми информационными базами. Традиционный путь — использование Библиотеки стандартных подсистем (БСП) и создание правил конвертации в программе "Конвертация данных 2.0". Однако этот метод накладывает серьезные обязательства по поддержке правил в актуальном состоянии при каждом обновлении конфигураций.

В этой статье мы разберем альтернативный и более элегантный способ: настройку обмена через Планы обмена без использования внешних файлов правил. Этот механизм основан на встроенной XDTO-сериализации БСП, которая позволяет объектам «узнавать» друг друга в разных базах без лишних посредников.

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

Когда мы создаем свой план обмена на основе типового механизма БСП и не указываем правила обмена, система переходит в режим прямой сериализации. На первый взгляд все работает, но при детальном анализе возникают две критические проблемы:

  1. Разрыв ссылочной целостности: Документы выгружаются, но связанные с ними справочники (контрагенты, номенклатура) не попадают в пакет выгрузки, если они не зарегистрированы на узле обмена отдельно. В базе-приемнике вместо них появляется печально известная надпись Объект не найден.
  2. Отсутствие проведения: Документы загружаются в информационную базу «молча» — в режиме загрузки данных (ОбменДанными.Загрузка = Истина). При этом движения по регистрам не формируются, и документы остаются непроведенными.

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

Решение первой задачи: выгрузка объектов по ссылкам

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

Для правильной реализации нам необходимо задействовать программный интерфейс БСП. Рассмотрим, как это сделать через Модуль менеджера плана обмена или через расширение общего модуля ОбменДаннымиСервер. Основная задача — переопределить настройки состава выгрузки.

В модуле менеджера вашего плана обмена следует обратить внимание на процедуру, которая определяет параметры выгрузки. Нам нужно программно установить свойство ВыгружатьОбъектыПоСсылке. Рассмотрим пример логики, которую можно внедрить:


// В общем модуле ОбменДаннымиСервер или в расширении
Процедура ПриОпределенииНастроекПлановОбмена(Настройки) Экспорт
    // Находим наш план обмена и устанавливаем параметры
    Если Настройки.ИмяПлановОбмена = "МойПланОбменаБезПравил" Тогда
        Настройки.ВыгружатьОбъектыПоСсылке = Истина;
    КонецЕсли;
КонецПроцедуры

При такой настройке система, встречая ссылку на справочник внутри документа, автоматически включит этот справочник в XML-пакет. Важный нюанс: сопоставление объектов в этом режиме происходит строго по GUID (Уникальному Идентификатору). Если вы создавали контрагентов вручную в обеих базах, их идентификаторы не совпадут, и система создаст дубль. Поэтому для работы «без правил» базы должны иметь общую историю или справочники должны быть предварительно синхронизированы.

Решение второй задачи: автоматическое проведение документов

Разберем, почему документы не проводятся автоматически. Механизм ПрочитатьXML(), используемый БСП при загрузке, записывает объект с установленным флагом ОбменДанными.Загрузка = Истина. Это блокирует все стандартные обработчики событий, включая ОбработкаПроведения.

Чтобы решить эту проблему красиво, мы можем использовать механизм дополнительных свойств объекта. Посмотрим на пример доработки в расширении для процедуры ВыполнитьСтандартнуюЗагрузкуПорцииДанных общего модуля ОбменДаннымиСервер:


&После("ВыполнитьСтандартнуюЗагрузкуПорцииДанных")
Процедура ПостОбработкаЗагрузки(КомпонентОбмена, ЧтениеXML)
    // После успешной загрузки порции данных, нам нужно 
    // отобрать документы и поставить их в очередь на проведение.
    Для Каждого ОбъектДляЗаписи Из КомпонентОбмена.СписокОбъектовДляЗаписи Цикл
        Если Метаданные.Документы.Содержит(ОбъектДляЗаписи.Метаданные()) Тогда
            СсылкаНаДокумент = ОбъектДляЗаписи.Ссылка;
            // Вариант 1: Прямое проведение (не рекомендуется для тяжелых баз)
            // ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
            // ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
            
            // Вариант 2: Добавление в очередь отложенного проведения БСП
            ОбменДаннымиСервер.ЗарегистрироватьОтложенноеПроведение(СсылкаНаДокумент);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Использование метода ЗарегистрироватьОтложенноеПроведение — это Best Practice для 1С:ERP. Это позволяет системе выполнить проведение в фоновом режиме, не блокируя процесс обмена и не перегружая сервер транзакциями загрузки.

Альтернативный путь: Использование Universal Format (EnterpriseData)

Если вы хотите избежать написания кода в расширениях, проанализируем штатную возможность ERP — синхронизацию через Универсальный формат (EnterpriseData). Это современный стандарт обмена, который также не требует ручного создания файлов правил (xml из КД 2.0).

Преимущества EnterpriseData для идентичных конфигураций:

  1. Поддержка версионности: Правила формата встроены в саму ERP и обновляются компанией 1С автоматически.
  2. Гибкая настройка выгрузки: В настройках узла можно указать «Отправлять только используемые в документах», что полностью решает вопрос излишней выгрузки справочников.
  3. Автоматическое проведение: В типовых настройках синхронизации есть флаг «Проводить документы при загрузке».
  4. Сопоставление: Система позволяет настроить поля поиска (например, по ИНН/КПП для контрагентов), если GUID в базах различаются.

Для настройки такого обмена достаточно зайти в раздел НСИ и Администрирование — Синхронизация данных, выбрать «Новая синхронизация» и указать тип «Синхронизация через универсальный формат». При выборе версии формата (например, 1.13) убедитесь, что обе базы поддерживают её.

Резюме и рекомендации

Мы рассмотрели два основных пути реализации обмена без правил обмена. Выясним, какой выбрать именно вам:

Выбирайте свой план обмена с прямой сериализацией, если:

Выбирайте EnterpriseData, если:

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

← На главную