При настройке правил обмена в инструменте «1С:Конвертация данных 2.1» (КД 2.1) разработчики часто сталкиваются с ситуацией, когда простые реквизиты и справочники переносятся без проблем, а значение конкретного перечисления в документе-приемнике остается пустым. Ситуация усложняется, когда обмен происходит внутри одной и той же информационной базы (например, при переносе данных между разными видами документов), и метаданные источника и приемника кажутся абсолютно идентичными.
В этой статье мы подробно проанализируем реальный кейс с форума 1С, выясним причины типичных ошибок при выгрузке перечислений и разберем по шагам, как правильно настроить правила конвертации свойств (ПКС) как с помощью программного кода в обработчиках, так и стандартными интерактивными средствами КД без написания кода.
Рассмотрим исходную ситуацию. Разработчик настраивает конвертацию документов в рамках одной базы данных на базе конфигурации «1С:Бухгалтерия государственного учреждения» (БГУ) редакции 1.0. Все реквизиты успешно переносятся, кроме одного перечисления — КВД (Код вида деятельности). Для него создано отдельное ПКС, указано соответствующее правило конвертации объектов (ПКО), однако в файле обмена выгруженное значение отсутствует.
Попытки решить проблему «в лоб» написанием кода в обработчике события ПередВыгрузкой свойства привели к двум характерным ошибкам платформы 1С:
ОбъектКоллекции вместо Источник.Проанализируем каждую из этих ошибок подробно, чтобы понять внутреннюю механику работы платформы и Конвертации данных.
---
Выясним причину первой ошибки, связанной с несоответствием типов. Автор темы упомянул важную деталь: «там перечисление от 1 до 7». В бюджетном учете и конфигурации БГУ 1.0 исторически сложилась следующая структура метаданных:
КВД (Код вида деятельности) — это устаревший объект метаданных, который содержит текстовые значения (например, "Бюджет", "Внебюджет", "Целевые средства").КФО (Код финансового обеспечения) — это актуальный объект метаданных, содержащий цифровые значения от 1 до 7 (где 1 — бюджетная деятельность, 2 — приносящая доход деятельность и т.д.).Несмотря на то, что на форме документа и в пользовательском интерфейсе этот реквизит часто подписан как «КВД», его реальный тип данных в метаданных документа-источника — ПеречислениеСсылка.КФО.
Когда разработчик попытался применить следующий код:
Значение = Метаданные.Перечисления["КВД"].ЗначенияПеречисления[Перечисления["КВД"].Индекс(Источник.КВД)].Имя;
Произошло следующее: в метод Индекс(), вызванный для менеджера перечисления КВД, было передано значение типа ПеречислениеСсылка.КФО. Платформа обнаружила несоответствие типов переданного параметра и прервала выполнение с ошибкой.
Решение проблемы с типами данных:
Если мы хотим использовать программное получение имени значения перечисления для выгрузки, необходимо обращаться к правильному объекту метаданных — КФО:
// Пример правильного обращения к перечислению КФО
Значение = Метаданные.Перечисления.КФО.ЗначенияПеречисления[Перечисления.КФО.Индекс(Источник.КВД)].Имя;
---
Рассмотрим вторую ошибку: Значение не является значением объектного типа (КВД) при обращении к переменной ОбъектКоллекции.
В КД 2.1 в обработчиках событий ПКС доступны различные локальные переменные, область видимости которых строго регламентирована контекстом выгрузки:
Если реквизит КВД (или КФО) находится в шапке документа, то при обработке ПКС этого свойства переменная ОбъектКоллекции имеет значение Неопределено. Попытка обратиться к свойству пустого объекта (ОбъектКоллекции.КВД) закономерно вызывает ошибку объектного типа.
Правило использования контекста:
Для выгрузки реквизитов шапки документа всегда используем ключевое слово Источник. Обращение к ОбъектКоллекции допустимо только в том случае, если свойство выгружается из строки табличной части документа.
---
Даже если код написан верно и указывает на правильный тип метаданных, выгрузка может аварийно завершиться. Разработчики часто уверены: «Документ проведен, значит реквизит точно заполнен!».
Однако в реальной базе данных могут выгружаться:
Если в метод Перечисления.КФО.Индекс() передать пустую ссылку или значение Неопределено, платформа вернет ошибку несоответствия типов. Любой программный код в обработчиках конвертации должен быть безопасным.
Рассмотрим шаблон безопасного кода для обработчика ПередВыгрузкой свойства:
Если ЗначениеЗаполнено(Источник.КВД) Тогда
// Заменяем имя перечисления на фактически используемое (КФО)
Значение = Метаданные.Перечисления.КФО.ЗначенияПеречисления[Перечисления.КФО.Индекс(Источник.КВД)].Имя;
Иначе
Значение = "";
КонецЕсли;
---
Написание программного кода в обработчиках — это крайняя мера, необходимая при сложной трансформации данных. В штатных ситуациях Конвертация данных 2.1 позволяет настроить перенос перечислений в интерактивном режиме. Разберем этот процесс по шагам.
Шаг 1. Создание ПКО для перечисления
Создаем отдельное Правило конвертации объектов (ПКО). В качестве источника указываем перечисление-источник (например, КФО или КВД в зависимости от структуры вашей конфигурации), а в качестве приемника — соответствующее перечисление в базе-приемнике.
Шаг 2. Настройка сопоставления значений
Переходим на вкладку «Конвертация значений» (или «Значения») внутри созданного ПКО перечисления. Нажимаем кнопку автозаполнения. Система автоматически сопоставит элементы по их имени или внутреннему идентификатору (например, элемент источника _1 сопоставится с элементом приемника _1). Если имена различаются, сопоставляем их вручную.
Шаг 3. Привязка правила к свойству документа
Возвращаемся в ПКО документа. Находим в таблице правил конвертации свойств (ПКС) строку нашего реквизита. В колонке «Правило конвертации» принудительно выбираем созданное на Шаге 1 ПКО для перечисления.
При такой настройке XML-выгрузка автоматически запишет строковое имя значения перечисления, а при загрузке обработка обмена найдет сопоставленное значение в приемнике без какого-либо программного кода.
---
Если данные по-прежнему не выгружаются, рекомендуется запустить процесс выгрузки в режиме отладки. Выясним, как быстро настроить отладчик для правил КД:
УниверсальныйОбменДаннымиXML в режиме Предприятия.Источник.КВД, определить их тип и заполненность.Использование комплексного подхода — понимание контекста выполнения кода, точное знание структуры метаданных конфигурации и умение настраивать стандартные правила сопоставления значений — гарантирует стабильную и безошибочную работу ваших правил обмена в любых сценариях конвертации данных.