Как исправить ошибку расчета НДС 18% вместо 20% в 1С:Бухгалтерия предприятия 2.0

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

Переход на ставку НДС 20% преподнес немало сюрпризов разработчикам и пользователям устаревших конфигураций. Одним из классических и наиболее частых сбоев в работе конфигурации «1С:Бухгалтерия предприятия» редакции 2.0 (БП 2.0) стала ситуация, когда в документе «Реализация товаров и услуг» визуально выбрана ставка «20%», однако при вводе суммы в колонку «Всего» система рассчитывает налог по старой ставке 18%. При этом, если интерактивно перевыбрать ставку НДС в строке заново, расчет становится верным.

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

Выясняем причину: почему 1С считает 18% вместо 20%?

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

Проанализируем ключевые причины возникновения бага:

  1. Кэширование ставки в скрытом реквизите: В табличных частях Товары и Услуги документов продажи помимо ссылочного реквизита СтавкаНДС (тип ПеречислениеСсылка.СтавкиНДС) присутствует числовой реквизит ПроцентНДС (или соответствующая колонка). Именно это числовое значение используется в математических формулах расчета НДС. При заполнении строки из карточки номенклатуры ссылка на ставку меняется на «20%», но числовой процент в коде может оставаться старым (18), если обработчик заполнения написан некорректно или база обновлена с ошибками.
  2. «Хардкод» формул в модуле формы: В старых или сильно доработанных базах разработчики часто прописывали формулы расчета НДС непосредственно в модуле формы документа, используя фиксированные числа, например, Сумма * 18 / 118. Естественно, при обновлении законодательства такие участки кода перестают работать правильно.
  3. Устаревшие настройки пользователя по умолчанию: Если у пользователя в персональных настройках основной ставкой НДС по-прежнему выбрана «18%», программа при инициализации новой строки подставляет именно ее, и последующие алгоритмы перерасчета могут отрабатывать некорректно при подстановке номенклатуры.

Рассмотрим подробнее каждый из способов решения данной проблемы.

Решение 1. Проверка и обновление общего модуля «УчетНДС»

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

Найдем в нем экспортную функцию ПолучитьСтавкуНДС(). Ее код должен корректно обрабатывать новые значения перечисления ставки 20%. Проверим и приведем функцию к следующему виду:


Функция ПолучитьСтавкуНДС(СтавкаНДС) Экспорт
    Если СтавкаНДС = Перечисления.СтавкиНДС.НДС20 ИЛИ СтавкаНДС = Перечисления.СтавкиНДС.НДС20_120 Тогда
        Возврат 20;
    ИначеЕсли СтавкаНДС = Перечисления.СтавкиНДС.НДС10 ИЛИ СтавкаНДС = Перечисления.СтавкиНДС.НДС10_110 Тогда
        Возврат 10;
    ИначеЕсли СтавкаНДС = Перечисления.СтавкиНДС.НДС18 ИЛИ СтавкаНДС = Перечисления.СтавкиНДС.НДС18_118 Тогда
        Возврат 18;
    КонецЕсли;
    Возврат 0;
КонецФункции

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

Решение 2. Корректировка обработчика изменения суммы «Всего»

Теперь обратимся к модулю формы документа (например, «Реализация товаров и услуг»). Проанализируем поведение системы при вводе пользователем значения в колонку «Всего». В этот момент срабатывает событие ПриИзменении для соответствующего элемента формы табличной части.

Посмотрим на пример обработчика изменения суммы для табличной части Услуги. Нам нужно гарантировать, что расчет налога опирается на актуальную дату документа и корректно извлекает процентную ставку:


Процедура УслугиВсегоПриИзменении(Элемент)
    ТекСтр = ЭлементыФормы.Услуги.ТекущаяСтрока;
    
    Если УчитыватьНДС Тогда
        // Динамически определяем ставку НДС в зависимости от выбранного значения
        ПроцентСтавки = УчетНДС.ПолучитьСтавкуНДС(ТекСтр.СтавкаНДС);
        
        // Если ставка не определилась, а дата поздняя — применяем 20% по умолчанию
        Если ПроцентСтавки = 0 Тогда
            ПроцентСтавки = ?(Дата >= Дата(2019, 1, 1), 20, 18);
        КонецЕсли;
        
        // Выполняем расчет суммы НДС от обратного
        ТекСтр.СуммаНДС = Элемент.Значение / (100 + ПроцентСтавки) * ПроцентСтавки;
        
        Если СуммаВключаетНДС Тогда
            ТекСтр.Сумма = Элемент.Значение;
        Иначе
            ТекСтр.Сумма = Элемент.Значение - ТекСтр.СуммаНДС;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Обратите внимание: мы ушли от жесткого кодирования делителей (118 и 120). Использование переменной ПроцентСтавки делает алгоритм универсальным и предотвращает ошибки расчетов для любых видов ставок (будь то 10%, 18% или 20%).

Решение 3. Синхронизация реквизитов при выборе Номенклатуры

Почему же при первоначальном выборе услуги или товара в документе ставка визуально отображалась как «20%», но считала как 18%? Проблема кроется в процедуре ПриИзмененииНоменклатуры (или аналогичной процедуре заполнения строки табличной части).

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


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

Добавление строки СтрокаТабличнойЧасти.ПроцентНДС = УчетНДС.ПолучитьСтавкуНДС(...) гарантирует, что внутренний кэш документа синхронизируется с выбранной ставкой НДС сразу же при подборе номенклатуры, исключая необходимость повторного ручного перевыбора ставки пользователем.

Решение 4. Настройка параметров по умолчанию в пользовательском интерфейсе

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

Выполним следующие шаги для проверки индивидуальных параметров:

  1. Откроем базу 1С в режиме «Предприятие» под учетной записью проблемного пользователя.
  2. Перейдем в главное меню: Сервис — Настройки пользователя.
  3. В появившемся дереве настроек найдем ветку «Основные значения для подстановки в документы».
  4. Найдем параметр «Основная ставка НДС». Если там выбрано значение «18%», заменим его на «20%».
  5. Сохраним настройки, нажав кнопку «ОК», и перезапустим сеанс работы с базой данных.

После этого при создании новых документов система изначально будет ориентироваться на актуальную ставку налога, что позволит избежать конфликтов при расчете сумм «от обратного».

Используя предложенные методики, мы сможем полностью локализовать и устранить любые несоответствия в расчетах НДС 20% в конфигурации БП 2.0, обеспечив быструю и корректную работу бухгалтерской службы.

← На главную