При развитии и поддержке корпоративных информационных систем на базе 1С программисты часто сталкиваются с необходимостью организовать обмен данными между типовыми конфигурациями. Современным стандартом для таких задач является технология EnterpriseData (универсальный формат обмена). Однако стандартные сценарии настройки часто дают сбой, когда требуется передавать лишь малую часть объектов (подмножество данных) в новую базу, не нарушая при этом уже существующие и успешно работающие обмены (например, обмен с 1С:Бухгалтерией).
В этой статье мы подробно разберем, как решить данную задачу: настроить отдельный план обмена на основе универсального формата, корректно разграничить правила регистрации объектов и полностью исключить критическую ошибку Не найден ПОД для объекта метаданных.
Представим типовую ситуацию. В базе-источнике (например, 1С:Управление торговлей) уже настроен и активно используется типовой обмен по плану обмена СинхронизацияДанныхЧерезУниверсальныйФормат. Вам понадобилось настроить обмен со второй, абсолютно другой базой (допустим, с другой УТ или локальной CRM-системой). При этом состав передаваемых данных для нового обмена в разы меньше, а также были добавлены 3 новых справочника, которые должны мигрировать только в эту новую систему.
Если попытаться использовать существующий типовой план обмена, добавив туда новые объекты, то возникнет критическая проблема:
Давайте по шагам разберем, как решить эту проблему красиво и архитектурно верно.
---
Пытаться уместить разные по смыслу обмены в один типовой план обмена — это тупиковый путь, который приведет к усложнению правил регистрации и постоянным сбоям. Правильным решением является создание собственного плана обмена.
Рассмотрим, как правильно создать и прописать новый план обмена в Библиотеке Стандартных Подсистем (БСП):
СинхронизацияДанныхЧерезУниверсальныйФормат и назвать его, например, УдаленныйОбменМинимум.ВариантНастройки, ВерсияФорматаОбмена, РежимВыгрузкиДокументов и др.).Теперь нам нужно сообщить БСП, что наш новый план обмена должен работать по технологии универсального формата (XDTO). Для этого перейдем в общий модуль ОбменДаннымиПереопределяемый и найдем процедуру ПолучитьПланыОбмена (в разных версиях БСП она может называться ПолучитьПланыОбменаСинхронизацииДанных). Добавим туда наш план обмена:
Процедура ПолучитьПланыОбмена(ПланыОбменаПодсистемы) Экспорт
ПланыОбменаПодсистемы.Добавить(ПланыОбмена.УдаленныйОбменМинимум);КонецПроцедуры
Следующим шагом настроим модуль менеджера созданного плана обмена. В нем обязательно должна быть процедура ПриПолученииНастроек, где мы явно укажем БСП, что данный обмен использует XDTO-технологию:
Процедура ПриПолученииНастроек(Настройки) Экспорт
Настройки.ЭтоПланОбменаXDTO = Истина;
Настройки.ВерсииФорматаОбмена.Добавить("1.5"); // Указываем поддерживаемые версии формата
КонецПроцедуры
---
Для того чтобы объекты регистрировались к обмену автоматически (при записи документов или справочников), используются Правила регистрации объектов (ПРО).
Здесь важно прояснить частую путаницу среди разработчиков: конвертация и правила обмена в концепции EnterpriseData пишутся в «Конвертации данных 3», а вот правила регистрации (ПРО) для планов обмена исторически настраиваются в интерфейсе «Конвертации данных 2.1» (либо напрямую в КД 3.1, которая умеет генерировать XML-схемы регистрации).
Чтобы новые справочники регистрировались только для нашего нового плана обмена УдаленныйОбменМинимум и ни в коем случае не попадали на узлы типовой синхронизации, настроим правила регистрации следующим образом:
Перед обработкой или При регистрации напишем код, который проверяет тип плана обмена текущего узла-получателя:
// Ограничиваем регистрацию новых справочников только целевым планом обмена
Если Получатель.Метаданные().Имя <> "УдаленныйОбменМинимум" Тогда
Отказ = Истина;
КонецЕсли;
Такой подход гарантирует, что даже если пользователь вручную или программно попытается записать новый справочник, система автоматически заблокирует его регистрацию на узлах обмена с Бухгалтерией.
---
Даже при идеально настроенных правилах регистрации существует вероятность, что объект будет зарегистрирован принудительно (например, через обработку «Регистрация изменений для обмена» или из-за ссылочной целостности при переносе связанного документа). Если это произойдет, старый обмен попытается выгрузить этот объект и упадет с ошибкой, так как в общем модуле МенеджерОбменаЧерезУниверсальныйФормат для него нет соответствующего ПОД.
Для предотвращения таких аварийных остановок мы можем применить два надежных программных метода.
Мы можем объявить правила обработки данных для наших новых справочников в менеджере обмена, но сделать их неактивными для старых планов обмена или устаревших версий универсального формата.
В общем модуле МенеджерОбменаЧерезУниверсальныйФормат найдем процедуру, отвечающую за инициализацию правил обработки данных (ПОД), и добавим условие:
Процедура ПОД_Справочник_НовыйСправочник_Отправка_ПриОбработке(ДанныеИБ, ИспользованиеПКО, КомпонентыОбмена) Экспорт
// Если обмен идет через старый план обмена, отключаем выгрузку этого объекта
Если КомпонентыОбмена.УзелИнформационнойБазы.Метаданные().Имя = "СинхронизацияДанныхЧерезУниверсальныйФормат" Тогда
ИспользованиеПКО.Вставить("Справочник_НовыйСправочник_Отправка", Ложь);
КонецЕсли;
КонецПроцедуры
При таком подходе движок обмена БСП просто проигнорирует объект при выгрузке на старых узлах, автоматически снимет его с регистрации и продолжит сеанс синхронизации без ошибок.
---
Прямая правка общего модуля МенеджерОбменаЧерезУниверсальныйФормат крайне нежелательна, поскольку это сильно усложнит последующие типовые обновления конфигурации. Все наши доработки по новому обмену следует выносить в расширение конфигурации.
Давайте посмотрим, как перехватить регистрацию правил обмена в расширении. Мы можем использовать аннотацию &После для процедуры инициализации правил:
&После("ЗаполнитьПравилаОбработкиДанных")
Процедура Расш_ЗаполнитьПравилаОбработкиДанных(ПравилаОбработкиДанных)
// Код добавления правил только для нашего расширения
// Здесь мы регистрируем новые ПОДы и ПКО для новых справочников
КонецПроцедуры
Использование расширений позволит вам сохранить типовую конфигурацию на полной поддержке. При обновлении поставщиком правил конвертации для основного обмена, ваши локальные правила для нового плана обмена останутся нетронутыми и продолжат стабильно функционировать.
---
Подведем итог. Чтобы успешно реализовать обмен для усеченного состава данных через универсальный формат, выполните следующие действия:
ОбменДаннымиПереопределяемый.Не найден ПОД.