Как перенести номенклатуру с единицами измерения без ошибок циклических ссылок в Конвертации Данных 2.0?

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

При настройке обмена данными между конфигурациями (например, между двумя базами «1С:Управление торговлей 10.3») разработчики часто сталкиваются с ситуацией, когда основные данные справочника переносятся корректно, а некоторые ключевые реквизиты остаются пустыми. Чаще всего эта проблема касается справочника «Номенклатура», у которого не заполняются реквизиты ЕдиницаХраненияОстатков и ЕдиницаДляОтчетов. Давайте подробно разберем эту ситуацию, проанализируем причины ее возникновения и рассмотрим надежные способы решения с помощью инструмента «Конвертация данных 2.0» (КД 2.0).

В чем техническая суть проблемы (почему возникает сбой)

Проанализируем структуру метаданных, чтобы понять причину такого поведения. Описанная ситуация — это классический пример проблемы циклических (взаимных) ссылок при выгрузке и загрузке данных.

Справочник «Номенклатура» имеет реквизиты ЕдиницаХраненияОстатков и ЕдиницаДляОтчетов, которые ссылаются на подчиненный справочник ЕдиницыИзмерения. В свою очередь, элементы подчиненного справочника ЕдиницыИзмерения обязательно требуют заполнения реквизита Владелец, который ссылается на саму номенклатуру.

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

Решение с помощью штатных декларативных механизмов КД 2.0

Рассмотрим правильный архитектурный подход к решению этой проблемы. В КД 2.0 писать сложный программный код в обработчиках не обязательно, так как платформа имеет специальный встроенный механизм для разрешения циклических ссылок. Для регулярного выполнения обмена по расписанию на основе подготовленных XML-правил без изменения конфигураций применяется программа для автоматической синхронизации баз 1С.

  1. Использование флага «Отложить заполнение» (Отложенное заполнение реквизитов).
    Откроем Правила конвертации свойств (ПКС) для реквизитов ЕдиницаХраненияОстатков и ЕдиницаДляОтчетов, которые находятся внутри правила конвертации справочника номенклатуры. В настройках этих ПКС необходимо установить флаг «Отложить заполнение».

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

Программные варианты решения проблемы (через обработчики)

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

Например, действия для первичной записи номенклатуры можно выполнить в обработчике ПКО ПослеЗагрузки, принудительно записав сначала сам объект, чтобы у него появилась ссылка:


Если Объект.Ссылка.Пустая() Тогда
    Объект.Записать();
КонецЕсли;

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

Почему иногда помогает изменение порядка правил («Танец с бубном»)

На практике встречается ситуация (как у автора обсуждаемой проблемы), когда ошибка решается простой перестановкой строк правил в интерфейсе КД 2.0. Автор поменял местами в списке рядом расположенные правила для ЕдиницыХраненияОстатков и ЕдиницыДляОтчетов, и обе единицы стали успешно загружаться.

Выясним причину этого феномена. Техническое объяснение кроется в том, что порядок следования ПКС в Конвертации Данных напрямую влияет на порядок формирования узлов (тегов) в итоговом XML-файле обмена. Переместив свойства, автор добился того, что XML-парсер при чтении файла загрузки начал считывать структуру в той последовательности, которая случайно разрешила проблему поиска ссылок до момента физической записи объекта в базу (например, реквизиты-ссылки успели закэшироваться нужным образом).

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

← На главную