К статье
Практический материал

Разработка и Конфигурация · 9 мин

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

Как в 1С получить числовое значение ставки НДС из перечисления: встроенные функции, запросы, обработка ставок 20%, 10%, 0% и «Без НДС» в коде и отчётах.

Во встроенном языке 1С ставка НДС хранится как значение перечисления Перечисление.СтавкиНДС (например, НДС20, НДС10, БезНДС), а не как число. Это удобно для документов, но мешает, когда нужно посчитать сумму налога вручную, выгрузить данные во внешнюю систему или сформировать произвольный отчёт. Перечисление нельзя напрямую умножить на сумму — попытка вызовет ошибку преобразования типов.

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

Важный нюанс: в типовых конфигурациях на БСП (Бухгалтерия предприятия 3.0, Управление торговлей 11, ERP) уже есть готовые функции получения числовой ставки, и в большинстве случаев писать собственное соответствие не нужно. Собственный код оправдан только в самописных конфигурациях или нестандартных обработках.

Как устроено перечисление ставок НДС в 1С

Перечисление СтавкиНДС содержит предопределённые значения: НДС20, НДС20_120, НДС10, НДС10_110, НДС0, БезНДС (состав зависит от версии конфигурации). Каждое значение — это ссылка на элемент перечисления, а не число. Функция ЗначениеВСтрокуВнутр() или обращение к Синоним вернут представление, но не пригодное для расчётов число.

Обратите внимание на расчётные ставки НДС20_120 и НДС10_110: они применяются при получении авансов и в других случаях, когда налог выделяется из суммы «в том числе НДС». Числовой эквивалент для выделения налога — 20/120 или 10/110, а не 0.2 и 0.1. Путать обычную и расчётную ставку — одна из самых частых причин ошибок в суммах.

Способ 1: готовые функции типовых конфигураций

В конфигурациях на базе Библиотеки стандартных подсистем задача уже решена разработчиками. Перед тем как писать свой код, проверьте наличие типовых функций — они учитывают все значения перечисления, включая расчётные ставки, и поддерживаются при обновлениях.

В Бухгалтерии предприятия 3.0 используется функция общего модуля УчетНДСВызовСервераПовтИсп.ПолучитьСтавкуНДС(СтавкаНДС) — она возвращает число 20, 10 или 0. В Управлении торговлей 11 и ERP аналогичную роль выполняет УчетНДСУП.ЗначениеСтавкиНДС(СтавкаНДС). Точные имена модулей могут отличаться между релизами, поэтому ищите по подстроке «СтавкаНДС» в конфигураторе через глобальный поиск (Ctrl+Shift+F).

// Пример для Бухгалтерии предприятия 3.0

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

СуммаНДС = СтрокаТовары.Сумма * СтавкаЧислом / 100;

Способ 2: собственная функция преобразования

В самописной конфигурации или внешней обработке, где нет типовых модулей, создайте функцию с явным соответствием значений. Разместите её в общем модуле, чтобы переиспользовать во всех местах расчётов, — так при добавлении новой ставки правка понадобится только в одном месте.

Функция СтавкаНДСЧислом(СтавкаНДС) Экспорт

Если СтавкаНДС = Перечисления.СтавкиНДС.НДС20 Тогда

Возврат 20;

ИначеЕсли СтавкаНДС = Перечисления.СтавкиНДС.НДС20_120 Тогда

Возврат 20;

ИначеЕсли СтавкаНДС = Перечисления.СтавкиНДС.НДС10 Тогда

Возврат 10;

ИначеЕсли СтавкаНДС = Перечисления.СтавкиНДС.НДС10_110 Тогда

Возврат 10;

Иначе // НДС0, БезНДС, пустая ссылка

Возврат 0;

КонецЕсли;

КонецФункции

Для выделения НДС из суммы «в том числе» логика другая — нужна дробная часть. Удобно сделать вторую функцию, возвращающую коэффициент расчётной ставки:

Функция КоэффициентРасчетнойСтавки(СтавкаНДС) Экспорт

Если СтавкаНДС = Перечисления.СтавкиНДС.НДС20

Или СтавкаНДС = Перечисления.СтавкиНДС.НДС20_120 Тогда

Возврат 20 / 120;

ИначеЕсли СтавкаНДС = Перечисления.СтавкиНДС.НДС10

Или СтавкаНДС = Перечисления.СтавкиНДС.НДС10_110 Тогда

Возврат 10 / 110;

Иначе

Возврат 0;

КонецЕсли;

КонецФункции

Способ 3: преобразование в запросе

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

ВЫБОР

КОГДА Товары.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС20)

ТОГДА 20

КОГДА Товары.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС10)

ТОГДА 10

ИНАЧЕ 0

