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