Как переделать запрос при переходе с реквизита СтавкаНДС на ВидСтавкиНДС в 1С:Бухгалтерия 3.0

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

С развитием налогового законодательства и изменением основной ставки НДС с 18% до 20%, фирма 1С изменила архитектуру хранения данных в типовых конфигурациях (прежде всего в 1С:Бухгалтерия предприятия 3.0, УТ 11 и ERP). Вместо хранения фиксированного значения ставки в справочнике Номенклатура, теперь используется механизм «Вид ставки НДС». Это позволяет системе автоматически определять нужный процент в зависимости от даты совершения операции.

Разберем подробно, как адаптировать ваши отчеты и запросы под эти изменения, проанализируем новую структуру метаданных и рассмотрим практические примеры кода.

Почему 1С отказалась от хранения прямой ссылки на Ставку НДС

Ранее в справочнике Номенклатура существовал реквизит СтавкаНДС, который ссылался на одноименное перечисление (например, НДС18, НДС10). Проблема возникла 1 января 2019 года: одна и та же «общая» ставка для одной и той же номенклатуры должна была превратиться из 18% в 20%. Если бы 1С оставила старую логику, программистам пришлось бы массово обновлять реквизиты во всем справочнике номенклатуры в новогоднюю ночь, что привело бы к ошибкам в документах прошлых периодов.

Решение, которое мы видим сейчас, — это введение реквизита ВидСтавкиНДС. Рассмотрим значения нового перечисления ВидыСтавокНДС:

  1. Общая — соответствует 18% до 2019 года и 20% после.
  2. Общая расчетная — 18/118 или 20/120 соответственно.
  3. Пониженная — соответствует 10%.
  4. Пониженная расчетная — 10/110.
  5. Нулевая — 0%.
  6. Без НДС — налог не взимается.

Теперь программа хранит не «сколько процентов налога», а «какой тип налогообложения» применяется к товару, а конкретную цифру вычисляет в момент записи документа или формирования отчета.

Адаптация запроса: ручное сопоставление через ВЫБОР

Проанализируем ситуацию, когда нам нужно в запросе получить коэффициент для расчета суммы с НДС. Если в вашем старом коде была проверка на конкретное значение Перечисление.СтавкиНДС.НДС18, теперь нам нужно учитывать дату документа. Рассмотрим пример модификации части запроса:


ВЫБОР
    КОГДА &СуммаСНДС ТОГДА
        СебестоимостиПродукции.ЦенаФакт * 
        ВЫБОР
            // Обработка общей ставки (18% или 20%)
            КОГДА ОтчётыПроизводства.Номенклатура.ВидСтавкиНДС = ЗНАЧЕНИЕ(Перечисление.ВидыСтавокНДС.Общая)
                 ИЛИ ОтчётыПроизводства.Номенклатура.ВидСтавкиНДС = ЗНАЧЕНИЕ(Перечисление.ВидыСтавокНДС.ОбщаяРасчетная)
            ТОГДА
                ВЫБОР
                    КОГДА ОтчётыПроизводства.Ссылка.Дата < ДАТАВРЕМЯ(2019, 1, 1) ТОГДА 1.18
                    ИНАЧЕ 1.20
                КОНЕЦ
            
            // Обработка пониженной ставки (10%)
            КОГДА ОтчётыПроизводства.Номенклатура.ВидСтавкиНДС = ЗНАЧЕНИЕ(Перечисление.ВидыСтавокНДС.Пониженная)
                 ИЛИ ОтчётыПроизводства.Номенклатура.ВидСтавкиНДС = ЗНАЧЕНИЕ(Перечисление.ВидыСтавокНДС.ПониженнаяРасчетная)
            ТОГДА 1.10
            
            // Все остальные случаи (0% или Без НДС)
            ИНАЧЕ 1.00
        КОНЕЦ
ИНАЧЕ
    СебестоимостиПродукции.ЦенаФакт
КОНЕЦ

Важный момент: в этом примере мы обязательно используем дату документа (в данном случае ОтчётыПроизводства.Ссылка.Дата). Без привязки к дате невозможно однозначно определить, какой коэффициент применять для «Общей» ставки.