КОНЕЦ КАК СтавкаНДСЧислом

Если в отчёте нужна и сумма налога, вычисляйте её прямо в запросе: Товары.Сумма * 20 / 120 внутри соответствующей ветки ВЫБОР. Альтернатива — соединение с таблицей-значением, где ставке сопоставлено число, переданной в запрос как параметр; такой вариант проще сопровождать при большом числе ставок.

bsl
ВЫБОР КОГДА СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС20) ТОГДА 20 КОГДА СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС10) ТОГДА 10 ИНАЧЕ 0 КОНЕЦ КАК СтавкаЧислом

Способ 4: преобразование при обмене и выгрузке

При выгрузке в XML, JSON или Excel внешняя система обычно ждёт число (20) или строку («20%», «НДС20»). Правило простое: преобразуйте ставку в число функцией из разделов выше, а затем при необходимости форматируйте через Формат() или Строка(). Передавать в файл внутреннее представление перечисления недопустимо — приёмник его не распознает.

В конвертации данных (КД 2/3) преобразование делается в обработчике «При выгрузке» свойства: источником ставки служит перечисление, а приёмнику присваивается числовое значение через собственную функцию или выражение с ВЫБОР-логикой на языке обработчика.

Проверка результата и типичные ошибки

После внедрения функции проверьте расчёт на контрольном примере: сумма 120 руб. со ставкой НДС20_120 должна дать налог 20 руб., а сумма 100 руб. со ставкой НДС20 при начислении «сверху» — тоже 20 руб. Расхождение даже на копейки указывает на неверный выбор между обычной и расчётной логикой.

Типичные ошибки
01
Использование 0.2 вместо 20/120 для выделения НДС из суммы с налогом — сумма налога завышается
02
Забытая ставка «БезНДС»: при отсутствии ветки ИНАЧЕ функция возвращает Неопределено и ломает арифметику
03
Попытка умножить перечисление напрямую — ошибка преобразования типов в рантайме
04
Правка типового общего модуля вместо создания собственного — правки теряются при обновлении
05
Сравнение ставки со строкой «НДС20» вместо значения перечисления — условие никогда не выполняется
Контрольные точки

Как проверить результат

Сумма 120 руб., ставка НДС20_120
Норма

Налог равен 20 руб.

Тревожный признак

Налог 24 руб. или 21,82 руб. — перепутана логика ставки

Ставка «БезНДС»
Норма

Функция возвращает 0, сумма налога 0

Тревожный признак

Ошибка выполнения или Неопределено в результате

Отчёт на СКД по нескольким ставкам
Норма

Колонка со ставкой показывает 20, 10, 0 без пустых строк

Тревожный признак

Пустые значения у расчётных ставок — не описаны ветки ВЫБОР

FAQ

Можно ли получить число ставки через Синоним или Представление перечисления?

Технически строку «НДС 20%» получить можно, но превращать её обратно в число разбором строки — плохая практика: представление меняется от локализации и настроек конфигурации. Используйте сравнение со значениями перечисления и явное соответствие числам.

Что возвращать для ставки «Без НДС» — 0 или Неопределено?

Возвращайте 0. Значение Неопределено приведёт к ошибкам в арифметических выражениях и в СКД. Логически «Без НДС» и «НДС 0%» для расчёта суммы эквивалентны — налог равен нулю.

Как обработать ситуацию, когда в перечисление добавят новую ставку?

Централизуйте преобразование в одной функции общего модуля и добавьте в конец ветку ИНАЧЕ с безопасным значением по умолчанию или вызовом исключения. После обновления конфигурации проверяйте состав перечисления СтавкиНДС — новые значения потребуют новых веток.

Работает ли преобразование на толстом и тонком клиенте одинаково?

Да, если функция размещена в общем модуле с подходящими флагами (Сервер, Тонкий клиент). Для вызова с клиента модуль должен иметь признак «Вызов сервера», если он серверный, либо быть доступным на клиенте.

Как преобразовать ставку НДС в число в СКД без изменения запроса?

Используйте вычисляемое поле на закладке «Вычисляемые поля» с выражением на языке выражений СКД: ВЫБОР КОГДА СтавкаНДС = Значение(Перечисление.СтавкиНДС.НДС20) ТОГДА 20 ... КОНЕЦ. Либо добавьте колонку с числом в запросе набора данных — это надёжнее.

Итог

Что важно запомнить

Ставка НДС в 1С — перечисление, а не число. В типовых конфигурациях берите готовые функции учёта НДС, в самописных — собственную функцию соответствия в общем модуле, в запросах — ВЫБОР КОГДА. Различайте обычные (20/100) и расчётные (20/120) ставки и всегда обрабатывайте «БезНДС» возвратом нуля.