Почему при конвертации через план обмена не выгружается иерархия групп и элементов?

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

При настройке обмена данными между конфигурациями 1С (например, при перегрузке номенклатуры из УТП в Розницу 2.0) часто возникает ситуация, когда через «Универсальный обмен данными XML» всё переносится корректно, а при использовании плана обмена иерархия справочника «схлопывается». Все группы оказываются на верхнем уровне, а элементы теряют привязку к родителям. Рассмотрим подробно, почему это происходит и как восстановить структуру справочника.

Различие механизмов: Универсальная обработка vs План обмена

Для начала проанализируем ситуацию: почему одна и та же выгрузка ведет себя по-разному? Когда мы используем УниверсальныйОбменДаннымиXML, система, как правило, записывает объекты напрямую. Однако при использовании планов обмена в современных конфигурациях на базе БСП (Библиотеки стандартных подсистем), таких как «Розница 2.0», включаются механизмы синхронизации данных, которые накладывают дополнительные ограничения.

Выясним основную причину: в планах обмена часто используется механизм отложенной записи. Если при загрузке объекта (группы) возникает ошибка заполнения хотя бы одного обязательного реквизита, объект не записывается в базу. В результате, когда загружается дочерний элемент, его поле Родитель ссылается на несуществующую (не созданную) группу, и элемент «выпадает» в корень справочника.

Шаг 1: Анализ журнала регистрации в базе-приемнике

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

Посмотрим на типичный пример ошибки:


Ошибка при отложенной записи объекта: Номенклатура Группа 'Детские товары'. 
Описание ошибки: Ошибка проверки заполнения реквизитов. Поле 'Вид номенклатуры' не заполнено.

В конфигурации «Розница 2.0» справочник Номенклатура имеет жесткую зависимость от реквизита ВидНоменклатуры. Если в правилах конвертации (ПКО) выгрузка этого реквизита настроена только для элементов, но пропущена для групп, то группы не запишутся, и иерархия будет разрушена.

Шаг 2: Настройка принудительной выгрузки родителя

Проанализируем настройки в Конвертации данных 2.1. Бывают случаи, когда план обмена выгружает только измененные объекты. Если вы изменили товар, но не меняли его группу-родителя, план обмена может отправить в файл только ссылку на родителя (УИД), но не сам объект родителя полностью.

Чтобы гарантировать передачу всей цепочки иерархии, разберем настройку ПКС (Правила конвертации свойств) для реквизита Родитель в ПКО номенклатуры. Нам необходимо в обработчике «Перед выгрузкой» указать системе, что объект-родитель должен быть выгружен полностью, даже если он не зарегистрирован на узле плана обмена.

Пример кода для ПКС Родитель:


Если ТипЗнч(Значение) = Тип("СправочникСсылка.Номенклатура") Тогда
    ВыгрузитьОбъект = Истина;
КонецЕсли;

Это заставит систему принудительно поместить данные родителя в файл выгрузки. Также убедитесь, что в ПКО Номенклатура на закладке «Настройки» не стоит флаг «Не выгружать объекты свойств, если они найдены в приемнике».

Шаг 3: Обработка специфических реквизитов для групп

В конфигурациях на управляемых формах (Розница, УТ 11, ERP) группы справочников часто требуют заполнения тех же реквизитов, что и элементы. Проверим в конфигураторе приемника свойства реквизита ВидНоменклатуры. Если у него стоит проверка заполнения «Выдавать ошибку», мы обязаны передавать его и для групп.

Для этого в ПКО Номенклатура в обработчике «Перед выгрузкой» добавим логику заполнения для групп:


Если Источник.ЭтоГруппа Тогда
    // Если для групп в приемнике нужен специфический Вид Номенклатуры
    // или общий для всех, установим его принудительно
    Значение = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Группа товаров");
КонецЕсли;

Важно помнить: если вы используете одно ПКО и для групп, и для элементов, убедитесь, что свойство ЭтоГруппа сопоставлено корректно и передается в пакете данных.

Шаг 4: Работа с регистром соответствия объектов

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

  1. Перейдем в базу-приемник.
  2. Очистим записи в регистре «Соответствия объектов информационных баз» для справочника Номенклатура.
  3. В базе-источнике выполним перерегистрацию объектов на узле плана обмена.
  4. Повторим выгрузку.

Это позволит системе «с чистого листа» сопоставить объекты по УИДам и правильно выстроить дерево групп.

Шаг 5: Проверка коллизий

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

Посмотрим на настройки синхронизации в самой «Рознице 2.0». Убедитесь, что приоритет данных установлен правильно. Если система считает данные в приемнике более актуальными, она может блокировать обновление реквизита Родитель, если он был изменен вручную в приемнике или если версии объектов не совпадают по времени.

Резюме и рекомендации

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

Следуя этим шагам, вы добьетесь того, что дерево номенклатуры в «Рознице» будет полностью идентично структуре в «УТП».

← На главную