Работа с инструментом «Конвертация данных 2.1» (КД 2.1) при настройке обменов между современными конфигурациями на платформе 1С:Предприятие 8.3 часто преподносит сюрпризы. Одной из классических проблем является некорректное, на первый взгляд, отображение определяемых типов (Defined Types). Программисты часто сталкиваются с ситуацией, когда вместо ожидаемой ссылки на справочник в структуре метаданных отображается тип Строка. В этой статье мы подробно разберем, почему это происходит, как с этим работать и как избежать досадных ошибок при написании кода в обработчиках выгрузки.
Для начала проанализируем ситуацию: вы выгружаете описание конфигурации с помощью обработки MD83Exp.epf, загружаете его в КД 2.1 и видите, что реквизит (например, «Подразделение»), который в конфигураторе является определяемым типом, в правилах стал обычной строкой. Рассмотрим подробнее, почему так происходит.
Определяемый тип — это объект метаданных, который появился в платформе 8.3 для упрощения разработки. Однако формат обмена данными в КД 2.1 проектировался гораздо раньше. Когда обработка выгрузки структуры метаданных анализирует объект, она «разворачивает» определяемый тип. Если в конкретной конфигурации (например, УНФ или БП) в состав этого типа входит только строка или если обработка не может однозначно сопоставить тип с ссылочным объектом, она подставляет Строка. Как отмечают опытные специалисты, в режиме «1С:Предприятие» вместо определяемого типа всегда подставляются конкретные типы, которые в нем содержатся. Поэтому поведение КД, показывающей конечный тип данных, является нормальным.
Часто возникает проблема «конфликта интересов»: в источнике реквизит является ссылкой (например, СправочникСсылка.Партнеры), а в приемнике из-за особенностей определяемого типа КД ожидает Строку. При попытке выгрузки это может привести к ошибкам в модуле обмена, так как система не может найти подходящее Правило Конвертации Объектов (ПКО).
Выясним, как быстро найти такие проблемные места в правилах. В интерфейсе КД 2.1 разработчики предусмотрели визуальную индикацию:
Рассмотрим ситуацию, когда вам нужно программно вычислить значение реквизита, которого нет в источнике, или изменить его логику выгрузки. Посмотрим на пример типичной ошибки, которую совершают даже опытные разработчики. Допустим, мы хотим выгрузить «Основного поставщика» для номенклатуры, выполнив запрос к базе данных.
Проанализируем ошибочный код в обработчике ПКС «Перед выгрузкой»:
// ОШИБОЧНЫЙ ВАРИАНТ
РезультатЗапроса = Запросы.ОсновнойПоставщик.Выполнить();
Таблица = РезультатЗапроса.Выгрузить();
Если Таблица.Количество() > 0 Тогда
Результат = Таблица[0].Контрагент; // ОШИБКА: Использование переменной "Результат"
Иначе
Результат = Справочники.Контрагенты.ПустаяСсылка();
КонецЕсли;
В чем здесь подвох? В системе «Конвертация данных 2.1» для передачи значения, которое должно быть выгружено в файл, используется строго определенное имя переменной — Значение. Если вы используете имя Результат, КД просто проигнорирует ваш код, посчитает значение свойства неопределенным и вообще не создаст соответствующий узел в XML-файле. В итоге в приемнике реквизит останется пустым.
Правильный вариант кода должен выглядеть так:
// ПРАВИЛЬНЫЙ ВАРИАНТ
РезультатЗапроса = Запросы.ОсновнойПоставщик.Выполнить();
Таблица = РезультатЗапроса.Выгрузить();
Если Таблица.Количество() > 0 И Таблица.Колонки.Найти("Контрагент") <> Неопределено Тогда
Значение = Таблица[0].Контрагент; // Используем предопределенную переменную Значение
Иначе
Значение = Справочники.Контрагенты.ПустаяСсылка();
КонецЕсли;
После этого исправления свойство корректно появится в XML-файле выгрузки. Обратите внимание, что если тип приемника — Строка, а вы присваиваете переменной Значение ссылку, то вам обязательно нужно либо указать ПКО для конвертации этого контрагента в строку, либо сразу присвоить строковое представление: Значение = Строка(Таблица[0].Контрагент);.
Если вы столкнулись с тем, что свойство не выгружается, а в модуле УниверсальныйОбменДаннымиXML возникает ошибка с пустым ИмяПКО, воспользуйтесь следующими рекомендациями:
Отказ = Истина;.Значение) передается в процедуру выгрузки.Важный момент: всегда используйте самую свежую версию обработки MD83Exp.epf, которую можно найти в составе последних релизов Библиотеки стандартных подсистем (БСП). Разработчики 1С постоянно обновляют алгоритмы выгрузки структуры для корректной поддержки новых объектов платформы 8.3.
Подведем итог: работа с КД 2.1 требует внимательности к именам встроенных переменных и понимания того, как метаданные транслируются в структуру обмена. Используя переменную Значение и ориентируясь на цветовую индикацию интерфейса, вы сможете быстро настраивать даже сложные обмены между современными конфигурациями.