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