Как правильно использовать ставки НДС в запросах 1С:КА 2.5 и ERP при работе со справочником?

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

В современных версиях конфигураций, таких как 1С:Комплексная автоматизация 2.5 и 1С:ERP, произошли важные архитектурные изменения. Ставки НДС, которые ранее были перечислением, теперь вынесены в справочник СтавкиНДС. Это изменение потребовало пересмотра подходов к написанию запросов, так как классическая конструкция ЗНАЧЕНИЕ(Перечисление.СтавкиНДС...) стала неприменима для большинства элементов.

Давайте разберем, как эффективно переписать запросы, чтобы избежать громоздких условий ВЫБОР КОГДА и сделать код более гибким и поддерживаемым.

Способ №1: Использование левого соединения со справочником

Самый логичный и рекомендуемый способ — это извлечение числового значения ставки непосредственно из справочника. Справочник СтавкиНДС содержит реквизит (обычно называемый Ставка), в котором хранится процентное значение (например, 20, 10 или 0).

Рассмотрим, как это реализовать на практике с помощью соединения:


ВЫБРАТЬ
    Товары.Сумма * КурсыВалютСрез.Курс / КурсыВалютСрез.Кратность КАК СуммаУпр,
    (Товары.Сумма * КурсыВалютСрез.Курс / КурсыВалютСрез.Кратность + Фрахт.СуммаУпр) * СтавкиНДС.Ставка * 0.01 КАК СуммаНДС
ИЗ
    Документ.ПриобретениеТоваровУслуг.Товары КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СтавкиНДС КАК СтавкиНДС
    ПО Товары.СтавкаНДС = СтавкиНДС.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрез
    ПО ...

Преимущества этого подхода очевидны: мы избавляемся от жесткого кодирования коэффициентов (0.18, 0.20) в коде запроса. Если законодательство изменится или потребуется добавить новую ставку, достаточно будет создать элемент в справочнике СтавкиНДС, и код запроса менять не придется.

Способ №2: Использование временных таблиц для маппинга

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


ВЫБРАТЬ ЗНАЧЕНИЕ(Справочник.СтавкиНДС.НДС20) КАК Ссылка, 0.20 КАК Коэффициент
ПОМЕСТИТЬ ВТ_Ставки
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ ЗНАЧЕНИЕ(Справочник.СтавкиНДС.НДС10), 0.10
;
ВЫБРАТЬ
    Товары.Сумма * ВТ_Ставки.Коэффициент КАК СуммаНДС
ИЗ
    Документы.Товары КАК Товары
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Ставки КАК ВТ_Ставки
    ПО Товары.СтавкаНДС = ВТ_Ставки.Ссылка

Важные рекомендации по оптимизации вычислений

При написании сложных запросов с налогами и фрахтом часто допускают избыточность. Давайте проанализируем типичную ошибку.

Многие разработчики пишут конструкции вида ВЫБОР КОГДА Фрахт.СуммаУпр > 0 ТОГДА (База + Фрахт) * Ставка ИНАЧЕ База * Ставка КОНЕЦ. Однако, если математически проанализировать это выражение, становится ясно, что при Фрахт.СуммаУпр = 0 формула (База + 0) * Ставка идентична База * Ставка. Таким образом, усложнение кода оператором ВЫБОР в данном случае является избыточным и замедляет выполнение запроса на стороне СУБД.

Основные советы по работе с НДС в запросах:

  1. Всегда используйте ЕСТЬNULL, если при левом соединении со справочником ставка может оказаться не заполненной, чтобы избежать NULL в расчетах.
  2. Старайтесь выносить математические коэффициенты в справочник или в параметры виртуальной таблицы, чтобы код оставался чистым.
  3. Помните, что справочник СтавкиНДС — очень маленький, поэтому соединение с ним через ЛЕВОЕ СОЕДИНЕНИЕ практически не влияет на производительность системы.
  4. Избегайте прямого обращения к реквизитам справочника через точку, если есть возможность использовать соединение. Это стандарт хорошего тона при написании эффективных запросов.

Применяя данные подходы, вы сделаете ваш код не только более коротким и понятным, но и профессионально соответствующим стандартам разработки в конфигурациях уровня ERP и КА.

← На главную