Как в 1С:Бухгалтерия 3.0 массово изменить ставку и автоматически пересчитать сумму НДС в документах

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Налоговый учет
← На главную

При работе в 1С:Бухгалтерия предприятия 3.0 пользователи часто сталкиваются с необходимостью массовой корректировки данных в уже созданных документах. Типичный пример — изменение ставки НДС (например, с "Без НДС" на "20%") в большом пакете документов поступления или реализации (актуально, если требуется учет входного НДС по остаткам товаров). Однако стандартный инструмент Групповое изменение реквизитов при простом выборе новой ставки меняет только само значение в поле, но не инициирует автоматический пересчет суммы налога. В итоге мы получаем документы, где ставка указана "20%", а в колонке "Сумма НДС" остается пустота или старое значение, что часто происходит при вводе остатков НДС на УСН.

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

Почему обычное групповое изменение не работает

Проанализируем ситуацию: когда бухгалтер открывает документ вручную и меняет ставку НДС (или производит подмену ставки НДС) в строке табличной части, в коде формы срабатывает событие ПриИзменении. Этот обработчик запускает цепочку процедур, которые рассчитывают налог исходя из цены, количества и выбранной ставки. Однако обработка Групповое изменение реквизитов работает иначе — она записывает новое значение напрямую в базу данных, минуя программную логику экранных форм. Именно поэтому автоматического пересчета не происходит.

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

Способ 1. Использование встроенных механизмов пересчета (рекомендуемый)

Рассмотрим наиболее надежный вариант. В конфигурации БП 3.0 существуют общие модули, содержащие стандартные функции для расчетов в табличных частях. Использование штатной функции гарантирует, что система корректно обработает округление и учтет настройки документа (например, флаг "Сумма включает НДС").

Для документов Поступление (акты, накладные, УПД) или Реализация (акты, накладные) алгоритм будет выглядеть следующим образом:


Для Каждого Стр Из Объект.Товары Цикл
    // Устанавливаем нужную ставку НДС из перечисления
    Стр.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
    
    // Вызываем стандартный метод пересчета НДС
    ОбработкаТабличныхЧастейКлиентСервер.РассчитатьСуммуНДСТабЧасти(Стр, Объект.СуммаВключаетНДС);
    
    // Если нужно обновить и общую сумму строки (в случае, если НДС не был включен в цену)
    ОбработкаТабличныхЧастейКлиентСервер.РассчитатьСуммуТабЧасти(Стр, Объект.СуммаВключаетНДС);
КонецЦикла;

// Обязательно записываем объект, чтобы изменения сохранились
Объект.Записать(РежимЗаписиДокумента.Запись);

Разберем, что здесь происходит. Переменная Объект — это контекст обрабатываемого документа. Мы обходим коллекцию Товары (именно так называется табличная часть в большинстве товарных документов). Метод РассчитатьСуммуНДСТабЧасти принимает два параметра: строку таблицы и булево значение (включен налог в сумму или нет), которое берется из шапки документа.

Способ 2. Ручной расчет НДС через формулы

Если по каким-то причинам вы не хотите обращаться к общим модулям, можно прописать математическую логику расчета прямо в алгоритме. Это бывает полезно, когда требуется нестандартная логика распределения налогов. Посмотрим на пример кода:


Для Каждого Стр Из Объект.Товары Цикл
    // Установка ставки
    Стр.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
    
    // Расчет суммы НДС (предполагаем, что ставка 20%)
    Если Объект.СуммаВключаетНДС Тогда
        Стр.СуммаНДС = Стр.Сумма * 20 / 120;
    Иначе
        Стр.СуммаНДС = Стр.Сумма * 0.2;
    КонецЕсли;
    
    // Округление до 2 знаков
    Стр.СуммаНДС = Окр(Стр.СуммаНДС, 2);
КонецЦикла;

Объект.Записать();

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

Особенности работы с разными типами документов

Проанализируем ситуацию, когда нам нужно поменять ставку не в накладной, а, например, в Приходном кассовом ордере (ПКО) или Поступлении на расчетный счет. В этих документах структура данных отличается:

  1. Вместо табличной части Товары используется РасшифровкаПлатежа.
  2. Реквизиты могут называться иначе.

Для ПКО код изменения будет таким:


Для Каждого Стр Из Объект.РасшифровкаПлатежа Цикл
    Стр.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
    // В кассовых документах расчет обычно проще, так как сумма всегда фиксирована
    Стр.СуммаНДС = Стр.СуммаПлатежа * 20 / 120;
КонецЦикла;
Объект.Записать();

Важные рекомендации при массовых изменениях

Прежде чем запускать произвольный алгоритм на нескольких сотнях документов, выполните следующие действия:

Таким образом, использование произвольного алгоритма в групповой обработке реквизитов — это самый эффективный способ навести порядок в ставках НДС. Мы рекомендуем использовать вызов штатной процедуры РассчитатьСуммуНДСТабЧасти, так как это минимизирует риск ошибок в расчетах и округлениях.

← На главную