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

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

При организации информационного обмена между конфигурациями 1С часто возникает классическая задача: в базе-источнике (например, Управление торговлей 11) настроен обмен через универсальный формат (EnterpriseData) с несколькими базами-приемниками. При этом для одного узла (например, Бухгалтерия предприятия 3.0) требуется выгружать полный пакет документов и справочников, а для другого узла (например, Автосервис) — строго ограниченный набор данных, например, только справочники Номенклатура и Контрагенты.

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

Способ 1. Использование штатных настроек БСП (Без программирования)

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

Выполним следующие шаги для настройки узла обмена с базой «Автосервис»:

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

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

Способ 2. Модификация правил регистрации объектов (ПРО) в Конвертации данных

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

Рассмотрим по шагам процесс доработки правил регистрации:

  1. Выгрузим типовые правила регистрации из нашей информационной базы Управление торговлей 11. Сделать это можно в режиме «1С:Предприятие» через форму настройки синхронизации, выбрав пункт сохранения правил в файл.
  2. Запустим специализированную конфигурацию «Конвертация данных» (версии 2.1 или 3.0 в зависимости от формата используемых правил) и загрузим полученный XML-файл правил регистрации.
  3. Найдем в списке правил те объекты, регистрацию которых необходимо заблокировать для базы «Автосервис» (например, документы РеализацияТоваровУслуг, ПоступлениеТоваровУслуг и т.д.).
  4. Для каждого из этих объектов перейдем к обработчику событий «После обработки» (или «Перед обработкой»). Нам доступна встроенная коллекция Получатели, которая содержит массив узлов обмена, для которых система пытается зарегистрировать изменения текущего объекта.
  5. Напишем алгоритм, который проверяет код или наименование узла-получателя и удаляет узел «Автосервиса» из этой коллекции.

Посмотрим на пример кода, который решает эту задачу:


// Исключаем регистрацию объекта для узла Автосервиса
Индекс = Получатели.Количество() - 1;
Пока Индекс >= 0 Цикл
    ТекущийПолучатель = Получатели[Индекс];
    
    // Идентификацию узла производим по уникальному коду или реквизиту "ВариантНастройки"
    Если ТекущийПолучатель.Код = "Код_Узла_Автосервиса" Тогда 
        Получатели.Удалить(Индекс);
    КонецЕсли;
    
    Индекс = Индекс - 1;
КонецЦикла;

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

Способ 3. Применение расширения конфигурации (Решение для разработчиков)

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

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

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

  1. Создадим новое расширение конфигурации в конфигураторе Управление торговлей.
  2. Добавим в расширение подписку на событие ПередЗаписью для интересующей нас группы документов или справочников. Альтернативный вариант — переопределить общий модуль БСП, отвечающий за регистрацию (например, ОбменДаннымиСобытия).
  3. В модуле расширения напишем процедуру-обработчик, которая будет анализировать свойство ОбменДанными.Получатели записываемого объекта.

Рассмотрим пример программного кода для реализации в расширении:


&После("ПередЗаписьюРегистрацияДокумента")
Процедура Расш_ПередЗаписьюРегистрацияДокумента(Источник, Отказ, РежимЗаписи, РежимПроведения)
    
    // Если запись происходит в режиме загрузки данных, игнорируем обработку
    Если Источник.ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    
    // Находим узел обмена Автосервиса по его коду в плане обмена
    УзелАвтосервиса = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.НайтиПоКоду("КОД_АВТОСЕРВИСА");
    
    Если ЗначениеЗаполнено(УзелАвтосервиса) Тогда
        // Проверяем, зарегистрирован ли данный узел в получателях объекта
        Если Источник.ОбменДанными.Получатели.Содержит(УзелАвтосервиса) Тогда
            // Удаляем узел из получателей, предотвращая физическую регистрацию изменений
            Источник.ОбменДанными.Получатели.Удалить(УзелАвтосервиса);
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Использование расширения конфигурации обеспечивает максимальную надежность и производительность системы. Данный код выполняется непосредственно в транзакции записи объекта, предотвращая появление "мусорных" записей в таблицах регистрации изменений (таблицах регистрации планов обмена), что положительно сказывается на стабильности работы СУБД.

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

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

← На главную