Использование программных механизмов в модулях

Если логика расчета находится не в самом теле запроса, а в коде на встроенном языке, мы крайне рекомендуем использовать типовые функции 1С. В конфигурации Бухгалтерия предприятия 3.0 существует общий модуль УчетНДС, который содержит функции для определения ставки.

Выясним, как это работает на уровне платформы. В модуле менеджера перечисления ВидыСтавокНДС реализована функция, которая возвращает значение СтавкиНДС (конкретную ссылку на 18%, 20% или 10%) на основании переданной даты. Рассмотрим пример вызова:


// Получаем ставку для подстановки в новый документ
ДатаОперации = Объект.Дата;
ВидСтавки = НоменклатураСсылка.ВидСтавкиНДС;
НужнаяСтавка = УчетНДС.ПолучитьСтавкуНДС(ВидСтавки, ДатаОперации);

Этот подход гораздо надежнее ручного «хардкода» дат в запросах, так как при очередном изменении законодательства (например, если завтра введут ставку 12% или 25%), вам достаточно будет обновить конфигурацию, и типовой модуль сам отработает новую дату, а ваши самописные отчеты продолжат работать корректно.

Особенности работы с СКД (Системой компоновки данных)

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

  1. Добавим в набор данных поле ВидСтавкиНДС и ДатаДокумента.
  2. Вкладка "Вычисляемые поля": создадим поле СтавкаКоэффициент.
  3. В выражении поля можно прописать логику, аналогичную запросу выше, или вызвать экспортную функцию общего модуля (если разрешено выполнение функций в настройках СКД).

Такой подход позволяет отделить логику хранения (вид ставки) от логики визуализации (процент налога в печатной форме).

Работа с реквизитом УдалитьСтавкаНДС

В процессе обновления информационных баз 1С не удаляет старый реквизит СтавкаНДС мгновенно. Обычно он переименовывается в УдалитьСтавкаНДС. Это делается для обеспечения обратной совместимости. Рассмотрим, стоит ли его использовать:

Мы не рекомендуем продолжать использовать реквизит с префиксом Удалить. Во-первых, он перестает обновляться программными обработками. Во-вторых, его наличие в конфигурации временно — через несколько релизов он будет окончательно удален из структуры метаданных. Переход на ВидСтавкиНДС — это неизбежный шаг для обеспечения стабильности вашего кода в будущем.

Поддержка переходного периода в корректировках

Разберем сложную ситуацию: что делать с корректировочными счетами-фактурами? Если первичная реализация была в 2018 году (18%), а корректировка создается в 2024 году, система должна удержать ставку 18%. В этом случае ВидСтавки в номенклатуре (который сейчас равен «Общая») может запутать логику, если ориентироваться только на дату текущего документа.

Посмотрим, как это решено в типовых: в документах купли-продажи (Реализация, Поступление) реквизит СтавкаНДС в табличной части сохранился. Он по-прежнему хранит прямую ссылку на перечисление СтавкиНДС (НДС18, НДС20). Изменение коснулось только подстановки по умолчанию из справочника номенклатуры. Поэтому в запросах, анализирующих движения документов, лучше брать ставку напрямую из документа, а не из карточки номенклатуры.

Итоги и рекомендации

Проанализировав изменения, мы можем выделить следующий алгоритм действий для программиста:

  1. Если вы пишете внешнюю печатную форму, берите ставку из документа-основания (реквизит СтавкаНДС в табличной части). Она там зафиксирована в момент проведения и не зависит от изменений в справочниках.
  2. Если вы создаете новый документ программно, используйте ВидСтавкиНДС из справочника номенклатуры и функцию УчетНДС.ПолучитьСтавкуНДС() для определения конкретного значения на дату документа.
  3. Если вы пишете аналитический отчет по справочнику (например, прайс-лист), используйте текущую дату (ТекущаяДата()) для вычисления процента, который будет актуален «на сегодня».

Механизм «Вид ставки» — это универсальный фундамент. Он позволяет 1С оперативно реагировать на изменения налогов без переписывания структуры базы данных, перенося всю сложность в один общий модуль, отвечающий за расчеты.

← На главную