Разработка и Конфигурация · 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 внутри соответствующей ветки ВЫБОР. Альтернатива — соединение с таблицей-значением, где ставке сопоставлено число, переданной в запрос как параметр; такой вариант проще сопровождать при большом числе ставок.
ВЫБОР КОГДА СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС20) ТОГДА 20 КОГДА СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС10) ТОГДА 10 ИНАЧЕ 0 КОНЕЦ КАК СтавкаЧисломСпособ 4: преобразование при обмене и выгрузке
При выгрузке в XML, JSON или Excel внешняя система обычно ждёт число (20) или строку («20%», «НДС20»). Правило простое: преобразуйте ставку в число функцией из разделов выше, а затем при необходимости форматируйте через Формат() или Строка(). Передавать в файл внутреннее представление перечисления недопустимо — приёмник его не распознает.
В конвертации данных (КД 2/3) преобразование делается в обработчике «При выгрузке» свойства: источником ставки служит перечисление, а приёмнику присваивается числовое значение через собственную функцию или выражение с ВЫБОР-логикой на языке обработчика.
Проверка результата и типичные ошибки
После внедрения функции проверьте расчёт на контрольном примере: сумма 120 руб. со ставкой НДС20_120 должна дать налог 20 руб., а сумма 100 руб. со ставкой НДС20 при начислении «сверху» — тоже 20 руб. Расхождение даже на копейки указывает на неверный выбор между обычной и расчётной логикой.
Как проверить результат
Налог равен 20 руб.
Налог 24 руб. или 21,82 руб. — перепутана логика ставки
Функция возвращает 0, сумма налога 0
Ошибка выполнения или Неопределено в результате
Колонка со ставкой показывает 20, 10, 0 без пустых строк
Пустые значения у расчётных ставок — не описаны ветки ВЫБОР
FAQ
Можно ли получить число ставки через Синоним или Представление перечисления?
Технически строку «НДС 20%» получить можно, но превращать её обратно в число разбором строки — плохая практика: представление меняется от локализации и настроек конфигурации. Используйте сравнение со значениями перечисления и явное соответствие числам.
Что возвращать для ставки «Без НДС» — 0 или Неопределено?
Возвращайте 0. Значение Неопределено приведёт к ошибкам в арифметических выражениях и в СКД. Логически «Без НДС» и «НДС 0%» для расчёта суммы эквивалентны — налог равен нулю.
Как обработать ситуацию, когда в перечисление добавят новую ставку?
Централизуйте преобразование в одной функции общего модуля и добавьте в конец ветку ИНАЧЕ с безопасным значением по умолчанию или вызовом исключения. После обновления конфигурации проверяйте состав перечисления СтавкиНДС — новые значения потребуют новых веток.
Работает ли преобразование на толстом и тонком клиенте одинаково?
Да, если функция размещена в общем модуле с подходящими флагами (Сервер, Тонкий клиент). Для вызова с клиента модуль должен иметь признак «Вызов сервера», если он серверный, либо быть доступным на клиенте.
Как преобразовать ставку НДС в число в СКД без изменения запроса?
Используйте вычисляемое поле на закладке «Вычисляемые поля» с выражением на языке выражений СКД: ВЫБОР КОГДА СтавкаНДС = Значение(Перечисление.СтавкиНДС.НДС20) ТОГДА 20 ... КОНЕЦ. Либо добавьте колонку с числом в запросе набора данных — это надёжнее.
Что важно запомнить
Ставка НДС в 1С — перечисление, а не число. В типовых конфигурациях берите готовые функции учёта НДС, в самописных — собственную функцию соответствия в общем модуле, в запросах — ВЫБОР КОГДА. Различайте обычные (20/100) и расчётные (20/120) ставки и всегда обрабатывайте «БезНДС» возвратом нуля.