При настройке обмена данными между конфигурациями 1С часто возникает ситуация, когда в источнике (например, в «Комплексной автоматизации 1.1» или «УПП») ставка НДС реализована как Перечисление, а в приемнике (например, в «УНФ» или «ERP») — как Справочник. Поскольку это разные типы метаданных, простое сопоставление полей «по умолчанию» не сработает. Рассмотрим подробно, как решить эту задачу в «1С:Конвертация данных 2.1».
Допустим, мы переносим документ ПриходнаяНакладная. В источнике реквизит СтавкаНДС — это ПеречислениеСсылка.СтавкиНДС (значения: НДС20, НДС20_120, БезНДС). В приемнике это СправочникСсылка.СтавкиНДС (элементы: «20%», «20% / 120%», «Без НДС»). Прямое присвоение невозможно, так как система не сможет сопоставить GUID перечисления и GUID элемента справочника.
Рассмотрим по шагам, как настроить правила конвертации объектов (ПКО) и свойств (ПКС) для корректного поиска.
Это самый «чистый» и правильный метод с точки зрения архитектуры КД 2.1. Мы создаем правило, которое объясняет системе, как превратить значение перечисления в ссылку на справочник.
ПеречислениеСсылка.СтавкиНДС, в качестве приемника — СправочникСсылка.СтавкиНДС.Наименование. Источник оставляем пустым, приемник — Наименование.Проанализируем пример кода для обработчика ПередВыгрузкой свойства Наименование:
Если Источник = Перечисления.СтавкиНДС.БезНДС Тогда
Значение = "Без НДС";
ИначеЕсли Источник = Перечисления.СтавкиНДС.НДС20 Тогда
Значение = "20%";
ИначеЕсли Источник = Перечисления.СтавкиНДС.НДС20_120 Тогда
Значение = "20% / 120%";
Иначе
Значение = Строка(Источник); // Попытка привести к строке, если нет явного соответствия
КонецЕсли;
Важный момент: Для этого ПКС обязательно установите флаг «Поиск объекта при загрузке по свойству». Именно по этому наименованию загрузчик в приемнике найдет нужную ставку НДС.
Иногда программисты пытаются использовать параметр Выражение для поиска объекта прямо в базе-приемнике. Разберем, как это работает, и каких ошибок следует избегать. Параметр Выражение — это строка кода, которая будет выполнена на стороне приемника в момент загрузки.
Если мы хотим найти ставку НДС по наименованию непосредственно при загрузке документа, в ПКС реквизита СтавкаНДС (в правиле конвертации документа) можно написать следующее в обработчике Перед выгрузкой:
Если Источник.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС Тогда
Выражение = "Справочники.СтавкиНДС.НайтиПоНаименованию(""Без НДС"")";
ИначеЕсли Источник.СтавкаНДС = Перечисления.СтавкиНДС.НДС20 Тогда
Выражение = "Справочники.СтавкиНДС.НайтиПоНаименованию(""20%"")";
КонецЕсли;
Проанализируем типичную ошибку: неправильное экранирование кавычек. Поскольку Выражение само по себе является строкой, все кавычки внутри него (для строковых параметров методов 1С) должны быть двойными. Также не забывайте про точку с запятой в конце выражения, если этого требует версия обработки обмена.
Однако помните: использование НайтиПоНаименованию в каждой строке документа при загрузке может существенно замедлить процесс обмена. Поэтому использование полноценного ПКО (Способ 1) предпочтительнее, так как КД умеет кэшировать найденные объекты.
Рассмотрим ситуации, из-за которых данные могут не заполниться:
Если Источник = Перечисления.СтавкиНДС.БезНДС... внутри ПКС документа. Но в контексте ПКС свойства документа Источник — это весь документ-объект, а не значение конкретного реквизита. Правильно обращаться через точку: Источник.СтавкаНДС или использовать ОбъектКоллекции, если речь идет о табличной части.Если вы переносите тысячи документов, постоянный поиск справочника по наименованию создаст нагрузку на базу. Чтобы ускорить загрузку, проанализируем возможность использования кэша. В обработчике Перед началом конвертации или в Перед загрузкой данных можно создать соответствие и заполнить его ссылками на справочник СтавкиНДС.
Пример кода в ПКС документа (Перед выгрузкой) с передачей кода объекта:
// В источнике определяем только имя или код для поиска
Если Источник.СтавкаНДС = Перечисления.СтавкиНДС.НДС20 Тогда
Значение = "00001"; // Код элемента "20%" в справочнике приемника
КонецЕсли;
В этом случае в ПКО для СтавкиНДС поиск должен быть настроен по Коду. Поиск по коду (индексному полю) всегда быстрее, чем по наименованию.
Рассмотрим финальную последовательность действий, которая гарантированно приведет к результату:
Наименование (в ПКО справочника) напишите Значение = Строка(Источник);.СтавкаНДС.Таким образом, система при выгрузке превратит ссылку перечисления в строку (наименование), а при загрузке выполнит поиск в справочнике по этой строке и подставит найденную ссылку в документ.