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