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

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

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

Как программно рассчитать сумму НДС в 1С: функции из общих модулей, формулы для ставок 20% и 10%, выделение НДС из суммы, примеры кода и типичные ошибки.

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

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

Ниже разобраны оба подхода: использование типовых функций и ручной расчёт по формуле, а также выделение НДС из суммы «в том числе», работа с перечислением ставок и проверка результата.

Где в типовой конфигурации искать функции расчёта НДС

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

Удобный приём — поставить точку останова в обработчике изменения ставки НДС или суммы в строке документа и в отладке посмотреть стек вызовов. Так вы увидите, какая именно функция пересчитывает НДС при редактировании табличной части, и сможете вызвать её в своём коде с теми же параметрами.

Обратите внимание на контекст выполнения: модули с постфиксом «КлиентСервер» доступны и на клиенте, и на сервере, а «ВызовСервера» — только с сервера. Если пишете обработчик на форме в управляемом приложении, выбирайте функцию, доступную в нужном контексте, иначе получите ошибку «Процедура или функция с указанным именем не определена».

Как посчитать НДС через типовые механизмы

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

&НаКлиенте

Процедура ТоварыСтавкаНДСПриИзменении(Элемент)

СтрокаТаблицы = Элементы.Товары.ТекущиеДанные;

// Пример для конфигурации, где есть общий модуль УчетНДСКлиентСервер

СтрокаТаблицы.СуммаНДС = УчетНДСКлиентСервер.РассчитатьСуммуНДС(

СтрокаТаблицы.Сумма,

Объект.СуммаВключаетНДС,

УчетНДСВызовСервера.ПолучитьСтавкуНДС(СтрокаТаблицы.СтавкаНДС));

КонецПроцедуры

Ключевой момент — второй параметр «СуммаВключаетНДС». От него зависит, считается ли НДС «сверху» на сумму без налога или выделяется из суммы, которая уже включает налог. Этот признак обычно хранится в шапке документа, и передавать его нужно именно оттуда, а не зашивать константу в код.

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

Порядок действий для типовой конфигурации
  1. 1
    Найдите в конфигураторе общий модуль с функциями расчёта НДС
  2. 2
    Через отладку уточните, как его вызывает сам документ при изменении ставки или суммы
  3. 3
    Определите значение признака СуммаВключаетНДС из шапки документа
  4. 4
    Вызовите типовую функцию с теми же параметрами в своём коде
  5. 5
    Сравните результат с расчётом, который выполняет документ вручную

Как посчитать сумму НДС формулой в своём коде

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

Функция РассчитатьСуммуНДС(СуммаБезНДС, СтавкаНДС) Экспорт

Возврат Окр(СуммаБезНДС * СтавкаНДС / 100, 2);

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

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

Если ставка хранится как перечисление (например, «НДС20», «НДС10», «БезНДС»), напишите функцию-преобразователь, которая возвращает числовое значение ставки. Это избавит от разбросанных по коду конструкций «Если Ставка = Перечисления.СтавкиНДС.НДС20 Тогда…».

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

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

Возврат 20;

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

Возврат 10;

Иначе

Возврат 0; // БезНДС, НДС0

КонецЕсли;

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

Как выделить НДС из суммы «в том числе НДС»

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

Функция ВыделитьНДСизСуммы(СуммаСНДС, СтавкаНДС) Экспорт

Если СтавкаНДС = 0 Тогда

Возврат 0;

КонецЕсли;

Возврат Окр(СуммаСНДС * СтавкаНДС / (100 + СтавкаНДС), 2);

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

Для ставки 20% расчётный коэффициент равен 20/120, для ставки 10% — 10/110. Например, из суммы 1 200 рублей с НДС 20% налог составит 200 рублей, а база без налога — 1 000 рублей. Это удобный контрольный пример для проверки своей функции.

Типичные ошибки при расчёте
01
Выделение НДС умножением суммы на 20% вместо 20/120 — завышает налог и искажает базу
02
Игнорирование признака СуммаВключаетНДС — один и тот же код даёт разный результат в разных документах
03
Отсутствие округления до копеек — расхождения итога документа с суммой по строкам
04
Жёсткое зашивание ставки 20 в код — при работе со ставкой 10% или без НДС расчёт неверен
05
Сравнение перечисления ставки с числом вместо преобразования — условие никогда не срабатывает

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

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

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

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

Способы расчёта: что выбрать

Типовые функции общих модулей

Подходят для доработок типовых конфигураций; гарантируют совпадение с поведением документов, но привязывают код к конкретной версии конфигурации

Собственная функция с формулой

Подходит для самостоятельных конфигураций и внешних обработок; полностью под контролем, но требует самостоятельно следить за округлением и ставками

Расчёт через пересчёт строки документа

Подходит при программном создании документов: заполняете сумму и ставку, вызываете штатный пересчёт — получаете все связанные поля сразу

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

Простейшая проверка — контрольный пример с «круглыми» числами: база 1 000 рублей, ставка 20%, ожидаемый НДС 200 рублей; сумма с НДС 1 200 рублей, выделенный налог — те же 200 рублей. Если ваша функция на этих данных даёт другой результат, ошибка в формуле или в передаче ставки.

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

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

Контрольные точки

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

Контрольный пример 1000 × 20%
Норма

НДС равен 200

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

НДС отличается или равен 240 — вероятно, использована не та формула

Выделение из 1200 (в т.ч. НДС 20%)
Норма

НДС равен 200, база 1000

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

НДС равен 240 — сумма умножена на ставку вместо расчётной 20/120

Сверка с документом в пользовательском режиме
Норма

Суммы НДС совпадают до копейки построчно

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

Есть расхождения — проверьте признак СуммаВключаетНДС и округление

Частые вопросы

Как выделить НДС 20% из суммы одной строкой кода?

СуммаНДС = Окр(СуммаСНДС 20 / 120, 2). Для ставки 10% используйте 10/110. Универсальный вариант: СуммаСНДС Ставка / (100 + Ставка).

Почему функция из общего модуля «не видна» в моём коде?

Чаще всего дело в контексте: модуль объявлен только серверным, а вызов идёт из клиентского обработчика формы. Проверьте флажки «Сервер», «Клиент» в свойствах общего модуля и используйте модули с признаком «КлиентСервер» либо выносите вызов в серверную процедуру.

Чем отличаются ставки НДС20 и НДС20_120 в перечислении?

НДС20 применяется, когда налог начисляется сверх цены без НДС. НДС20_120 — расчётная ставка для выделения налога из суммы, которая уже включает НДС. Выбор зависит от признака «Сумма включает НДС» в документе.

Нужно ли округлять сумму НДС и до скольких знаков?

Да, округляйте до двух знаков (копеек) функцией Окр() сразу при расчёте каждой строки. Если округлять только итог, сумма по строкам не сойдётся с итогом документа, и печатные формы покажут расхождения.

Как посчитать НДС при программном создании документа?

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

Что делать, если итог НДС по документу расходится на копейку с суммой по строкам?

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

Итог

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

В типовых конфигурациях используйте штатные функции общих модулей и учитывайте признак «СуммаВключаетНДС». При ручном расчёте: НДС сверху — Сумма × Ставка / 100, выделение из суммы — Сумма × Ставка / (100 + Ставка), всегда с округлением до копеек. Результат проверяйте контрольным примером и сверкой с документом.