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

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

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

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

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

Чтобы избежать подобных проблем, фирма 1С внедрила новую абстракцию — Вид ставки НДС. Теперь в справочнике Номенклатура хранится не числовое значение налога, а ссылка на перечисление ВидыСтавокНДС. Это перечисление содержит следующие категории:

  1. Общая — основная ставка налога, действующая в текущем периоде (в разное время это были 18%, затем 20%, а в перспективе могут быть и другие значения).
  2. ОбщаяРасчетная — расчетная ставка для основной ставки (например, 18/118 или 20/120).
  3. Пониженная — льготная ставка (например, 10%).
  4. ПониженнаяРасчетная — расчетная ставка для пониженной ставки (10/110).
  5. Нулевая — ставка 0% (применяется, например, при экспорте).
  6. БезНДС — операции, освобожденные от уплаты налога.

Таким образом, связь между товаром и его налогообложением теперь выглядит так: Номенклатура -> Вид ставки НДС -> Период (дата документа) -> Конкретная ставка НДС.

Периодичность хранения видов ставок

Начиная с релиза 3.0.89 «1С:Бухгалтерии предприятия», механизм стал еще более гибким. Вид ставки НДС для номенклатуры стал периодическим реквизитом. Это означает, что одна и та же позиция номенклатуры в разные периоды времени может иметь разные виды ставок (например, если товар сначала облагался по пониженной ставке, а затем льготу отменили, и он перешел на общую ставку).

В справочнике Номенклатура для этого создана табличная часть (или подчиненный регистр в зависимости от релиза) ИсторияВидаСтавкиНДС с ключевыми полями Период (дата начала действия) и ВидСтавкиНДС. При создании любого документа система анализирует дату этого документа и подставляет именно тот вид ставки НДС, который был актуален для выбранной номенклатуры на указанный момент времени.

Как получить ставку НДС программно

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

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


Функция ПолучитьСтавкуНДСНаДату(ВидСтавки, Период) Экспорт
    Если ВидСтавки = Перечисления.ВидыСтавокНДС.Общая Тогда 
        Возврат УчетНДСКлиентСервер.ОбщаяСтавкаНДС(Период);
    ИначеЕсли ВидСтавки = Перечисления.ВидыСтавокНДС.ОбщаяРасчетная Тогда 
        Возврат УчетНДСКлиентСервер.ОбщаяРасчетнаяСтавкаНДС(Период);
    ИначеЕсли ВидСтавки = Перечисления.ВидыСтавокНДС.Пониженная Тогда 
        Возврат Перечисления.СтавкиНДС.НДС10; 
    ИначеЕсли ВидСтавки = Перечисления.ВидыСтавокНДС.ПониженнаяРасчетная Тогда 
        Возврат Перечисления.СтавкиНДС.НДС10_110;
    ИначеЕсли ВидСтавки = Перечисления.ВидыСтавокНДС.Нулевая Тогда 
        Возврат Перечисления.СтавкиНДС.НДС0;
    ИначеЕсли ВидСтавки = Перечисления.ВидыСтавокНДС.БезНДС Тогда 
        Возврат Перечисления.СтавкиНДС.БезНДС;
    Иначе
        Возврат УчетНДСКлиентСервер.СтавкаНДСПоУмолчанию();
    КонецЕсли;
КонецФункции

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

ЧисловаяСтавка = УчетНДСВызовСервераПовтИсп.ПолучитьСтавкуНДС(СтавкаНДС);

Этот метод вернет числовое значение (например, 20, 10 или 0), которое уже можно напрямую использовать при калькуляции сумм в коде обработок. Для быстрого поиска и изучения других типовых функций конфигурации можно использовать справочник методов Бухгалтерии предприятия 3.0.

Как получить ставку НДС в запросах

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

Способ 1. Обработка выборки в цикле (Рекомендуемый подход)

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Номенклатура.Ссылка КАК Товар,
    |	Номенклатура.ВидСтавкиНДС КАК ВидСтавкиНДС
    |ИЗ
    |	Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |	Номенклатура.Ссылка В (&МассивТоваров)";

Запрос.УстановитьПараметр("МассивТоваров", МассивТоваров);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
    // Определяем ставку НДС на текущую рабочую дату
    ТекущаяСтавка = ПолучитьСтавкуНДСНаДату(Выборка.ВидСтавкиНДС, ТекущаяДата());
    ЧисловойПроцент = УчетНДСВызовСервераПовтИсп.ПолучитьСтавкуНДС(ТекущаяСтавка);
    
    // Выполняем дальнейшие действия с полученными значениями
КонецЦикла;

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

Способ 2. Использование конструкции ВЫБОР КОГДА в запросе

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Номенклатура.Ссылка КАК Товар,
    |	ВЫБОР
    |		КОГДА Номенклатура.ВидСтавкиНДС = ЗНАЧЕНИЕ(Перечисление.ВидыСтавокНДС.Общая)
    |			ТОГДА ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС20)
    |		КОГДА Номенклатура.ВидСтавкиНДС = ЗНАЧЕНИЕ(Перечисление.ВидыСтавокНДС.Пониженная)
    |			ТОГДА ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС10)
    |		КОГДА Номенклатура.ВидСтавкиНДС = ЗНАЧЕНИЕ(Перечисление.ВидыСтавокНДС.Нулевая)
    |			ТОГДА ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС0)
    |		ИНАЧЕ ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.БезНДС)
    |	КОНЕЦ КАК СтавкаНДС
    |ИЗ
    |	Справочник.Номенклатура КАК Номенклатура";

РезультатЗапроса = Запрос.Выполнить();

Важное предупреждение: Использование второго способа сопряжено с рисками. Если законодательство снова изменится (например, при введении новых спецставок), этот запрос придется переписывать вручную во всех отчетах, где он был применен. Для контроля корректности данных после подобных правок используется автоматическая сверка бухгалтерских и налоговых проводок между базами.

Перспективы развития механизма при налоговых реформах

Практика показала, что отказ от прямой привязки ставки НДС полностью оправдал себя во время налоговых реформ. При введении новых правил налогообложения для плательщиков УСН (со ставками 5% и 7%), а также при возможных изменениях базовых ставок, структура метаданных справочника Номенклатура остается неизменной. Программа вычисляет итоговую ставку, опираясь на учетную политику конкретной организации, дату проведения документа и указанный в карточке товара абстрактный ВидСтавкиНДС. Это позволяет сохранять историческую точность учета и минимизирует затраты на доработку системы.

← На главную