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

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

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

Изменение архитектуры хранения ставок НДС в БП 3.0

Прежде чем переходить к коду, проанализируем важный методологический сдвиг, произошедший в конфигурации. В старых версиях прикладных решений в справочнике Номенклатура содержался прямой реквизит СтавкаНДС, ссылавшийся на перечисление СтавкиНДС (например, 18%, 20%, 10%). В современной версии БП 3.0 этот реквизит был удален.

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

Такой подход позволяет программе гибко определять реальную ставку налога в зависимости от периода проведения документа. Например, при выборе вида ставки Общая для документов до 2019 года система применит 18%, а после — 20%.

Решение 1. Получение ставки НДС (как элемента перечисления) по виду ставки и дате

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

Для решения этой задачи напишем универсальную функцию, которая обращается к механизмам общего модуля УчетНДСКлиентСервер:


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

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

Решение 2. Как получить числовое значение ставки (число 20, 10, 5)

Очень часто программисты сталкиваются с тем, что функции возвращают ссылку на перечисление (например, Перечисления.СтавкиНДС.НДС20), а для математических расчетов или выгрузки во внешние системы (например, API сайтов или маркетплейсов) требуется получить чистое число — 20, 10 или 0.

В конфигурации 1С:Бухгалтерия 3.0 для этого предусмотрены штатные функции, которые избавляют разработчика от необходимости писать громоздкие конструкции Если ... ИначеЕсли.

Проанализируем две основные функции:

  1. УчетНДС.ПолучитьСтавкуНДСЧислом(СтавкаНДС) — серверная функция общего назначения. Передаем в нее значение перечисления СтавкиНДС, на выходе получаем число.
  2. УчетНДСВызовСервераПовтИсп.ПолучитьСтавкуНДС(СтавкаНДС) — оптимизированная функция с механизмом повторного использования значений на сервере. Рекомендуется использовать ее при обработке больших массивов данных или в циклах табличных частей для ускорения работы алгоритма.

Посмотрим на практический пример использования в коде:


// Пример получения числового значения из перечисления
СтавкаСсылка = Перечисления.СтавкиНДС.НДС20;
ЧисловаяСтавка = УчетНДС.ПолучитьСтавкуНДСЧислом(СтавкаСсылка);
// ЧисловаяСтавка примет значение: 20

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

Решение 3. Расчет суммы НДС встроенными средствами БСП

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

Функция УчетНДСКлиентСервер.РассчитатьСуммуНДС(Сумма, СуммаВключаетНДС, СтавкаНДС) принимает в качестве параметра СтавкаНДС числовое значение (процентную ставку), которое мы научились получать в предыдущем шаге.

Рассмотрим пример расчета:


СуммаДокумента = 12000;
СуммаВключаетНДС = Истина;
СтавкаНДСПеречисление = Перечисления.СтавкиНДС.НДС20;

// Шаг 1: Получаем числовое значение ставки
ЧислоСтавки = УчетНДС.ПолучитьСтавкуНДСЧислом(СтавкаНДСПеречисление);

// Шаг 2: Рассчитываем сумму НДС
СуммаНалога = УчетНДСКлиентСервер.РассчитатьСуммуНДС(СуммаДокумента, СуммаВключаетНДС, ЧислоСтавки);
// Результат: СуммаНалога = 2000

Почему опасно использовать «хардкод» дат (важное предупреждение)

В процессе обсуждения на форумах часто предлагают простые решения «в лоб», основанные на жестком сравнении дат в коде. Например:


// НЕ РЕКОМЕНДУЕТСЯ использовать такой подход!
Объект.СтавкаНДС = ?(ТекущаяДата() >= Дата(2019, 1, 1), Перечисления.СтавкиНДС.НДС20, Перечисления.СтавкиНДС.НДС18);

Выясним причину, почему этот код крайне опасен в современных реалиях разработки под 1С:Бухгалтерию 3.0:

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

Решение 4. Получение ставки НДС по умолчанию

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

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

← На главную