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