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