Как реализовать правила регистрации в плане обмена для нетиповой конфигурации без БСП?

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

В типовых конфигурациях 1С (таких как БП 3.0, УТ 11 или ERP) механизмы регистрации объектов для обмена данными глубоко интегрированы с Библиотекой стандартных подсистем (БСП). Однако при работе с самописными или сильно измененными старыми конфигурациями, где БСП отсутствует, разработчики сталкиваются с проблемой: как эффективно управлять регистрацией объектов на узлах плана обмена, не превращая код в нагромождение условий. Разберем по шагам, как можно реализовать этот функционал, используя возможности платформы 1С.

Основы механизма регистрации в платформе

Для начала проанализируем ситуацию и вспомним, что платформа 1С предоставляет два базовых способа управления регистрацией изменений для ПланОбмена:

  1. Авторегистрация: Настраивается в свойствах объекта, входящего в состав плана обмена. Она может быть либо "Разрешить", либо "Запретить".
  2. Программная регистрация: Использование метода ПланыОбмена.ЗарегистрироватьИзменения().

Если конфигурация нетиповая, у нас нет готового интерфейса для загрузки XML-файлов правил регистрации (ПР), созданных в "Конвертации данных". Поэтому нам придется реализовать "движок" для их исполнения самостоятельно или выбрать альтернативный путь фильтрации данных.

Решение 1. Использование подписок на события

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

Рассмотрим пример реализации в модуле подписки. Предположим, нам нужно регистрировать документ только в том случае, если он проведен и относится к определенной организации:


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

Решение 2. Вынос правил в макеты (имитация БСП)

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

Разберем, как это работает:

  1. Создаем макет с типом "Текст", где прописываем логику на языке 1С.
  2. В момент срабатывания подписки на событие считываем этот текст.
  3. Используем команду Выполнить() для исполнения кода.

Это позволяет менять логику регистрации в пользовательском режиме без изменения метаданных конфигурации. Однако стоит помнить, что использование Выполнить() может несколько снизить производительность при массовой записи объектов.

Решение 3. Фильтрация при выгрузке (отложенная регистрация)

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

В этом случае в процедуре выгрузки мы используем следующий подход:


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

Решение 4. Использование СКД для правил регистрации

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

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

Преимущества метода СКД:

Рекомендации по оптимизации

Проанализируем ситуацию с большими базами данных. Если вы решили реализовать регистрацию через подписки, важно соблюдать несколько правил, чтобы не "положить" систему:

  1. Проверка ОбменДанными.Загрузка: Всегда в начале обработчика проверяйте Источник.ОбменДанными.Загрузка. Если это Истина — регистрация не нужна, так как данные пришли из другой базы.
  2. Индексация полей: Все поля, которые участвуют в фильтрах (Организация, Склад, Подразделение), должны быть индексированы.
  3. Минимизация обращений к базе: Старайтесь получать все необходимые данные из свойств самого Источник, не выполняя дополнительных запросов к БД внутри цикла по узлам.

Выбор конкретного метода зависит от сложности ваших правил. Если правила простые (например, только по Организации) — достаточно простого кода в подписке. Если вы планируете использовать сложные правила из "Конвертации данных 2.0", посмотрите в сторону упрощенных модулей-парсеров XML, которые можно найти на профильных ресурсах и внедрить в свою конфигурацию как отдельный общий модуль.

← На главную