При работе в 1С:Бухгалтерия предприятия 3.0 пользователи часто сталкиваются с необходимостью массовой корректировки данных в уже созданных документах. Типичный пример — изменение ставки НДС (например, с "Без НДС" на "20%") в большом пакете документов поступления или реализации (актуально, если требуется учет входного НДС по остаткам товаров). Однако стандартный инструмент Групповое изменение реквизитов при простом выборе новой ставки меняет только само значение в поле, но не инициирует автоматический пересчет суммы налога. В итоге мы получаем документы, где ставка указана "20%", а в колонке "Сумма НДС" остается пустота или старое значение, что часто происходит при вводе остатков НДС на УСН.
В этой статье мы подробно разберем, почему так происходит, и изучим механизмы программного пересчета (замена ставок НДС в НСИ и документах), которые можно применить прямо внутри групповой обработки, чтобы не исправлять каждый документ вручную.
Проанализируем ситуацию: когда бухгалтер открывает документ вручную и меняет ставку НДС (или производит подмену ставки НДС) в строке табличной части, в коде формы срабатывает событие ПриИзменении. Этот обработчик запускает цепочку процедур, которые рассчитывают налог исходя из цены, количества и выбранной ставки. Однако обработка Групповое изменение реквизитов работает иначе — она записывает новое значение напрямую в базу данных, минуя программную логику экранных форм. Именно поэтому автоматического пересчета не происходит.
Чтобы решить задачу, нам потребуется воспользоваться скрытой, но очень мощной функцией групповой обработки — Выполнить произвольный алгоритм.
Рассмотрим наиболее надежный вариант. В конфигурации БП 3.0 существуют общие модули, содержащие стандартные функции для расчетов в табличных частях. Использование штатной функции гарантирует, что система корректно обработает округление и учтет настройки документа (например, флаг "Сумма включает НДС").
Для документов Поступление (акты, накладные, УПД) или Реализация (акты, накладные) алгоритм будет выглядеть следующим образом:
Для Каждого Стр Из Объект.Товары Цикл
// Устанавливаем нужную ставку НДС из перечисления
Стр.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
// Вызываем стандартный метод пересчета НДС
ОбработкаТабличныхЧастейКлиентСервер.РассчитатьСуммуНДСТабЧасти(Стр, Объект.СуммаВключаетНДС);
// Если нужно обновить и общую сумму строки (в случае, если НДС не был включен в цену)
ОбработкаТабличныхЧастейКлиентСервер.РассчитатьСуммуТабЧасти(Стр, Объект.СуммаВключаетНДС);
КонецЦикла;
// Обязательно записываем объект, чтобы изменения сохранились
Объект.Записать(РежимЗаписиДокумента.Запись);
Разберем, что здесь происходит. Переменная Объект — это контекст обрабатываемого документа. Мы обходим коллекцию Товары (именно так называется табличная часть в большинстве товарных документов). Метод РассчитатьСуммуНДСТабЧасти принимает два параметра: строку таблицы и булево значение (включен налог в сумму или нет), которое берется из шапки документа.
Если по каким-то причинам вы не хотите обращаться к общим модулям, можно прописать математическую логику расчета прямо в алгоритме. Это бывает полезно, когда требуется нестандартная логика распределения налогов. Посмотрим на пример кода:
Для Каждого Стр Из Объект.Товары Цикл
// Установка ставки
Стр.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
// Расчет суммы НДС (предполагаем, что ставка 20%)
Если Объект.СуммаВключаетНДС Тогда
Стр.СуммаНДС = Стр.Сумма * 20 / 120;
Иначе
Стр.СуммаНДС = Стр.Сумма * 0.2;
КонецЕсли;
// Округление до 2 знаков
Стр.СуммаНДС = Окр(Стр.СуммаНДС, 2);
КонецЦикла;
Объект.Записать();
Важный нюанс: при ручном расчете вы должны самостоятельно следить за округлением и тем, как меняется общая сумма документа. Если НДС "сверху", то Стр.Сумма (всего) должна увеличиться на величину Стр.СуммаНДС.
Проанализируем ситуацию, когда нам нужно поменять ставку не в накладной, а, например, в Приходном кассовом ордере (ПКО) или Поступлении на расчетный счет. В этих документах структура данных отличается:
Товары используется РасшифровкаПлатежа.Для ПКО код изменения будет таким:
Для Каждого Стр Из Объект.РасшифровкаПлатежа Цикл
Стр.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
// В кассовых документах расчет обычно проще, так как сумма всегда фиксирована
Стр.СуммаНДС = Стр.СуммаПлатежа * 20 / 120;
КонецЦикла;
Объект.Записать();
Прежде чем запускать произвольный алгоритм на нескольких сотнях документов, выполните следующие действия:
Таким образом, использование произвольного алгоритма в групповой обработке реквизитов — это самый эффективный способ навести порядок в ставках НДС. Мы рекомендуем использовать вызов штатной процедуры РассчитатьСуммуНДСТабЧасти, так как это минимизирует риск ошибок в расчетах и округлениях.