Как в печатной форме счета на оплату разделить вывод ставки НДС 0% и Без НДС?

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

При формировании печатных форм документов (в частности, печатной формы Счет на оплату в конфигурации 1С:Бухгалтерия предприятия 3.0) разработчики часто сталкиваются с ситуацией, когда для позиций со ставкой 0% и позиций Без НДС в подвале документа выводится одинаковый текст (например, прочерк вместо суммы налога). По бухгалтерским правилам ставка 0% требует явного отражения суммы налога, равной нулю, тогда как для операций без налога выводится формулировка «Без налога (НДС)» с прочерком.

Разберем, почему возникает данная проблема, какие ошибки чаще всего допускаются в коде условий и как правильно реализовать раздельный вывод итогов НДС в печатной форме.

Анализ причин проблемы

Рассмотрим типовой фрагмент формирования подвала счета на оплату:


Если СуммаНДС <> 0 Тогда
    НДС = ?(СведенияОДокументе.СуммаВключаетНДС, НСтр("ru='В том числе НДС:'"), НСтр("ru='Сумма НДС:'"));
    ВсегоНДС = ОбщегоНазначенияБПВызовСервера.ФорматСумм(СуммаНДС);
Иначе
    НДС = НСтр("ru='Без налога (НДС)'");
    ВсегоНДС = НСтр("ru='-'");
КонецЕсли;

Проанализируем, почему этот код не различает нулевую ставку и освобождение от налога:

  1. Математическое равенство сумм: Чисто арифметически переменная СуммаНДС равна нулю как при ставке «0%», так и при ставке «Без НДС». Простая проверка СуммаНДС <> 0 отправляет обе ситуации в ветку Иначе.
  2. Контекст формирования подвала: Значение общей ставки в шапке документа отсутствует, так как документ может содержать строки с разными ставками. В структуру СведенияОДокументе попадают реквизиты шапки и итоговые суммы, а не перечисление СтавкиНДС конкретной строки.
  3. Ошибки в построении ветвлений: Попытка написать условие вида Если СтавкаНДС <> Перечисления.СтавкиНДС.НДС0 Тогда приводит к логической ошибке: значение «Без НДС» также не равно «НДС0», поэтому условие всегда возвращает истину в первой же ветке.

Способ 1. Проверка наличия ставки 0% по таблице строк документа

Разберем по шагам правильный алгоритм. Перед тем как выводить область подвала табличного документа, необходимо проверить результирующую таблицу строк (например, ТаблицаДокумента или объединенную таблицу товаров и услуг) на наличие значения перечисления Перечисления.СтавкиНДС.НДС0.

Посмотрим на пример реализации:


ЕстьНДС0 = (ТаблицаДокумента.Найти(Перечисления.СтавкиНДС.НДС0, "СтавкаНДС") <> Неопределено);

Если СуммаНДС <> 0 Тогда
    НДС = ?(СведенияОДокументе.СуммаВключаетНДС, НСтр("ru='В том числе НДС:'"), НСтр("ru='Сумма НДС:'"));
    ВсегоНДС = ОбщегоНазначенияБПВызовСервера.ФорматСумм(СуммаНДС);
ИначеЕсли ЕстьНДС0 Тогда
    НДС = ?(СведенияОДокументе.СуммаВключаетНДС, НСтр("ru='В том числе НДС:'"), НСтр("ru='Сумма НДС:'"));
    ВсегоНДС = ОбщегоНазначенияБПВызовСервера.ФорматСумм(0);
Иначе
    НДС = НСтр("ru='Без налога (НДС)'");
    ВсегоНДС = НСтр("ru='-'");
КонецЕсли;

В этом примере мы используем метод Найти() таблицы значений для поиска строки с нулевой ставкой. Если сумма налога равна нулю, но в документе найдена ставка 0%, программа выведет В том числе НДС: 0,00 (или сумму в соответствии с настройкой СуммаВключаетНДС), а при отсутствии нулевой ставки — стандартную строку Без налога (НДС) с прочерком.

Способ 2. Свертка таблицы строк для комплексного анализа ставок

Если в документе потенциально могут присутствовать строки с различными ставками (например, одновременно облагаемые и необлагаемые позиции), надежнее выполнить предварительную сводку данных перед заполнением параметров области макета.

Рассмотрим пример группировки данных:


ТаблицаСтавок = ТаблицаДокумента.Скопировать(, "СтавкаНДС, СуммаНДС");
ТаблицаСтавок.Свернуть("СтавкаНДС", "СуммаНДС");

СтрокаНДС0 = ТаблицаСтавок.Найти(ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС0"), "СтавкаНДС");
СтрокаБезНДС = ТаблицаСтавок.Найти(ПредопределенноеЗначение("Перечисление.СтавкиНДС.БезНДС"), "СтавкаНДС");

Если СуммаНДС <> 0 Тогда
    НДС = ?(СведенияОДокументе.СуммаВключаетНДС, НСтр("ru='В том числе НДС:'"), НСтр("ru='Сумма НДС:'"));
    ВсегоНДС = ОбщегоНазначенияБПВызовСервера.ФорматСумм(СуммаНДС);
ИначеЕсли СтрокаНДС0 <> Неопределено Тогда
    НДС = ?(СведенияОДокументе.СуммаВключаетНДС, НСтр("ru='В том числе НДС:'"), НСтр("ru='Сумма НДС:'"));
    ВсегоНДС = Формат(0, "ЧДЦ=2; ЧН=0,00");
Иначе
    НДС = НСтр("ru='Без налога (НДС)'");
    ВсегоНДС = НСтр("ru='-'");
КонецЕсли;

Важные рекомендации при работе с внешними печатными формами

  1. Обращение к предопределенным значениям: Если алгоритм формирования печатной формы выполняется в контексте, где прямая ссылка на менеджер перечислений недоступна, рекомендуется использовать функцию ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС0").
  2. Форматирование чисел: Для вывода нулевого значения суммы налога не следует передавать жестко заданную строку "0". Используйте функцию ОбщегоНазначенияБПВызовСервера.ФорматСумм(0) или функцию Формат() с параметром ЧДЦ=2; ЧН=0,00, чтобы разрядность копеек совпадала с остальными суммами документа.
← На главную