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

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

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

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

Проблема 1: Почему не заполняется реквизит при простом присвоении значения

Рассмотрим ситуацию: мы осуществляем перенос из справочника НоменклатурныеГруппы (источник) в справочник ТехнологическиеОперации (приемник). В приемнике есть реквизит ОсновнаяНоменклатурнаяГруппа с типом ссылки на исходный справочник НоменклатурныеГруппы. Нам необходимо, чтобы при создании технологической операции в этот реквизит записывалась ссылка на исходную номенклатурную группу.

Кажется логичным написать в обработчике «Перед выгрузкой» правила конвертации свойства (ПКС) следующий код:

Значение = Источник;

Или его вариацию:

Значение = Источник.Ссылка;

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

Дело в том, что платформа 1С и xml-формат обмена КД 2.1 не могут передать «сырую» ссылку на объект без описания правил его выгрузки и поиска. Для любого ссылочного типа данных (будь то справочник, документ или перечисление) в правилах обмена обязательно должно существовать Правило конвертации объектов (ПКО).

Если для типа данных выгружаемого значения нет подходящего ПКО, система не понимает:

  1. По каким полям (код, наименование, уникальный идентификатор GUID) искать этот вспомогательный объект в базе-приемнике.
  2. Нужно ли создавать новый элемент в приемнике, если поиск не дал результатов.
  3. Какие свойства этого объекта необходимо перенести дополнительно.

Следовательно, для того чтобы реквизит ОсновнаяНоменклатурнаяГруппа успешно заполнился, нам обязательно нужно создать ПКО для справочника НоменклатурныеГруппы (где источником будет НоменклатурныеГруппы, а приемником — тоже НоменклатурныеГруппы).

Проблема 2: Почему после добавления ПКО ломается иерархия справочника

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

Давайте проанализируем, почему добавление нового правила для совершенно другого справочника ломает подчиненность в текущем переносе. Секрет кроется в механизме автоподбора правил в КД 2.1.

Обратим внимание на реквизит Родитель (Parent) в ПКС нашего основного правила переноса (НоменклатурныеГруппы -> ТехнологическиеОперации). По умолчанию для свойства Родитель поле «Правило конвертации» обычно оставляют пустым, полагаясь на автоматический выбор системы. Алгоритм автоподбора КД работает следующим образом:

  1. Система определяет тип источника для выгружаемого свойства. Для свойства Родитель типом источника является ссылка на справочник НоменклатурныеГруппы.
  2. Система ищет в правилах обмена все ПКО, у которых источником выступает справочник НоменклатурныеГруппы.
  3. До того как мы создали новое правило, у нас было только одно ПКО с таким источником — ПКО НоменклатурныеГруппы -> ТехнологическиеОперации. Система автоматически использовала его для конвертации родителя. Родительская папка успешно преобразовывалась в технологическую операцию-папку, и иерархия сохранялась.
  4. После того как мы создали второе ПКО (НоменклатурныеГруппы -> НоменклатурныеГруппы), у системы появилось два возможных правила для конвертации родителя. КД 2.1 выбирает правило на основе приоритетов или по внутреннему порядку. Очень часто выбор падает на новое ПКО (НоменклатурныеГруппы -> НоменклатурныеГруппы).

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

Пошаговое решение проблемы

Чтобы решить обе проблемы — обеспечить заполнение реквизита-ссылки и сохранить правильную иерархическую структуру — выполним следующие шаги:

  1. Создаем ПКО для ссылочного реквизита. Создаем правило конвертации объектов, где источником и приемником выступает справочник НоменклатурныеГруппы. В этом ПКО настраиваем поля поиска (например, по коду или по УИД), чтобы система могла однозначно идентифицировать ссылку при загрузке.
  2. Открываем правила конвертации свойств (ПКС) основного правила. Переходим в ПКО, которое переносит данные из справочника НоменклатурныеГруппы в справочник ТехнологическиеОперации.
  3. Явно указываем правило для свойства "Родитель". Находим в списке свойств строку Родитель. В колонке «Правило конвертации» принудительно выбираем из выпадающего списка ПКО ТехнологическиеОперации. Это исключит автоматический подбор и заставит систему всегда конвертировать родительские папки именно в элементы целевого справочника технологических операций.
  4. Указываем правило для реквизита-ссылки. Находим строку свойства ОсновнаяНоменклатурнаяГруппа. В колонке «Правило конвертации» принудительно выбираем ПКО НоменклатурныеГруппы. Это гарантирует, что для выгрузки ссылки применится именно нужное нам правило поиска и синхронизации.

Альтернативное решение: Программное управление правилами через ИмяПКО

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

Рассмотрим, как решить нашу задачу с помощью кода. Откроем ПКС для свойства Родитель и в обработчике «Перед выгрузкой» напишем следующий код:


Если ЗначениеЗаполнено(Источник.Родитель) Тогда
    ИмяПКО = "ТехнологическиеОперации";
Иначе
    ИмяПКО = "";
КонецЕсли;

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


Если ЗначениеЗаполнено(Источник) Тогда
    Значение = Источник;
    ИмяПКО = "НоменклатурныеГруппы";
КонецЕсли;

Использование переменной ИмяПКО полностью переопределяет стандартный механизм автоподбора правил КД 2.1. Это гарантирует стабильность работы обмена независимо от того, сколько новых правил конвертации для исходных типов данных вы добавите в проект в будущем.

Резюме и правила хорошего тона в КД 2.1

Подводя итог, сформулируем несколько важных правил, которые уберегут вас от ошибок при переносе сложных иерархических данных:

Применяя эти подходы на практике, вы сможете легко настраивать сложные обмены данными, сохраняя целостность структуры и связей между объектами метаданных 1С.

← На главную