При программной обработке документов или анализе данных через отладчик разработчики часто сталкиваются с ситуацией, когда в объекте СчетФактураВыданный реквизит СтавкаНДС в шапке документа содержит фиксированное значение (например, 18%, 20% или 21%), в то время как в первичном документе-основании (например, РеализацияТоваровУслуг) указаны совершенно другие условия — 0% или «Без НДС». При этом итоговые суммы взаиморасчетов и налога рассчитываются корректно. Разберем подробно, почему так происходит и как правильно получить реальную ставку налога.
Для понимания логики работы конфигураций на платформе 1С (в частности, «Управление торговлей 10.3» и аналогичных решений) проанализируем архитектуру хранения налоговых реквизитов:
Товары, Услуги). В одном документе могут одновременно находиться позиции с разными ставками: например, льготные товары, позиции со стандартной ставкой и операции без НДС.СтавкаНДС в шапке документа часто является значением по умолчанию для автоподстановки или используется для специализированных операций (например, счетов-фактур на аванс). Автоматическая обратная синхронизация ставки из строк в шапку типовой архитектурой не предусмотрена.Самым надежным и архитектурно правильным подходом является извлечение уникальных ставок НДС напрямую из строк документа-основания. Рассмотрим, как это реализовать с помощью запроса с ключевым словом РАЗЛИЧНЫЕ:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Т.СтавкаНДС КАК СтавкаНДС
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК Т
|ГДЕ
| Т.Ссылка = &ДокументОснование
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| У.СтавкаНДС
|ИЗ
| Документ.РеализацияТоваровУслуг.Услуги КАК У
|ГДЕ
| У.Ссылка = &ДокументОснование";
Запрос.УстановитьПараметр("ДокументОснование", Объект.ДокументОснование);
Выборка = Запрос.Выполнить().Выбрать();
КоличествоСтавок = Выборка.Количество();
Если КоличествоСтавок = 1 Тогда
Выборка.Следующий();
РеальнаяСтавка = Выборка.СтавкаНДС; // Тип ПеречислениеСсылка.СтавкиНДС
ИначеЕсли КоличествоСтавок > 1 Тогда
// В документе присутствуют смешанные ставки НДС
Пока Выборка.Следующий() Цикл
// Обработка каждой ставки индивидуально
КонецЦикла;
Иначе
// Документ без строк
КонецЕсли;
Обратите внимание: реквизит СтавкаНДС в строках табличной части хранит не числовое значение, а ссылку на элемент перечисления ПеречислениеСсылка.СтавкиНДС (например, Перечисления.СтавкиНДС.НДС21, Перечисления.СтавкиНДС.НДС0, Перечисления.СтавкиНДС.БезНДС). Анализ данных следует выполнять по ссылочным значениям.
В случаях быстрой обработки однородных документов, где гарантированно применяется одна ставка и нет смешанных строк, вычисляют процент математически через итоговые реквизиты документа-основания:
Если Объект.ДокументОснование.ВсегоБезНДС <> 0 Тогда
СтавкаНДСЧислом = Окр(100 * (Объект.ДокументОснование.ВсегоНДС / Объект.ДокументОснование.ВсегоБезНДС), 2);
Иначе
СтавкаНДСЧислом = 0;
КонецЕсли;
Разберем ограничения данного метода, о которых важно помнить:
Если документ-основание уже проведен по учету, точную информацию о начисленном налоге и ставках можно получить из регистра накопления (например, НДСНачисленный). Запрос к движениям регистратора позволяет получить итоговые суммы налога с группировкой по примененным ставкам без необходимости ручного перебора табличных частей.