Разработка и Конфигурация · 10 мин
Как программно посчитать сумму НДС в 1С
Как программно рассчитать сумму НДС в 1С: функции из общих модулей, формулы для ставок 20% и 10%, выделение НДС из суммы, примеры кода и типичные ошибки.
Расчёт суммы НДС — одна из самых частых задач при доработке конфигураций 1С: она встречается в документах продажи и закупки, в обработках загрузки прайсов, в печатных формах и при обмене данными. Разработчику важно не просто знать формулу, а уметь использовать штатные механизмы конфигурации, чтобы расчёт совпадал с тем, что программа показывает пользователю в интерфейсе.
В типовых решениях (1С:Бухгалтерия, Управление торговлей, ERP) расчёт НДС уже реализован в общих модулях, и правильный путь — вызывать готовые функции, а не писать свою арифметику. Самописный расчёт оправдан только в собственных конфигурациях без типовых механизмов или в простых внешних обработках.
Ниже разобраны оба подхода: использование типовых функций и ручной расчёт по формуле, а также выделение НДС из суммы «в том числе», работа с перечислением ставок и проверка результата.
Где в типовой конфигурации искать функции расчёта НДС
Прежде чем писать код, откройте конфигуратор и найдите общие модули, в названии которых есть «НДС»: УчетНДС, УчетНДСКлиентСервер, УчетНДСВызовСервера, РасчетНДС и подобные. Точный состав зависит от конфигурации и её версии, поэтому ориентироваться нужно на свою базу, а не на чужие примеры.
Удобный приём — поставить точку останова в обработчике изменения ставки НДС или суммы в строке документа и в отладке посмотреть стек вызовов. Так вы увидите, какая именно функция пересчитывает НДС при редактировании табличной части, и сможете вызвать её в своём коде с теми же параметрами.
Обратите внимание на контекст выполнения: модули с постфиксом «КлиентСервер» доступны и на клиенте, и на сервере, а «ВызовСервера» — только с сервера. Если пишете обработчик на форме в управляемом приложении, выбирайте функцию, доступную в нужном контексте, иначе получите ошибку «Процедура или функция с указанным именем не определена».
Как посчитать НДС через типовые механизмы
Типовой сценарий: у вас есть строка табличной части документа с суммой и ставкой НДС, и нужно заполнить поле «Сумма НДС». В большинстве конфигураций для этого есть процедура вида «РассчитатьСуммуНДС» или структура-параметр с признаком «СуммаВключаетНДС».
&НаКлиенте
Процедура ТоварыСтавкаНДСПриИзменении(Элемент)
СтрокаТаблицы = Элементы.Товары.ТекущиеДанные;
// Пример для конфигурации, где есть общий модуль УчетНДСКлиентСервер
СтрокаТаблицы.СуммаНДС = УчетНДСКлиентСервер.РассчитатьСуммуНДС(
СтрокаТаблицы.Сумма,
Объект.СуммаВключаетНДС,
УчетНДСВызовСервера.ПолучитьСтавкуНДС(СтрокаТаблицы.СтавкаНДС));
КонецПроцедуры
Ключевой момент — второй параметр «СуммаВключаетНДС». От него зависит, считается ли НДС «сверху» на сумму без налога или выделяется из суммы, которая уже включает налог. Этот признак обычно хранится в шапке документа, и передавать его нужно именно оттуда, а не зашивать константу в код.
Если в конфигурации расчёт оформлен как процедура, изменяющая строку по ссылке, вызывайте её целиком — так вы заодно получите пересчёт связанных полей (например, итоговой суммы с НДС), который легко забыть при ручном присвоении одного поля.
- 1Найдите в конфигураторе общий модуль с функциями расчёта НДС
- 2Через отладку уточните, как его вызывает сам документ при изменении ставки или суммы
- 3Определите значение признака СуммаВключаетНДС из шапки документа
- 4Вызовите типовую функцию с теми же параметрами в своём коде
- 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 рублей. Это удобный контрольный пример для проверки своей функции.
Как работать со ставками и перечислением НДС
В типовых конфигурациях ставка НДС — это элемент перечисления, а не число. Числовое значение из него обычно возвращает отдельная функция общего модуля. Важно различать ставки «НДС20» и «НДС20_120»: первая применяется, когда налог начисляется сверх цены, вторая — когда выделяется из суммы расчётным методом.
Если перепутать эти варианты, документ проведётся, но сумма НДС будет неверной, а расхождение всплывёт позже — в декларации по НДС или при сверке с контрагентом. Поэтому при выборе ставки в коде ориентируйтесь на тот же признак «СуммаВключаетНДС», что и интерфейс документа.
Для необлагаемых операций используйте значение «БезНДС», а не «НДС0»: это разные операции с точки зрения учёта. Нулевая ставка применяется, например, при экспорте и требует подтверждения, а «БезНДС» — для операций, не являющихся объектом налогообложения.
Способы расчёта: что выбрать
Подходят для доработок типовых конфигураций; гарантируют совпадение с поведением документов, но привязывают код к конкретной версии конфигурации
Подходит для самостоятельных конфигураций и внешних обработок; полностью под контролем, но требует самостоятельно следить за округлением и ставками
Подходит при программном создании документов: заполняете сумму и ставку, вызываете штатный пересчёт — получаете все связанные поля сразу
Как проверить результат расчёта
Простейшая проверка — контрольный пример с «круглыми» числами: база 1 000 рублей, ставка 20%, ожидаемый НДС 200 рублей; сумма с НДС 1 200 рублей, выделенный налог — те же 200 рублей. Если ваша функция на этих данных даёт другой результат, ошибка в формуле или в передаче ставки.
Второй уровень проверки — сравнение с типовым документом. Создайте в пользовательском режиме документ с теми же суммами и ставками и сверьте сумму НДС построчно. Совпадение до копейки означает, что алгоритм и признак включения НДС в сумму выбраны правильно.
При массовой обработке (загрузка прайсов, пересчёт архивных документов) добавьте в код контрольную сумму: накопите итог НДС по всем строкам и сравните с ожидаемым итогом. Расхождение даже в копейку — повод остановиться и найти строку с ошибкой, а не проводить документы с неверным налогом.
Как проверить результат
НДС равен 200
НДС отличается или равен 240 — вероятно, использована не та формула
НДС равен 200, база 1000
НДС равен 240 — сумма умножена на ставку вместо расчётной 20/120
Суммы НДС совпадают до копейки построчно
Есть расхождения — проверьте признак СуммаВключаетНДС и округление
Частые вопросы
Как выделить НДС 20% из суммы одной строкой кода?
СуммаНДС = Окр(СуммаСНДС 20 / 120, 2). Для ставки 10% используйте 10/110. Универсальный вариант: СуммаСНДС Ставка / (100 + Ставка).
Почему функция из общего модуля «не видна» в моём коде?
Чаще всего дело в контексте: модуль объявлен только серверным, а вызов идёт из клиентского обработчика формы. Проверьте флажки «Сервер», «Клиент» в свойствах общего модуля и используйте модули с признаком «КлиентСервер» либо выносите вызов в серверную процедуру.
Чем отличаются ставки НДС20 и НДС20_120 в перечислении?
НДС20 применяется, когда налог начисляется сверх цены без НДС. НДС20_120 — расчётная ставка для выделения налога из суммы, которая уже включает НДС. Выбор зависит от признака «Сумма включает НДС» в документе.
Нужно ли округлять сумму НДС и до скольких знаков?
Да, округляйте до двух знаков (копеек) функцией Окр() сразу при расчёте каждой строки. Если округлять только итог, сумма по строкам не сойдётся с итогом документа, и печатные формы покажут расхождения.
Как посчитать НДС при программном создании документа?
Заполните в строках табличной части сумму и ставку НДС, установите в шапке признак «СуммаВключаетНДС», затем вызовите штатную процедуру пересчёта строки или типовую функцию расчёта для каждой строки — так же, как это делает форма документа при ручном вводе.
Что делать, если итог НДС по документу расходится на копейку с суммой по строкам?
Это следствие округления по строкам. Проверьте, что каждая строка округляется одинаково, и при необходимости скорректируйте последнюю строку на разницу — так поступают типовые механизмы распределения. Не храните НДС с точностью выше двух знаков в реквизитах документа.
Что важно запомнить
В типовых конфигурациях используйте штатные функции общих модулей и учитывайте признак «СуммаВключаетНДС». При ручном расчёте: НДС сверху — Сумма × Ставка / 100, выделение из суммы — Сумма × Ставка / (100 + Ставка), всегда с округлением до копеек. Результат проверяйте контрольным примером и сверкой с документом.