При настройке обмена данными между различными конфигурациями 1С с помощью «1С:Конвертация данных 2.0» (КД 2.0) часто возникает необходимость преобразовать Перечисление из базы-источника в Справочник в базе-приемнике (или наоборот). Основная сложность здесь заключается не только в сопоставлении типов, но и в правильном обращении к данным, особенно если они находятся в табличных частях документов. Рассмотрим подробно, как решить эти задачи, избежав типичных ошибок программирования в обработчиках.
Проанализируем базовый принцип: перечисление в 1С — это фиксированный набор значений, а справочник — это динамическая сущность. При конвертации перечисления в справочник системе необходимо указать, какому конкретному элементу справочника соответствует значение перечисления. Рассмотрим два основных способа реализации этой задачи.
Способ 1: Использование Правил Конвертации Значений (ПКЗ). Это наиболее штатный способ в рамках КД 2.0. Внутри ПКО (Правила конвертации объектов) на закладке «Конвертация значений» мы можем вручную сопоставить каждое значение перечисления элементам справочника. Для того чтобы поиск в приемнике прошел успешно, в правилах для справочника (ПКО приемника) обязательно должен быть настроен поиск по Наименованию или Коду.
Способ 2: Программная установка значения в ПКС (Правила конвертации свойств). Если логика сопоставления сложная и зависит от условий, мы используем обработчик ПриВыгрузке. В этом случае переменной Значение присваивается строковое представление или ссылка, которую приемник сможет идентифицировать. Рассмотрим пример кода для подмены типа номенклатуры:
Если Строка(Источник) = "Запас" Тогда
Значение = "Товары";
Иначе
Значение = "Услуги";
КонецЕсли;
Важно помнить: если вы передаете строку в обработчике ПриВыгрузке, то в ПКО для данного свойства в базе-приемнике должен быть включен флаг Поиск по тому полю, которое вы передаете (например, по наименованию). Для массовой перенастройки полей идентификации в правилах обмена подойдёт обработка для переключения поиска по коду на поиск по наименованию.
Разберем одну из самых частых ошибок, с которой сталкиваются разработчики при написании кода в ПКС. Когда свойство (например, «Ставка НДС») находится в табличной части документа, попытка обратиться к нему через Источник.СтавкаНДС часто приводит к ошибке «Поле объекта не обнаружено» или к некорректной выгрузке всего документа.
Выясним причину: в контексте выполнения ПКС для реквизита табличной части переменная Источник может указывать на сам документ-владелец, а не на текущую строку. Для доступа к данным текущей строки табличной части необходимо использовать переменную ОбъектКоллекции.
Рассмотрим правильный пример обращения к ставке НДС внутри табличной части:
// В обработчике ПКС "ПриВыгрузке"
Если СокрЛП(ОбъектКоллекции.СтавкаНДС.Наименование) = "Без НДС" Тогда
Значение = "БезНДС";
Иначе
Значение = "НДС20";
КонецЕсли;
Проанализируем эту ситуацию: если мы пишем Источник.СтавкаНДС, система ищет реквизит в шапке документа. Если же мы используем ОбъектКоллекции, мы обращаемся к конкретной строке (Запасы, Услуги или Расходы), которая обрабатывается в данный момент.
Иногда простого сравнения по наименованию недостаточно, так как в разных базах справочники ставок НДС могут быть заполнены по-разному. Посмотрим на более универсальный пример кода, который учитывает числовые показатели ставки и признак облагаемости:
// Обращаемся к реквизитам справочника СтавкиНДС через ОбъектКоллекции (строку ТЧ)
Если ОбъектКоллекции.СтавкаНДС.Ставка = 10 И ОбъектКоллекции.СтавкаНДС.Облагается Тогда
Значение = "НДС10_110";
ИначеЕсли ОбъектКоллекции.СтавкаНДС.Ставка = 18 И ОбъектКоллекции.СтавкаНДС.Облагается Тогда
Значение = "НДС18_118";
ИначеЕсли ОбъектКоллекции.СтавкаНДС.Облагается Тогда
Значение = "НДС20_120";
ИначеЕсли ОбъектКоллекции.СтавкаНДС.Ставка = 0 И НЕ ОбъектКоллекции.СтавкаНДС.Облагается Тогда
Значение = "НДС0";
Иначе
Значение = "БезНДС";
КонецЕсли;
Здесь мы программно подготавливаем строковый идентификатор перечисления для базы-приемника. В приемнике (например, БП 3.0) эти значения сопоставятся с именами перечисления СтавкиНДС.
Рассмотрим ситуацию, когда в приемнике нужно найти Статью затрат или Счет учета, которых нет в источнике в явном виде. Чтобы поиск прошел успешно, необходимо выполнить следующие действия:
Наименование или Код установите галочку в колонке поиска.ПриВыгрузке ПКС:
// Для планов счетов
Значение = "26"; // Передаем код, а в ПКО счетов включаем поиск по коду
Если же требуется найти статью затрат по имени, которого нет в базе-источнике, мы можем жестко прописать его в ПКС:
Значение = "Расход на мобильник"; // Имя будет использовано для поиска в приемнике
Часто программисты создают ПКО (Правило конвертации объектов), загружают правила в базу, но не видят новый тип документа в списке для выгрузки. Выясним причину этого поведения.
Список объектов в обработке УниверсальныйОбменДаннымиXML строится не по ПКО, а по ПВО (Правилам выгрузки объектов). ПКО — это инструкция о том, *как* конвертировать данные, а ПВО — это инструкция о том, *что* нужно выгружать пользователю. Для быстрого создания таких правил с удобной структурой можно использовать обработку для генерации правил выгрузки данных.
Чтобы ваша «Реализация» или «Поступление» появились в списке:
Подводя итог, проанализируем основные правила успешной конвертации:
ОбъектКоллекции вместо Источник для доступа к реквизитам строки.Значение строковое имя значения перечисления в приемнике.Значение, передавая код или наименование для поиска.Используя эти методы, мы обеспечиваем гибкую и надежную передачу данных между конфигурациями с различной структурой метаданных.