Как изменить состав плана обмена через расширение конфигурации в 1С?

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

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

Почему не работает авторегистрация изменений в режиме совместимости 8.3.10

Проанализируем формулировку из официальной документации к платформе версии 8.3.10: «В расширении имеется возможность управлять контролируемостью состава плана обмена». На практике фраза «управлять контролируемостью» не означает возможность модификации или расширения состава.

В режиме совместимости 8.3.10 свойство Состав является строго контролируемым. Это означает, что при подключении расширения платформа выполняет проверку на совпадение:

  1. Признака участия каждого объекта конфигурации в плане обмена.
  2. Состояния авторегистрации изменений для каждого объекта.

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

Способ 1. Повышение режима совместимости конфигурации

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

  1. Установим режим совместимости основной конфигурации и расширения на значение 8.3.14 или выше (минимально допустимый режим — 8.3.11).
  2. Заимствуем план обмена в расширение.
  3. Добавляем в расширение необходимые объекты метаданных (собственные или заимствованные из основной конфигурации).
  4. В составе заимствованного плана обмена включаем флаги участия и авторегистрации для требуемых объектов.

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

Способ 2. Программная регистрация изменений через перехват событий

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

Разберем по шагам, как перехватить запись объекта в расширении и зарегистрировать его в нужном плане обмена:

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

Посмотрим на пример реализации в модуле:


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

Способ 3. Создание собственного плана обмена в расширении

Начиная с версии 8.3.14, в расширении можно создать собственный независимый план обмена. Это оптимальный вариант, если требуется изолировать логику обмена новыми объектами без вмешательства в типовые узлы.

Учтем ограничение платформы: план обмена, созданный как собственный объект расширения, не может использоваться в качестве Распределенной информационной базы (РИБ). Он подходит только для универсального обмена данными и интеграций через форматы EnterpriseData, XML или JSON.

Особенности работы с подсистемами БСП

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

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