С развитием налогового законодательства и изменением основной ставки НДС с 18% до 20%, фирма 1С изменила архитектуру хранения данных в типовых конфигурациях (прежде всего в 1С:Бухгалтерия предприятия 3.0, УТ 11 и ERP). Вместо хранения фиксированного значения ставки в справочнике Номенклатура, теперь используется механизм «Вид ставки НДС». Это позволяет системе автоматически определять нужный процент в зависимости от даты совершения операции.
Разберем подробно, как адаптировать ваши отчеты и запросы под эти изменения, проанализируем новую структуру метаданных и рассмотрим практические примеры кода.
Ранее в справочнике Номенклатура существовал реквизит СтавкаНДС, который ссылался на одноименное перечисление (например, НДС18, НДС10). Проблема возникла 1 января 2019 года: одна и та же «общая» ставка для одной и той же номенклатуры должна была превратиться из 18% в 20%. Если бы 1С оставила старую логику, программистам пришлось бы массово обновлять реквизиты во всем справочнике номенклатуры в новогоднюю ночь, что привело бы к ошибкам в документах прошлых периодов.
Решение, которое мы видим сейчас, — это введение реквизита ВидСтавкиНДС. Рассмотрим значения нового перечисления ВидыСтавокНДС:
Теперь программа хранит не «сколько процентов налога», а «какой тип налогообложения» применяется к товару, а конкретную цифру вычисляет в момент записи документа или формирования отчета.
Проанализируем ситуацию, когда нам нужно в запросе получить коэффициент для расчета суммы с НДС. Если в вашем старом коде была проверка на конкретное значение Перечисление.СтавкиНДС.НДС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С не удаляет старый реквизит СтавкаНДС мгновенно. Обычно он переименовывается в УдалитьСтавкаНДС. Это делается для обеспечения обратной совместимости. Рассмотрим, стоит ли его использовать:
Мы не рекомендуем продолжать использовать реквизит с префиксом Удалить. Во-первых, он перестает обновляться программными обработками. Во-вторых, его наличие в конфигурации временно — через несколько релизов он будет окончательно удален из структуры метаданных. Переход на ВидСтавкиНДС — это неизбежный шаг для обеспечения стабильности вашего кода в будущем.
Разберем сложную ситуацию: что делать с корректировочными счетами-фактурами? Если первичная реализация была в 2018 году (18%), а корректировка создается в 2024 году, система должна удержать ставку 18%. В этом случае ВидСтавки в номенклатуре (который сейчас равен «Общая») может запутать логику, если ориентироваться только на дату текущего документа.
Посмотрим, как это решено в типовых: в документах купли-продажи (Реализация, Поступление) реквизит СтавкаНДС в табличной части сохранился. Он по-прежнему хранит прямую ссылку на перечисление СтавкиНДС (НДС18, НДС20). Изменение коснулось только подстановки по умолчанию из справочника номенклатуры. Поэтому в запросах, анализирующих движения документов, лучше брать ставку напрямую из документа, а не из карточки номенклатуры.
Проанализировав изменения, мы можем выделить следующий алгоритм действий для программиста:
СтавкаНДС в табличной части). Она там зафиксирована в момент проведения и не зависит от изменений в справочниках.ВидСтавкиНДС из справочника номенклатуры и функцию УчетНДС.ПолучитьСтавкуНДС() для определения конкретного значения на дату документа.ТекущаяДата()) для вычисления процента, который будет актуален «на сегодня».Механизм «Вид ставки» — это универсальный фундамент. Он позволяет 1С оперативно реагировать на изменения налогов без переписывания структуры базы данных, перенося всю сложность в один общий модуль, отвечающий за расчеты.