Как при загрузке документов через Конвертацию данных установить ставку "Без НДС" в табличной части и правильно пересчитать суммы

Программист 1С v8.3 (Обычные формы) Налоговый учет IT и автоматизация бизнеса
← На главную

При переносе документов между различными конфигурациями 1С с помощью механизма «1С:Конвертация данных 2.1» (КД) часто возникает задача трансформации данных «на лету». Типичный пример — необходимость принудительно установить ставку налога в значение «Без НДС» для всех загружаемых документов (например, при переходе организации на упрощенную систему налогообложения или при выгрузке данных в базу ИП). При этом важно не просто поменять статус налога в строке, но и корректно пересчитать суммовые показатели документа, чтобы избежать расхождений в учете.

В этой статье мы подробно разберем, как решить эту задачу в правилах конвертации объектов (ПКО), проанализируем причины возникновения частых ошибок компиляции и рассмотрим правильные алгоритмы пересчета сумм документа.

---

Разбор типовой ошибки: «Переменная не определена (БезНДС)»

При попытке жестко прописать значение ставки НДС в правилах конвертации свойств (ПКС) разработчики часто сталкиваются с ошибкой компиляции в обработчике события ПередВыгрузкой. Ошибка выглядит следующим образом:

ОписаниеОшибки = Ошибка компиляции при вычислении выражения или выполнении фрагмента кода: Переменная не определена (БезНДС)

Выясним причину этой ошибки. Она кроется в неверном синтаксисе передачи значения. Когда мы пишем в коде обработчика Значение = БезНДС или пытаемся напрямую обратиться к метаданным источника вроде Значение = Перечисления.СтавкиНДС.БезНДС, платформа пытается вычислить это выражение на стороне источника. Если в базе-источнике нет такой переменной или структура перечислений отличается, возникает критический сбой компиляции.

Рассмотрим детально три правильных способа решения этой задачи.

---

Способ 1. Программная установка строкового значения в ПКС (Рекомендуемый)

Этот способ идеально подходит, если в базе-приемнике ставки НДС представлены в виде Перечисления (как это сделано во многих классических конфигурациях 1С). Нам необходимо передать строковое имя конкретного значения перечисления приемника.

Разберем процесс настройки по шагам:

  1. Откроем правила конвертации объектов (ПКО) для нужного документа.
  2. В табличной части найдем строку правила конвертации свойства (ПКС) для реквизита СтавкаНДС.
  3. Двойным кликом откроем настройки этого ПКС.
  4. Важное условие: Полностью очистим поле «Правило конвертации» (ПКО) для данного свойства. Если оставить там ПКО «СтавкиНДС», система попытается применить правила объектного сопоставления к простой строке, что вызовет ошибку.
  5. Оставим поле «Источник» пустым.
  6. Перейдем в обработчик события ПередВыгрузкой свойства и напишем следующий код:

// Передаем имя значения перечисления как строковый литерал в кавычках
Значение = "БезНДС";

Обратите внимание: значение должно быть строго в кавычках. В этом случае при загрузке XML-файла платформа сопоставит полученную строку с именем значения перечисления в конфигурации-приемнике.

---

Способ 2. Использование свойства «Выражение» в ПКС

Если мы хотим, чтобы значение вычислялось непосредственно на стороне источника при выгрузке, мы можем задействовать специальный параметр Выражение. Этот способ удобен, когда конфигурация-источник гарантированно содержит нужные метаданные.

В обработчике события ПередВыгрузкой ПКС для свойства СтавкаНДС пропишем:


// В параметр Выражение передается строка кода, которая выполнится на стороне источника
Выражение = "Перечисления.СтавкиНДС.БезНДС";

В данном случае система выполнит указанный код в контексте базы-источника, получит ссылку на значение перечисления и корректно передаст ее в файл обмена.

---

Способ 3. Настройка сопоставления без написания кода (через ПКЗ)

