Почему определяемый тип в Конвертации данных 2.1 отображается как Строка и как правильно передавать значения в ПКС?

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

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

Разберем природу определяемых типов в КД 2.1

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

Определяемый тип — это объект метаданных, который появился в платформе 8.3 для упрощения разработки. Однако формат обмена данными в КД 2.1 проектировался гораздо раньше. Когда обработка выгрузки структуры метаданных анализирует объект, она «разворачивает» определяемый тип. Если в конкретной конфигурации (например, УНФ или БП) в состав этого типа входит только строка или если обработка не может однозначно сопоставить тип с ссылочным объектом, она подставляет Строка. Как отмечают опытные специалисты, в режиме «1С:Предприятие» вместо определяемого типа всегда подставляются конкретные типы, которые в нем содержатся. Поэтому поведение КД, показывающей конечный тип данных, является нормальным.

Как сопоставить типы, если возникло расхождение

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

Выясним, как быстро найти такие проблемные места в правилах. В интерфейсе КД 2.1 разработчики предусмотрели визуальную индикацию:

  1. Откройте список Правил Конвертации Свойств (ПКС) для нужного объекта.
  2. Обратите внимание на цвет строк. ПКС, в которых типы источника и приемника не совпадают или требуют особого внимания, подсвечиваются желтым цветом.
  3. Проверьте колонку «Правило конвертации». Если источник — объект (ссылка), а приемник — строка, ПКО обычно оставляют пустым, но в обработчике ПКС «Перед выгрузкой» необходимо явно преобразовать ссылку в строку (например, передать наименование).

Исправление ошибки программного заполнения в ПКС

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

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


// ОШИБОЧНЫЙ ВАРИАНТ
РезультатЗапроса = Запросы.ОсновнойПоставщик.Выполнить();
Таблица = РезультатЗапроса.Выгрузить();
Если Таблица.Количество() > 0 Тогда
    Результат = Таблица[0].Контрагент; // ОШИБКА: Использование переменной "Результат"
Иначе
    Результат = Справочники.Контрагенты.ПустаяСсылка();
КонецЕсли;

В чем здесь подвох? В системе «Конвертация данных 2.1» для передачи значения, которое должно быть выгружено в файл, используется строго определенное имя переменной — Значение. Если вы используете имя Результат, КД просто проигнорирует ваш код, посчитает значение свойства неопределенным и вообще не создаст соответствующий узел в XML-файле. В итоге в приемнике реквизит останется пустым.

Правильный вариант кода должен выглядеть так:


// ПРАВИЛЬНЫЙ ВАРИАНТ
РезультатЗапроса = Запросы.ОсновнойПоставщик.Выполнить();
Таблица = РезультатЗапроса.Выгрузить();
Если Таблица.Количество() > 0 И Таблица.Колонки.Найти("Контрагент") <> Неопределено Тогда
    Значение = Таблица[0].Контрагент; // Используем предопределенную переменную Значение
Иначе
    Значение = Справочники.Контрагенты.ПустаяСсылка();
КонецЕсли;

После этого исправления свойство корректно появится в XML-файле выгрузки. Обратите внимание, что если тип приемника — Строка, а вы присваиваете переменной Значение ссылку, то вам обязательно нужно либо указать ПКО для конвертации этого контрагента в строку, либо сразу присвоить строковое представление: Значение = Строка(Таблица[0].Контрагент);.

Методика отладки «невидимых» ошибок

Если вы столкнулись с тем, что свойство не выгружается, а в модуле УниверсальныйОбменДаннымиXML возникает ошибка с пустым ИмяПКО, воспользуйтесь следующими рекомендациями:

  1. Проверка заполнения: Убедитесь, что в ПКС не стоит галочка «Отключить», и что в коде обработчика не вызывается Отказ = Истина;.
  2. Режим отладки: Используйте встроенную возможность обработки обмена по выгрузке модуля отладки. Это позволит вам поставить точку останова прямо в сгенерированном коде и увидеть, какая именно переменная (Значение) передается в процедуру выгрузки.
  3. Ручная правка метаданных: Если вы абсолютно уверены, что КД неверно определила тип как строку (и это мешает выбрать нужное ПКО), вы можете зайти в справочник «Объекты метаданных» внутри самой конфигурации «Конвертация данных», найти нужный реквизит и вручную изменить его тип на ссылочный. Это позволит вам выбрать нужное ПКО в настройках ПКС.

Важный момент: всегда используйте самую свежую версию обработки MD83Exp.epf, которую можно найти в составе последних релизов Библиотеки стандартных подсистем (БСП). Разработчики 1С постоянно обновляют алгоритмы выгрузки структуры для корректной поддержки новых объектов платформы 8.3.

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

← На главную