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