Как правильно добавлять зависимые объекты в план обмена для РИБ при выборочной синхронизации

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

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

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

Стандартный механизм состава плана обмена

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

  1. Все зависимые справочники (единицы измерения, виды номенклатуры, контрагенты) должны быть включены в состав плана обмена.
  2. При создании начального образа (СоздатьНачальныйОбраз) система автоматически переносит все данные, входящие в состав.
  3. В дальнейшем регистрируются только изменения.

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

Метод 1: Использование Библиотеки стандартных подсистем (БСП)

В современных конфигурациях задача регистрации связанных объектов эффективно решается через подсистему «Синхронизация данных». Вместо написания собственного кода перебора реквизитов, мы можем использовать Правила регистрации данных (ПРД).

Проанализируем возможности ПРД для решения нашей задачи:

Метод 2: Программная регистрация через подписки на события

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

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


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

В данном примере мы используем метод ПланыОбмена.ЗарегистрироватьИзменения(). Важно помнить, что такой подход может быть рекурсивным, поэтому следует ограничивать глубину поиска или четко определять перечень справочников, требующих регистрации.

Метод 3: Обработчики в модуле плана обмена

Разберем ситуацию, когда нам не нужно регистрировать объект заранее, а мы хотим добавить его непосредственно в момент формирования сообщения обмена. Для этого в модуле плана обмена существуют специальные обработчики.

Посмотрим на метод ПриОтправкеДанныхПодчиненному. В этом обработчике можно проанализировать отправляемый элемент:

  1. Проверяем тип отправляемого объекта (например, ДокументОбъект.РеализацияТоваровУслуг).
  2. Программно находим все связанные справочники в табличных частях.
  3. Если мы понимаем, что этих данных нет в подчиненной базе, мы можем принудительно включить их в выгрузку, изменив параметр Данные или используя возможности XML-сериализации.

Метод 4: Использование типовых обработок для регистрации

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

Риски отсутствия начального образа и способы их минимизации

Выясним, чем опасен подход, выбранный заказчиком (отказ от начального образа). Основная проблема — нарушение ссылочной целостности. Если объект А ссылается на объект Б, а объект Б не попал в регистрацию, пользователь увидит сообщение <Объект не найден>.

Чтобы минимизировать риски, рекомендуем придерживаться следующих правил:

1. Использование признака «Выгружать объекты полностью». В настройках некоторых планов обмена БСП можно указать, что справочники-классификаторы всегда должны выгружаться целиком при любом изменении ссылающихся на них объектов.

2. Контроль «Ленивой загрузки». Хотя в стандартном РИБ этот механизм отсутствует, его можно реализовать программно: если при загрузке в подчиненную базу обнаружена «битая ссылка», система может отправить запрос в центральную базу на регистрацию этого конкретного объекта для следующего сеанса связи.

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

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

← На главную