Как обеспечить правильный порядок выгрузки и загрузки связанных объектов в Конвертации данных 2.1

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

При переносе данных между конфигурациями 1С (например, из УПП 1.3 в ERP 2.5) разработчики часто сталкиваются с ситуацией, когда объект в приемнике не может быть корректно найден или создан, потому что объект-основание еще не загружен. Классический пример — заполнение реквизита Назначение в документах ERP, который ссылается на Заказ материалов или Внутренний заказ. Если этот заказ еще не попал в базу, мы получаем «битую» ссылку или ошибку поиска.

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

Анализ проблемы: почему порядок ПКО в дереве не влияет на загрузку

Рассмотрим ситуацию: мы выгружаем Заказ поставщику. В его табличной части есть ссылка на Внутренний заказ, который в ERP должен превратиться в элемент справочника Назначения. Проблема заключается в том, что стандартный механизм КД 2.1 идет по ссылкам. Когда система видит реквизит Назначение, она пытается его выгрузить. Если внутри ПКО Назначения происходит поиск по заказу, который еще не выгружен как полноценный объект, в файле обмена вместо ссылки на заказ появляется Нпп (номер по порядку) или пустой узел поиска.

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

Решение №1: Использование флага ВыгрузитьОбъект в ПКС

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

Проанализируем программный код в обработчике ПКС:


// В обработчике ПКС "Назначение" ПередВыгрузкой
ВыгрузитьОбъект = Истина;

Что это дает? Обычно КД записывает в файл только ссылку (УИД и поля поиска). Установив ВыгрузитьОбъект = Истина, мы заставляем выгружатор записать все свойства подчиненного объекта прямо «внутри» текущего узла XML. При загрузке парсер сначала создаст или обновит вложенный объект, и только потом вернется к записи основного документа. Это гарантирует, что реквизит будет заполнен актуальной ссылкой.

Важное замечание: Если вы используете обмен через БСП (синхронизация данных), эта переменная может игнорироваться, если в настройках узла обмена не стоит галочка «Выгружать объекты полностью». В некоторых случаях вместо ВыгрузитьОбъект следует использовать ВыгрузитьТолькоСсылку = Ложь.

Решение №2: Принудительный вызов ВыгрузитьПоПравилу

Если нам нужно, чтобы объект был записан в файл раньше основного документа (выше по тексту XML), мы можем использовать метод ВыгрузитьПоПравилу. Это позволяет реализовать произвольную логику. Рассмотрим пример, когда перед выгрузкой заказа поставщику нам нужно убедиться, что заказ-основание уже есть в файле.

Рассмотрим алгоритм в обработчике ПередВыгрузкой ПКО (родительского объекта):


// Проверяем наличие источника
Если ЗначениеЗаполнено(Источник.ЗаказОснование) Тогда
    // Принудительно выгружаем объект по конкретному правилу
    ВыгрузитьПоПравилу(Источник.ЗаказОснование, , , , "ЗаказМатериаловВПроизводство");
КонецЕсли;

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

Решение №3: Ключ выгружаемых данных и исключение дублей

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

Разберем, как это работает:

  1. Система перед выгрузкой проверяет, не выгружался ли уже объект с таким ключом.
  2. Если ключ найден в таблице выгруженных объектов, система просто ставит ссылку на уже существующий Нпп.
  3. В качестве ключа для справочников обычно выступает ссылка источника, но для виртуальных объектов (как Назначения в ERP) можно формировать ключ программно из комбинации параметров.

Особенности синхронизации справочника Назначения в ERP

Справочник Назначения в 1С:ERP является специфическим. Он часто не имеет прямого аналога в источнике (УПП) и собирается «на лету». Чтобы успешно его перенести, рекомендуется создать отдельное ПКО, где Источником является документ (например, ВнутреннийЗаказ), а Приемником — справочник Назначения.

Проанализируем шаги настройки такого правила:

  1. Создаем ПКО: ДокументСсылка.ВнутреннийЗаказ -> СправочникСсылка.Назначения.
  2. В ПоляхПоиска этого ПКО прописываем логику поиска по ключевым реквизитам ERP (Заказ, Номенклатура, Склад), если Назначение уникально в этом разрезе.
  3. Если в ERP Назначение должно просто ссылаться на документ, устанавливаем в ПКС ЗаказСпецификация (или аналогичный реквизит) значение самого Источника.

Типичные ошибки при передаче данных через параметры

Часто разработчики пытаются передать ссылку на объект через ИсходящиеДанные или структуру Параметры. Здесь кроется ловушка: если вы просто передаете ссылку без указания ПКО, приемник получит лишь GUID. Если в базе приемника объекта с таким GUID нет (он еще не создан), ссылка будет битой.

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

Выясним причину, по которой объект может не создаваться: если в ПКО включен флаг «Продолжить поиск по полям поиска, если по УИД не найдено», убедитесь, что в событии ПоляПоиска все передаваемые параметры имеют примитивные типы (строка, число) или уже существующие в базе ссылки. Использование ссылок на «еще не загруженные» объекты в коде поиска гарантированно приведет к неудаче.

Подводя итог, можно сказать, что порядок данных в КД 2.1 — это управляемый процесс. Используя комбинацию ВыгрузитьОбъект = Истина, ВыгрузитьПоПравилу и четкую настройку КлючейВыгружаемыхДанных, можно решить любую задачу по миграции сложных иерархических структур данных между конфигурациями 1С.

← На главную