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