Если вы хотите избежать написания кода в обработчиках, в «1С:Конвертация данных» предусмотрен стандартный интерактивный механизм — Правила конвертации значений (ПКЗ). Это лучший вариант, когда нужно глобально переопределить ставки НДС для всех документов.

Проанализируем этот алгоритм:

  1. Найдем в списке правил ПКО для перечисления СтавкиНДС (или создадим его, если его нет).
  2. Перейдем на вкладку «Конвертация значений».
  3. Для каждого значения перечисления источника (например, НДС18, НДС20, НДС10) в колонке «Приемник» принудительно укажем одно и то же значение — БезНДС.
  4. В ПКС СтавкаНДС табличной части документа укажем это ПКО в качестве правила конвертации свойства.

При такой настройке при выгрузке любого документа все имеющиеся ставки налога автоматически преобразуются в ставку «Без НДС» на этапе xml-сериализации.

---

Особый случай: Перечисление vs Справочник в современных базах

Проанализируем важную техническую деталь. В современных конфигурациях 1С (таких как Бухгалтерия предприятия 3.0, Управление торговлей 11, ERP 2) ставки НДС давно хранятся не в перечислениях, а в справочнике СтавкиНДС.

Если база-приемник использует справочник, то простые строковые присвоения вида Значение = "БезНДС" работать не будут. Нам необходимо передать ссылку на элемент справочника. Разберем, как поступить в этой ситуации:

  1. Создадим ПКО для справочника СтавкиНДС.
  2. В настройках этого ПКО укажем поиск элементов по полям «Наименование» или «Ставка».
  3. В ПКС СтавкаНДС табличной части документа укажем созданное ПКО для справочника.
  4. В обработчике ПередВыгрузкой свойства передадим строковое наименование элемента справочника-приемника:

// Передаем наименование для последующего поиска в базе-приемнике
Значение = "Без НДС";

При загрузке система найдет элемент справочника по наименованию "Без НДС" и подставит ссылку на него в документ.

---

Корректировка суммовых показателей и обнуление НДС

Просто заменить ставку на "Без НДС" недостаточно. Если оставить суммы без изменений, в базу-приемник перенесутся старые значения сумм НДС и неверные итоговые суммы строк. Нам необходимо программно скорректировать связанные реквизиты табличной части.

Рассмотрим правильную обработку двух ключевых реквизитов: СуммаНДС и Сумма.

1. Как правильно очистить сумму НДС

Некоторые разработчики пытаются отключить выгрузку реквизита, прописывая в ПКС СуммаНДС в обработчике ПередВыгрузкой инструкцию Отказ = Истина;. Это методическая ошибка. При отказе от выгрузки тег свойства просто не запишется в XML, а при загрузке документа в базу-приемник система может автоматически рассчитать сумму НДС по умолчанию (например, на основе цены и количества), что вернет налог в документ.

Правильный подход — принудительно выгрузить нулевое значение налога. В ПКС СуммаНДС в обработчике ПередВыгрузкой пишем:

Значение = 0;

2. Алгоритм пересчета общей суммы строки

Здесь важно учитывать экономический смысл расчетов. Итоговая сумма строки зависит от того, был ли НДС включен в цену товара в источнике (флаг ЦенаВключаетНДС).

Разберем логику пересчета:

Посмотрим на пример правильного кода в обработчике ПередВыгрузкой для ПКС Сумма табличной части документа:


// Проверяем режим налогообложения в источнике
// ОбъектКоллекции предоставляет доступ к текущей строке табличной части
Если Источник.ЦенаВключаетНДС Тогда
    // НДС был внутри суммы, итоговая сумма строки не меняется
    Значение = ОбъектКоллекции.Сумма; 
Иначе
    // НДС начислялся сверху, при переходе на "Без НДС" сумма остается базовой (без начисления налога)
    Значение = ОбъектКоллекции.Сумма;
КонецЕсли;

Использование этого алгоритма гарантирует, что ваши документы будут перенесены без математических и логических искажений, а взаиморасчеты с контрагентами в базе-приемнике останутся корректными.

← На главную