Как настроить обмен через универсальный формат для подмножества данных и избежать ошибки «Не найден ПОД»?

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

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

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

В чем суть проблемы?

Представим типовую ситуацию. В базе-источнике (например, 1С:Управление торговлей) уже настроен и активно используется типовой обмен по плану обмена СинхронизацияДанныхЧерезУниверсальныйФормат. Вам понадобилось настроить обмен со второй, абсолютно другой базой (допустим, с другой УТ или локальной CRM-системой). При этом состав передаваемых данных для нового обмена в разы меньше, а также были добавлены 3 новых справочника, которые должны мигрировать только в эту новую систему.

Если попытаться использовать существующий типовой план обмена, добавив туда новые объекты, то возникнет критическая проблема:

Давайте по шагам разберем, как решить эту проблему красиво и архитектурно верно.

---

Шаг 1. Создание и интеграция нового плана обмена в БСП

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

Рассмотрим, как правильно создать и прописать новый план обмена в Библиотеке Стандартных Подсистем (БСП):

  1. Откроем конфигурацию в режиме «Конфигуратор».
  2. Создадим новый план обмена. Лучше всего скопировать типовой СинхронизацияДанныхЧерезУниверсальныйФормат и назвать его, например, УдаленныйОбменМинимум.
  3. В составе нового плана обмена оставим галочки только у тех объектов метаданных, которые действительно должны участвовать в новой интеграции. Все лишние документы и справочники отключаем. Это сразу решит проблему избыточной регистрации «мусорных» данных.
  4. Убедимся, что у нашего плана обмена присутствуют все стандартные реквизиты БСП (такие как ВариантНастройки, ВерсияФорматаОбмена, РежимВыгрузкиДокументов и др.).

Теперь нам нужно сообщить БСП, что наш новый план обмена должен работать по технологии универсального формата (XDTO). Для этого перейдем в общий модуль ОбменДаннымиПереопределяемый и найдем процедуру ПолучитьПланыОбмена (в разных версиях БСП она может называться ПолучитьПланыОбменаСинхронизацииДанных). Добавим туда наш план обмена:


Процедура ПолучитьПланыОбмена(ПланыОбменаПодсистемы) Экспорт
    ПланыОбменаПодсистемы.Добавить(ПланыОбмена.УдаленныйОбменМинимум);КонецПроцедуры

Следующим шагом настроим модуль менеджера созданного плана обмена. В нем обязательно должна быть процедура ПриПолученииНастроек, где мы явно укажем БСП, что данный обмен использует XDTO-технологию:


Процедура ПриПолученииНастроек(Настройки) Экспорт
    Настройки.ЭтоПланОбменаXDTO = Истина;
    Настройки.ВерсииФорматаОбмена.Добавить("1.5"); // Указываем поддерживаемые версии формата
КонецПроцедуры

---

Шаг 2. Разграничение правил регистрации в КД 2.1 / КД 3.1

Для того чтобы объекты регистрировались к обмену автоматически (при записи документов или справочников), используются Правила регистрации объектов (ПРО).

Здесь важно прояснить частую путаницу среди разработчиков: конвертация и правила обмена в концепции EnterpriseData пишутся в «Конвертации данных 3», а вот правила регистрации (ПРО) для планов обмена исторически настраиваются в интерфейсе «Конвертации данных 2.1» (либо напрямую в КД 3.1, которая умеет генерировать XML-схемы регистрации).

Чтобы новые справочники регистрировались только для нашего нового плана обмена УдаленныйОбменМинимум и ни в коем случае не попадали на узлы типовой синхронизации, настроим правила регистрации следующим образом:

  1. В базе «Конвертация данных» откроем правила регистрации для нашей конфигурации.
  2. Для каждого из трех новых справочников создадим новое правило регистрации.
  3. В обработчике Перед обработкой или При регистрации напишем код, который проверяет тип плана обмена текущего узла-получателя:

// Ограничиваем регистрацию новых справочников только целевым планом обмена
Если Получатель.Метаданные().Имя <> "УдаленныйОбменМинимум" Тогда
    Отказ = Истина;
КонецЕсли;

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

---

Шаг 3. Защита от ошибки «Не найден ПОД» (создание заглушек в коде)

Даже при идеально настроенных правилах регистрации существует вероятность, что объект будет зарегистрирован принудительно (например, через обработку «Регистрация изменений для обмена» или из-за ссылочной целостности при переносе связанного документа). Если это произойдет, старый обмен попытается выгрузить этот объект и упадет с ошибкой, так как в общем модуле МенеджерОбменаЧерезУниверсальныйФормат для него нет соответствующего ПОД.

Для предотвращения таких аварийных остановок мы можем применить два надежных программных метода.

Метод А. Фильтрация выгрузки на уровне ПОД (Правил обработки данных)

Мы можем объявить правила обработки данных для наших новых справочников в менеджере обмена, но сделать их неактивными для старых планов обмена или устаревших версий универсального формата.

В общем модуле МенеджерОбменаЧерезУниверсальныйФормат найдем процедуру, отвечающую за инициализацию правил обработки данных (ПОД), и добавим условие:


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

При таком подходе движок обмена БСП просто проигнорирует объект при выгрузке на старых узлах, автоматически снимет его с регистрации и продолжит сеанс синхронизации без ошибок.

---

Шаг 4. Использование расширений конфигурации (современный стандарт)

Прямая правка общего модуля МенеджерОбменаЧерезУниверсальныйФормат крайне нежелательна, поскольку это сильно усложнит последующие типовые обновления конфигурации. Все наши доработки по новому обмену следует выносить в расширение конфигурации.

Давайте посмотрим, как перехватить регистрацию правил обмена в расширении. Мы можем использовать аннотацию &После для процедуры инициализации правил:


&После("ЗаполнитьПравилаОбработкиДанных")
Процедура Расш_ЗаполнитьПравилаОбработкиДанных(ПравилаОбработкиДанных)
    // Код добавления правил только для нашего расширения
    // Здесь мы регистрируем новые ПОДы и ПКО для новых справочников
КонецПроцедуры

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

---

Резюме и чеклист для внедрения

Подведем итог. Чтобы успешно реализовать обмен для усеченного состава данных через универсальный формат, выполните следующие действия:

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