Переход на новые версии программных продуктов 1С часто преподносит сюрпризы в виде изменения архитектуры хранения данных. Одной из самых заметных трансформаций в 1С:ERP Управление предприятием 2.5 стал переход реквизита СтавкаНДС из типа ПеречислениеСсылка.СтавкиНДС в тип СправочникСсылка.СтавкиНДС. Это изменение ломает привычные механизмы обмена данными, особенно если вторая система (например, УПП 1.3 или старая версия ERP) все еще использует перечисление. В этой статье мы подробно разберем, как адаптировать правила конвертации (КД 2.1) для корректной передачи ставок НДС в обе стороны.
При использовании Конвертации данных 2.1 механизм автоматического сопоставления опирается на идентичность типов. Когда в источнике (ERP 2.5) мы имеем справочник, а в приемнике (УПП) — перечисление, стандартное Правило Конвертации Свойства (ПКС) не может просто "пробросить" значение. Даже если мы создадим ПКО для справочника и ПКО для перечисления, система не поймет, как сопоставить элемент справочника конкретному значению перечисления без дополнительных инструкций. Для запуска обмена по правилам КД 2.1 в современных конфигурациях без доработки конфигурации применимо расширение для выполнения обмена по правилам Конвертации данных 2.1.
Важно понимать структуру нового справочника СтавкиНДС в ERP 2.5. Каждый его элемент содержит внутренний реквизит (часто скрытый от пользователя), который ссылается на системное перечисление. Именно на этот реквизит мы и будем опираться при конвертации.
Рассмотрим ситуацию, когда нам нужно выгрузить данные из новой ERP в старую систему. Основная сложность здесь заключается в том, чтобы заставить ПКС использовать уже существующее правило сопоставления значений перечислений. Если перенос документов требуется выполнять регулярно по расписанию, созданные правила конвертации пригодятся для настройки автоматического обмена между базами 1С.
Проанализируем алгоритм настройки:
ПеречислениеСсылка.СтавкиНДС. В этом ПКО на вкладке "Сопоставление значений" должны быть четко прописаны пары (например, НДС20 -> НДС20).Номенклатура или документа Реализация) найдем ПКС для свойства СтавкаНДС.Посмотрим на пример кода в обработчике Перед выгрузкой:
// Извлекаем значение перечисления, которое хранится внутри справочника СтавкиНДС
Значение = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Источник.СтавкаНДС, "ПеречислениеСтавкаНДС");
// Указываем имя правила конвертации для перечислений, которое мы подготовили заранее
ИмяПКО = "СтавкиНДС";
Таким образом, мы передаем в Значение не ссылку на справочник, а ссылку на внутреннее перечисление. Система КД 2.1, видя, что тип значения совпадает с типом источника в указанном ПКО, применит настроенную таблицу сопоставлений значений. Это избавит нас от необходимости писать громоздкие конструкции Если...Тогда для каждой ставки.
Если вы хотите сделать код более универсальным или избежать жесткой привязки к ПКС, можно воспользоваться методом ВыгрузитьПоПравилу. Разберем этот вариант подробнее:
В том же обработчике Перед выгрузкой можно принудительно вызвать выгрузку свойства, указав конкретное правило:
СтавкаДляВыгрузки = Источник.СтавкаНДС.ПеречислениеСтавкаНДС;
ВыгрузитьПоПравилу(СтавкаДляВыгрузки, , , , "СтавкиНДС");
Важный нюанс: при таком подходе нужно следить за тем, чтобы в приемнике не возникло конфликтов из-за попытки дважды записать одно и то же свойство. Метод с подменой Значение в ПКС считается более "чистым" с точки зрения архитектуры КД 2.1.
Обратная задача — загрузка из перечисления в справочник — несколько сложнее, так как справочник в ERP 2.5 может не содержать предопределенных элементов (кроме "Без НДС"). Остальные ставки создаются динамически. При переходе с УПП 1.3 на ERP 2 во избежание самостоятельного программирования правил можно применить перенос данных из 1С:УПП в 1С:ERP 2, в котором уже настроены алгоритмы сопоставления реквизитов.
Рассмотрим стратегию загрузки через параметры табличной части:
Товары) создадим ПКС, которое не привязано к конкретному реквизиту приемника, но передает значение перечисления как Параметр.СтавкиНДС.Пример кода для обработчика После загрузки в приемнике (ERP 2.5):
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
// Предположим, мы передали ставку в параметрах строки как "СтавкаНДСПеречисление"
ЗначениеПеречисления = СтрокаТЧ.Параметры.СтавкаНДСПеречисление;
// Используем типовые механизмы ERP для поиска ссылки на справочник по значению перечисления
// В ERP 2.5 для этого есть специализированные функции в модулях менеджера справочника СтавкиНДС
СтрокаТЧ.СтавкаНДС = Справочники.СтавкиНДС.ПолучитьСтавкуНДС(ЗначениеПеречисления);
КонецЦикла;
Выясним причину, почему поиск по ГУИД здесь неэффективен: так как в источнике (УПП) ставка — это перечисление, у нее нет уникального идентификатора, сопоставимого со справочником в ERP. Поэтому поиск по наименованию или по ставке (числом) является единственным стабильным решением. Рекомендуется использовать встроенную функцию Справочники.СтавкиНДС.ПолучитьСтавкуНДСПоПараметрам(), которая учитывает не только процент, но и тип налога, а также флаг "Дробная ставка".
Проанализируем ситуацию с особыми ставками. В перечислении Ставка 0% и Без НДС — это два разных значения. В справочнике ERP 2.5 они также разделены. Однако при программном поиске часто возникает путаница.
Важные моменты:
ТипНалога = НДС и значение ставки 0.БезНДС с предопределенным элементом справочника Справочники.СтавкиНДС.БезНДС.Если вы используете Конвертацию данных 3.0 (XDTO), ситуация упрощается: формат EnterpriseData оперирует строковыми представлениями ставок, и модуль менеджера обмена в ERP 2.5 автоматически конвертирует строку вида "НДС20" в нужную ссылку справочника через кэшированные функции БСП.
Подведем итог. Чтобы ваша конвертация работала стабильно и без "костылей":
Источник на внутренний реквизит справочника ПеречислениеСтавкаНДС.СтавкиНДС.СтавкиНДС в ERP 2.5 может хранить ставки и для других налогов, поэтому при поиске всегда фильтруйте по ТипНалога.Используя эти подходы, вы обеспечите надежный обмен данными даже при глубоких изменениях в структуре метаданных конфигураций 1С. Для контроля правильности проведенной миграции имеет смысл автоматически сверить проводки между базами 1С и быстро найти возможные расхождения.