При формировании печатных форм документов (в частности, печатной формы Счет на оплату в конфигурации 1С:Бухгалтерия предприятия 3.0) разработчики часто сталкиваются с ситуацией, когда для позиций со ставкой 0% и позиций Без НДС в подвале документа выводится одинаковый текст (например, прочерк вместо суммы налога). По бухгалтерским правилам ставка 0% требует явного отражения суммы налога, равной нулю, тогда как для операций без налога выводится формулировка «Без налога (НДС)» с прочерком.
Разберем, почему возникает данная проблема, какие ошибки чаще всего допускаются в коде условий и как правильно реализовать раздельный вывод итогов НДС в печатной форме.
Рассмотрим типовой фрагмент формирования подвала счета на оплату:
Если СуммаНДС <> 0 Тогда
НДС = ?(СведенияОДокументе.СуммаВключаетНДС, НСтр("ru='В том числе НДС:'"), НСтр("ru='Сумма НДС:'"));
ВсегоНДС = ОбщегоНазначенияБПВызовСервера.ФорматСумм(СуммаНДС);
Иначе
НДС = НСтр("ru='Без налога (НДС)'");
ВсегоНДС = НСтр("ru='-'");
КонецЕсли;
Проанализируем, почему этот код не различает нулевую ставку и освобождение от налога:
СуммаНДС равна нулю как при ставке «0%», так и при ставке «Без НДС». Простая проверка СуммаНДС <> 0 отправляет обе ситуации в ветку Иначе.СведенияОДокументе попадают реквизиты шапки и итоговые суммы, а не перечисление СтавкиНДС конкретной строки.Если СтавкаНДС <> Перечисления.СтавкиНДС.НДС0 Тогда приводит к логической ошибке: значение «Без НДС» также не равно «НДС0», поэтому условие всегда возвращает истину в первой же ветке.Разберем по шагам правильный алгоритм. Перед тем как выводить область подвала табличного документа, необходимо проверить результирующую таблицу строк (например, ТаблицаДокумента или объединенную таблицу товаров и услуг) на наличие значения перечисления Перечисления.СтавкиНДС.НДС0.
Посмотрим на пример реализации:
ЕстьНДС0 = (ТаблицаДокумента.Найти(Перечисления.СтавкиНДС.НДС0, "СтавкаНДС") <> Неопределено);
Если СуммаНДС <> 0 Тогда
НДС = ?(СведенияОДокументе.СуммаВключаетНДС, НСтр("ru='В том числе НДС:'"), НСтр("ru='Сумма НДС:'"));
ВсегоНДС = ОбщегоНазначенияБПВызовСервера.ФорматСумм(СуммаНДС);
ИначеЕсли ЕстьНДС0 Тогда
НДС = ?(СведенияОДокументе.СуммаВключаетНДС, НСтр("ru='В том числе НДС:'"), НСтр("ru='Сумма НДС:'"));
ВсегоНДС = ОбщегоНазначенияБПВызовСервера.ФорматСумм(0);
Иначе
НДС = НСтр("ru='Без налога (НДС)'");
ВсегоНДС = НСтр("ru='-'");
КонецЕсли;
В этом примере мы используем метод Найти() таблицы значений для поиска строки с нулевой ставкой. Если сумма налога равна нулю, но в документе найдена ставка 0%, программа выведет В том числе НДС: 0,00 (или сумму в соответствии с настройкой СуммаВключаетНДС), а при отсутствии нулевой ставки — стандартную строку Без налога (НДС) с прочерком.
Если в документе потенциально могут присутствовать строки с различными ставками (например, одновременно облагаемые и необлагаемые позиции), надежнее выполнить предварительную сводку данных перед заполнением параметров области макета.
Рассмотрим пример группировки данных:
ТаблицаСтавок = ТаблицаДокумента.Скопировать(, "СтавкаНДС, СуммаНДС");
ТаблицаСтавок.Свернуть("СтавкаНДС", "СуммаНДС");
СтрокаНДС0 = ТаблицаСтавок.Найти(ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС0"), "СтавкаНДС");
СтрокаБезНДС = ТаблицаСтавок.Найти(ПредопределенноеЗначение("Перечисление.СтавкиНДС.БезНДС"), "СтавкаНДС");
Если СуммаНДС <> 0 Тогда
НДС = ?(СведенияОДокументе.СуммаВключаетНДС, НСтр("ru='В том числе НДС:'"), НСтр("ru='Сумма НДС:'"));
ВсегоНДС = ОбщегоНазначенияБПВызовСервера.ФорматСумм(СуммаНДС);
ИначеЕсли СтрокаНДС0 <> Неопределено Тогда
НДС = ?(СведенияОДокументе.СуммаВключаетНДС, НСтр("ru='В том числе НДС:'"), НСтр("ru='Сумма НДС:'"));
ВсегоНДС = Формат(0, "ЧДЦ=2; ЧН=0,00");
Иначе
НДС = НСтр("ru='Без налога (НДС)'");
ВсегоНДС = НСтр("ru='-'");
КонецЕсли;
ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС0")."0". Используйте функцию ОбщегоНазначенияБПВызовСервера.ФорматСумм(0) или функцию Формат() с параметром ЧДЦ=2; ЧН=0,00, чтобы разрядность копеек совпадала с остальными суммами документа.