При разработке в конфигурации 1С:Бухгалтерия 3.0 (БП 3.0) программисты часто сталкиваются с необходимостью программно получить ставку НДС для заполнения документов, печатных форм или выполнения математических расчетов. Начиная с последних версий БП 3.0, архитектура работы со ставками НДС претерпела значительные изменения. В этой статье мы подробно разберем, как правильно извлекать ставки НДС, как преобразовывать их в числовой формат и какие функции общего назначения Библиотеки Стандартных Подсистем (БСП) и прикладного решения нам в этом помогут.
Прежде чем переходить к коду, проанализируем важный методологический сдвиг, произошедший в конфигурации. В старых версиях прикладных решений в справочнике Номенклатура содержался прямой реквизит СтавкаНДС, ссылавшийся на перечисление СтавкиНДС (например, 18%, 20%, 10%). В современной версии БП 3.0 этот реквизит был удален.
Вместо него в справочнике появился реквизит ВидСтавкиНДС, который ссылается на перечисление ВидыСтавокНДС со значениями:
Такой подход позволяет программе гибко определять реальную ставку налога в зависимости от периода проведения документа. Например, при выборе вида ставки Общая для документов до 2019 года система применит 18%, а после — 20%.
Рассмотрим классическую задачу: у нас есть вид ставки из карточки номенклатуры (например, Перечисления.ВидыСтавокНДС.Общая) и дата документа. Нам необходимо получить конкретное значение перечисления СтавкиНДС (например, Перечисления.СтавкиНДС.НДС20).
Для решения этой задачи напишем универсальную функцию, которая обращается к механизмам общего модуля УчетНДСКлиентСервер:
Функция ПолучитьСтавкуНДСПоВидуИДате(ВидСтавки, Период) Экспорт
Если ВидСтавки = Перечисления.ВидыСтавокНДС.Общая Тогда
Возврат УчетНДСКлиентСервер.ОбщаяСтавкаНДС(Период);
ИначеЕсли ВидСтавки = Перечисления.ВидыСтавокНДС.ОбщаяРасчетная Тогда
Возврат УчетНДСКлиентСервер.ОбщаяРасчетнаяСтавкаНДС(Период);
ИначеЕсли ВидСтавки = Перечисления.ВидыСтавокНДС.Пониженная Тогда
Возврат Перечисления.СтавкиНДС.НДС10;
ИначеЕсли ВидСтавки = Перечисления.ВидыСтавокНДС.ПониженнаяРасчетная Тогда
Возврат Перечисления.СтавкиНДС.НДС10_110;
ИначеЕсли ВидСтавки = Перечисления.ВидыСтавокНДС.Нулевая Тогда
Возврат Перечисления.СтавкиНДС.НДС0;
ИначеЕсли ВидСтавки = Перечисления.ВидыСтавокНДС.БезНДС Тогда
Возврат Перечисления.СтавкиНДС.БезНДС;
Иначе
Возврат Перечисления.СтавкиНДС.ПустаяСсылка();
КонецЕсли;
КонецФункции
Давайте разберем по шагам, как работает этот алгоритм. Если вид ставки является фиксированным (например, нулевая или пониженная 10%), функция сразу возвращает соответствующее предопределенное значение. Если же вид ставки относится к общей, мы вызываем функцию общего модуля УчетНДСКлиентСервер.ОбщаяСтавкаНДС(Период), которая под капотом определяет актуальную ставку (18% или 20%) в зависимости от переданной даты.
Очень часто программисты сталкиваются с тем, что функции возвращают ссылку на перечисление (например, Перечисления.СтавкиНДС.НДС20), а для математических расчетов или выгрузки во внешние системы (например, API сайтов или маркетплейсов) требуется получить чистое число — 20, 10 или 0.
В конфигурации 1С:Бухгалтерия 3.0 для этого предусмотрены штатные функции, которые избавляют разработчика от необходимости писать громоздкие конструкции Если ... ИначеЕсли.
Проанализируем две основные функции:
УчетНДС.ПолучитьСтавкуНДСЧислом(СтавкаНДС) — серверная функция общего назначения. Передаем в нее значение перечисления СтавкиНДС, на выходе получаем число.УчетНДСВызовСервераПовтИсп.ПолучитьСтавкуНДС(СтавкаНДС) — оптимизированная функция с механизмом повторного использования значений на сервере. Рекомендуется использовать ее при обработке больших массивов данных или в циклах табличных частей для ускорения работы алгоритма.Посмотрим на практический пример использования в коде:
// Пример получения числового значения из перечисления
СтавкаСсылка = Перечисления.СтавкиНДС.НДС20;
ЧисловаяСтавка = УчетНДС.ПолучитьСтавкуНДСЧислом(СтавкаСсылка);
// ЧисловаяСтавка примет значение: 20
// Быстрое получение числа с кэшированием в цикле
Для Каждого СтрокаТовара Из ТабличнаяЧасть Цикл
ДробнаяСтавка = УчетНДСВызовСервераПовтИсп.ПолучитьСтавкуНДС(СтрокаТовара.СтавкаНДС);
КонецЦикла;
Если ваша конечная цель состоит в том, чтобы рассчитать сумму налога на основе полученной ставки, не обязательно писать математические формулы вручную. В общем модуле УчетНДСКлиентСервер реализована готовая функция, которая учитывает все нюансы (включая расчет «в том числе»):
Функция УчетНДСКлиентСервер.РассчитатьСуммуНДС(Сумма, СуммаВключаетНДС, СтавкаНДС) принимает в качестве параметра СтавкаНДС числовое значение (процентную ставку), которое мы научились получать в предыдущем шаге.
Рассмотрим пример расчета:
СуммаДокумента = 12000;
СуммаВключаетНДС = Истина;
СтавкаНДСПеречисление = Перечисления.СтавкиНДС.НДС20;
// Шаг 1: Получаем числовое значение ставки
ЧислоСтавки = УчетНДС.ПолучитьСтавкуНДСЧислом(СтавкаНДСПеречисление);
// Шаг 2: Рассчитываем сумму НДС
СуммаНалога = УчетНДСКлиентСервер.РассчитатьСуммуНДС(СуммаДокумента, СуммаВключаетНДС, ЧислоСтавки);
// Результат: СуммаНалога = 2000
В процессе обсуждения на форумах часто предлагают простые решения «в лоб», основанные на жестком сравнении дат в коде. Например:
// НЕ РЕКОМЕНДУЕТСЯ использовать такой подход!
Объект.СтавкаНДС = ?(ТекущаяДата() >= Дата(2019, 1, 1), Перечисления.СтавкиНДС.НДС20, Перечисления.СтавкиНДС.НДС18);
Выясним причину, почему этот код крайне опасен в современных реалиях разработки под 1С:Бухгалтерию 3.0:
СтавкиНДС пополнилось новыми предопределенными значениями (НДС5, НДС7 и т. д.).Правило разработки: Всегда делегируйте расчет актуальной ставки типовым механизмам БСП. Используйте функции общего модуля УчетНДС, которые обновляются фирмой «1С» при каждом изменении законодательства.
В интерактивных сценариях (например, при добавлении новой строки в табличную часть пользователем) необходимо быстро подставить ставку НДС по умолчанию. Для этого рекомендуется использовать специализированные методы:
УчетНДСКлиентСервер.СтавкаНДСПоУмолчанию() — возвращает значение по умолчанию для текущего контекста конфигурации.УчетНДСКлиент.ПолучитьСтавкуНДСПоУмолчанию(ПлательщикНДС) — учитывает статус контрагента и организации как плательщика налога.Используя приведенные выше методы и стандартные функции БСП, вы сможете писать надежный код, устойчивый к изменениям законодательства и обновлениям платформы 1С:Предприятие. Для быстрого поиска других типовых процедур и функций конфигурации пригодится справочник методов Бухгалтерии предприятия 3.0.