При организации информационного обмена между конфигурациями 1С часто возникает классическая задача: в базе-источнике (например, Управление торговлей 11) настроен обмен через универсальный формат (EnterpriseData) с несколькими базами-приемниками. При этом для одного узла (например, Бухгалтерия предприятия 3.0) требуется выгружать полный пакет документов и справочников, а для другого узла (например, Автосервис) — строго ограниченный набор данных, например, только справочники Номенклатура и Контрагенты.
Сложность заключается в том, что план обмена СинхронизацияДанныхЧерезУниверсальныйФормат содержит единые правила регистрации объектов (ПРО) для всех своих узлов. Если мы просто отключим регистрацию документов в правилах, они перестанут выгружаться и в бухгалтерию. В этой статье мы подробно разберем, как решить эту проблему, минимизировав изменения в конфигурации.
Прежде чем приступать к доработке кода или правил регистрации, проанализируем штатные возможности Библиотеки стандартных подсистем (БСП), на базе которой построен обмен. В современных версиях БСП предусмотрена индивидуальная настройка состава отправляемых данных для каждого узла обмена непосредственно в пользовательском режиме.
Выполним следующие шаги для настройки узла обмена с базой «Автосервис»:
Номенклатура и Контрагенты настроим режим выгрузки «Выгружать всегда» или укажем конкретные отборы (например, по группам номенклатуры или сегментам партнеров).Этот способ является наиболее предпочтительным, так как он полностью сохраняет типовую конфигурацию и не требует поддержки внешних файлов правил регистрации при обновлении программных продуктов 1С.
Если штатных интерактивных отборов БСП оказывается недостаточно (например, требуется реализовать сложную логику, зависящую от реквизитов объектов или специфических условий), мы можем доработать непосредственно правила регистрации объектов. Несмотря на то, что правила регистрации одни на весь план обмена, внутри их обработчиков мы можем программно разделять логику для разных получателей.
Рассмотрим по шагам процесс доработки правил регистрации:
Управление торговлей 11. Сделать это можно в режиме «1С:Предприятие» через форму настройки синхронизации, выбрав пункт сохранения правил в файл.РеализацияТоваровУслуг, ПоступлениеТоваровУслуг и т.д.).Получатели, которая содержит массив узлов обмена, для которых система пытается зарегистрировать изменения текущего объекта.Посмотрим на пример кода, который решает эту задачу:
// Исключаем регистрацию объекта для узла Автосервиса
Индекс = Получатели.Количество() - 1;
Пока Индекс >= 0 Цикл
ТекущийПолучатель = Получатели[Индекс];
// Идентификацию узла производим по уникальному коду или реквизиту "ВариантНастройки"
Если ТекущийПолучатель.Код = "Код_Узла_Автосервиса" Тогда
Получатели.Удалить(Индекс);
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
После внесения изменений сохраним правила регистрации в файл и загрузим их обратно в настройки синхронизации 1С. Данный подход гарантирует, что при интерактивном изменении документов пользователями в базе-источнике, зарегистрированные изменения для узла «Автосервис» будут мгновенно удаляться, не создавая избыточную нагрузку на каналы связи и не засоряя базу-приемник.
Если мы хотим избежать постоянной поддержки внешних файлов правил регистрации при обновлениях конфигурации Управление торговлей, наиболее технологичным и современным подходом будет перехват механизмов регистрации через **расширение конфигурации**.
Проанализируем ситуацию: при записи любого объекта платформой 1С вызываются обработчики подписок на события, отвечающие за автоматическую регистрацию изменений на узлах планов обмена. Мы можем переопределить это поведение.
Разберем по шагам реализацию этого механизма:
Управление торговлей.ПередЗаписью для интересующей нас группы документов или справочников. Альтернативный вариант — переопределить общий модуль БСП, отвечающий за регистрацию (например, ОбменДаннымиСобытия).ОбменДанными.Получатели записываемого объекта.Рассмотрим пример программного кода для реализации в расширении:
&После("ПередЗаписьюРегистрацияДокумента")
Процедура Расш_ПередЗаписьюРегистрацияДокумента(Источник, Отказ, РежимЗаписи, РежимПроведения)
// Если запись происходит в режиме загрузки данных, игнорируем обработку
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Находим узел обмена Автосервиса по его коду в плане обмена
УзелАвтосервиса = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.НайтиПоКоду("КОД_АВТОСЕРВИСА");
Если ЗначениеЗаполнено(УзелАвтосервиса) Тогда
// Проверяем, зарегистрирован ли данный узел в получателях объекта
Если Источник.ОбменДанными.Получатели.Содержит(УзелАвтосервиса) Тогда
// Удаляем узел из получателей, предотвращая физическую регистрацию изменений
Источник.ОбменДанными.Получатели.Удалить(УзелАвтосервиса);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Использование расширения конфигурации обеспечивает максимальную надежность и производительность системы. Данный код выполняется непосредственно в транзакции записи объекта, предотвращая появление "мусорных" записей в таблицах регистрации изменений (таблицах регистрации планов обмена), что положительно сказывается на стабильности работы СУБД.
Мы рассмотрели три кардинально отличающихся подхода к решению задачи выборочной регистрации данных при обмене через универсальный формат. Выясним, какой из них лучше применить в вашей ситуации: