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