В современных версиях конфигураций, таких как 1С:Комплексная автоматизация 2.5 и 1С:ERP, произошли важные архитектурные изменения. Ставки НДС, которые ранее были перечислением, теперь вынесены в справочник СтавкиНДС. Это изменение потребовало пересмотра подходов к написанию запросов, так как классическая конструкция ЗНАЧЕНИЕ(Перечисление.СтавкиНДС...) стала неприменима для большинства элементов.
Давайте разберем, как эффективно переписать запросы, чтобы избежать громоздких условий ВЫБОР КОГДА и сделать код более гибким и поддерживаемым.
Самый логичный и рекомендуемый способ — это извлечение числового значения ставки непосредственно из справочника. Справочник СтавкиНДС содержит реквизит (обычно называемый Ставка), в котором хранится процентное значение (например, 20, 10 или 0).
Рассмотрим, как это реализовать на практике с помощью соединения:
ВЫБРАТЬ
Товары.Сумма * КурсыВалютСрез.Курс / КурсыВалютСрез.Кратность КАК СуммаУпр,
(Товары.Сумма * КурсыВалютСрез.Курс / КурсыВалютСрез.Кратность + Фрахт.СуммаУпр) * СтавкиНДС.Ставка * 0.01 КАК СуммаНДС
ИЗ
Документ.ПриобретениеТоваровУслуг.Товары КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СтавкиНДС КАК СтавкиНДС
ПО Товары.СтавкаНДС = СтавкиНДС.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрез
ПО ...
Преимущества этого подхода очевидны: мы избавляемся от жесткого кодирования коэффициентов (0.18, 0.20) в коде запроса. Если законодательство изменится или потребуется добавить новую ставку, достаточно будет создать элемент в справочнике СтавкиНДС, и код запроса менять не придется.
Если по какой-то причине вы не хотите соединяться с основной таблицей справочника, можно сформировать таблицу соответствий прямо внутри запроса. Это особенно удобно, если вам нужно использовать коэффициенты в нескольких местах или если логика вычисления сложнее, чем просто умножение на ставку.
ВЫБРАТЬ ЗНАЧЕНИЕ(Справочник.СтавкиНДС.НДС20) КАК Ссылка, 0.20 КАК Коэффициент
ПОМЕСТИТЬ ВТ_Ставки
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ ЗНАЧЕНИЕ(Справочник.СтавкиНДС.НДС10), 0.10
;
ВЫБРАТЬ
Товары.Сумма * ВТ_Ставки.Коэффициент КАК СуммаНДС
ИЗ
Документы.Товары КАК Товары
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Ставки КАК ВТ_Ставки
ПО Товары.СтавкаНДС = ВТ_Ставки.Ссылка
При написании сложных запросов с налогами и фрахтом часто допускают избыточность. Давайте проанализируем типичную ошибку.
Многие разработчики пишут конструкции вида ВЫБОР КОГДА Фрахт.СуммаУпр > 0 ТОГДА (База + Фрахт) * Ставка ИНАЧЕ База * Ставка КОНЕЦ. Однако, если математически проанализировать это выражение, становится ясно, что при Фрахт.СуммаУпр = 0 формула (База + 0) * Ставка идентична База * Ставка. Таким образом, усложнение кода оператором ВЫБОР в данном случае является избыточным и замедляет выполнение запроса на стороне СУБД.
Основные советы по работе с НДС в запросах:
ЕСТЬNULL, если при левом соединении со справочником ставка может оказаться не заполненной, чтобы избежать NULL в расчетах.СтавкиНДС — очень маленький, поэтому соединение с ним через ЛЕВОЕ СОЕДИНЕНИЕ практически не влияет на производительность системы.Применяя данные подходы, вы сделаете ваш код не только более коротким и понятным, но и профессионально соответствующим стандартам разработки в конфигурациях уровня ERP и КА.