Почему не переносится «Вид номенклатуры» при обмене через КД 3.0 и как исправить появление «битых» ссылок?

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

При настройке обмена данными между 1С:ERP Управление предприятием и 1С:Бухгалтерия предприятия (БП) с использованием технологии Конвертация данных 3.0 (КД 3) и универсального формата EnterpriseData, разработчики часто сталкиваются с проблемой некорректного переноса связанных объектов. Типичная ситуация: объект (например, Номенклатура) переносится успешно, но его реквизит (например, Вид номенклатуры) отображается в базе-приемнике как «битая» ссылка — объект не найден, хотя наименование в XML-файле присутствует. Рассмотрим подробно, почему это происходит и как настроить систему для корректной десериализации данных. Для выполнения этой задачи без ручной настройки правил применяется готовый перенос данных из ERP 2 в БП 3 с отлаженным составом справочников и документов.

Анализируем причину возникновения «битых» ссылок

Разберем механику работы EnterpriseData. В отличие от старой технологии КД 2.1, где объекты могли выгружаться «по ссылке» автоматически вместе с владельцем, в КД 3.0 и универсальном формате действует строгий принцип разделения данных. Если в файле обмена присутствует только ссылка на ВидНоменклатуры внутри узла Номенклатура, но сам блок данных Справочник.ВидыНоменклатуры в файле отсутствует, принимающая сторона (БП) создаст пустую ссылку (недополученный объект).

Проанализируем основные причины, по которым объект может не создаваться в базе-приемнике:

  1. Справочник ВидыНоменклатуры не включен в Состав плана обмена на стороне источника.
  2. Объект не зарегистрирован к выгрузке, и система выгружает только его идентификатор (GUID) и ключевые поля, но не весь объект целиком.
  3. На стороне приемника отсутствуют или неверно настроены Правила Конвертации Объектов (ПКО) для поиска по наименованию.
  4. Версии формата XDTO в ERP и БП различаются, что приводит к игнорированию полей при загрузке.

Решение 1: Проверка состава плана обмена и регистрация объектов

Выясним, включен ли нужный справочник в план обмена. Перейдем в конфигуратор ERP и найдем используемый план обмена (обычно это СинхронизацияДанныхЧерезУниверсальныйФормат). На вкладке Состав должен быть указан справочник ВидыНоменклатуры с включенной авторегистрацией или настроенной подпиской на события.

Однако простого включения в состав часто недостаточно. Если мы выгружаем номенклатуру, нам нужно гарантировать, что её вид также попадет в этот же файл обмена. Для этого воспользуемся обработчиком в Менеджере обмена. Разберем по шагам, как принудительно зарегистрировать связанный объект:

В модуле менеджера обмена или через расширение в событии ПослеОбработки для ПКО Номенклатуры добавим код регистрации:


Процедура ПКО_Справочник_Номенклатура_ПослеОбработки(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена)
    
    // Проверяем наличие вида номенклатуры
    Если ЗначениеЗаполнено(ДанныеИБ.ВидНоменклатуры) Тогда
        // Регистрируем вид номенклатуры для текущего узла обмена
        ПланыОбмена.ЗарегистрироватьИзменения(КомпонентыОбмена.УзелОбмена, ДанныеИБ.ВидНоменклатуры);
    КонецЕсли;

КонецПроцедуры

Этот подход гарантирует, что при следующей выгрузке Вид номенклатуры будет помещен в XML-файл как полноценный объект со всеми реквизитами, а не только как ссылка.

Решение 2: Настройка поиска объекта в базе-приемнике

Рассмотрим ситуацию на стороне БП. Даже если данные пришли в файл, система должна знать, как их сопоставить. В КД 3.0 поиск выполняется сначала по GUID, а затем по ключевым полям, описанным в ПКО. Если вы видите «битую» ссылку, возможно, поиск по наименованию не отрабатывает.

Проанализируем ПКО для ВидаНоменклатуры в базе-приемнике. Убедитесь, что для свойства Наименование установлена галочка «Использовать для поиска». Также важно понимать, что в БП Вид номенклатуры имеет критически важный реквизит — ТипНоменклатуры (Товар, Услуга и т.д.). Если в пришедшем объекте этот тип не заполнен или не соответствует логике БП, объект может не записаться из-за проверок в модуле объекта ПередЗаписью.

Решение 3: Подключение внешнего менеджера обмена в БП

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

Выясним причину: в современных версиях БСП механизмы безопасности или кэширования могут блокировать загрузку внешнего менеджера. Чтобы обойти это ограничение и заставить систему использовать ваш код, можно использовать расширение. Рассмотрим пример кода, который переопределяет получение менеджера обмена, позволяя загружать его из файла, указанного в настройках узла:


// Помещаем этот код в расширение для модуля ОбменДаннымиXDTOСервер
&Вместо("ВерсииФорматаОбмена")
Функция ED_ВерсииФорматаОбмена(Знач УзелИнформационнойБазы)
    
    ВерсииФорматаОбмена = Новый Соответствие;
    
    Если ЗначениеЗаполнено(УзелИнформационнойБазы) Тогда
        ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелИнформационнойБазы);
        ВерсииФорматаОбмена = ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(ИмяПланаОбмена, "ВерсииФорматаОбмена");
        
        // Наша функция для подгрузки внешнего файла
        ED_ПодключитьВнешнийМенеджер(ВерсииФорматаОбмена, УзелИнформационнойБазы);
    КонецЕсли;
    
    // ... логика обработки результата ...
    Возврат Результат;
КонецФункции

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

Важные нюансы работы с XDTO-пакетами

Проанализируем еще один технический аспект — версионность. В ERP версии 2.4.6 может использоваться формат 1.6, в то время как современная БП ожидает 1.10 и выше. Если вы вручную меняете поддерживаемые версии в коде (например, через расширение в функции ПриПолученииДоступныхВерсийФормата), убедитесь, что XDTO-пакет в конфигурации соответствует структуре, которую вы отправляете.

Полезный совет: Для диагностики используйте встроенную в КД 3.0 обработку ВыгрузкаЗагрузкаДанныхEnterpriseData. Она позволяет выгрузить объект в файл и сразу увидеть, сформировался ли узел Справочник.ВидыНоменклатуры в XML или там осталась только Ссылка. Если в файле только ссылка — проблему нужно решать на стороне Источника (регистрация и ПОД). Если в файле объект есть, а в базе нет — на стороне Приемника (ПКО и поля поиска).

Подведем итог. Для корректной конвертации объектов в КД 3 необходимо соблюдение трех условий: включение в состав плана обмена, принудительная регистрация связанных данных в обработчиках менеджера и правильная настройка ПКО (поля поиска) в базе-приемнике. Если стандартные механизмы дают сбой, использование расширения для подключения внешнего менеджера обмена является наиболее гибким способом решения задачи. Для контроля итогового результата и поиска скрытых расхождений применяется автоматическая сверка проводок между базами 1С после завершения миграции.

← На главную