Переход на ставку НДС 20% преподнес немало сюрпризов разработчикам и пользователям устаревших конфигураций. Одним из классических и наиболее частых сбоев в работе конфигурации «1С:Бухгалтерия предприятия» редакции 2.0 (БП 2.0) стала ситуация, когда в документе «Реализация товаров и услуг» визуально выбрана ставка «20%», однако при вводе суммы в колонку «Всего» система рассчитывает налог по старой ставке 18%. При этом, если интерактивно перевыбрать ставку НДС в строке заново, расчет становится верным.
В этой статье мы подробно разберем, почему возникает такое поведение платформы, и рассмотрим пошаговые методы устранения этой ошибки как на уровне настроек пользователя, так и в программном коде.
Для того чтобы понять природу этой ошибки, нам необходимо заглянуть под капот архитектуры табличных частей документов на обычных формах. В отличие от современных конфигураций на управляемых формах (таких как БП 3.0), где ставки НДС определяются динамически в зависимости от даты документа, в БП 2.0 применяется более жесткая привязка к реквизитам.
Проанализируем ключевые причины возникновения бага:
Товары и Услуги документов продажи помимо ссылочного реквизита СтавкаНДС (тип ПеречислениеСсылка.СтавкиНДС) присутствует числовой реквизит ПроцентНДС (или соответствующая колонка). Именно это числовое значение используется в математических формулах расчета НДС. При заполнении строки из карточки номенклатуры ссылка на ставку меняется на «20%», но числовой процент в коде может оставаться старым (18), если обработчик заполнения написан некорректно или база обновлена с ошибками.Сумма * 18 / 118. Естественно, при обновлении законодательства такие участки кода перестают работать правильно.Рассмотрим подробнее каждый из способов решения данной проблемы.
Прежде всего нам необходимо убедиться, что в системе правильно отрабатывает базовая функция получения числового значения ставки НДС. Для этого перейдем в Конфигуратор и найдем общий модуль УчетНДС.
Найдем в нем экспортную функцию ПолучитьСтавкуНДС(). Ее код должен корректно обрабатывать новые значения перечисления ставки 20%. Проверим и приведем функцию к следующему виду:
Функция ПолучитьСтавкуНДС(СтавкаНДС) Экспорт
Если СтавкаНДС = Перечисления.СтавкиНДС.НДС20 ИЛИ СтавкаНДС = Перечисления.СтавкиНДС.НДС20_120 Тогда
Возврат 20;
ИначеЕсли СтавкаНДС = Перечисления.СтавкиНДС.НДС10 ИЛИ СтавкаНДС = Перечисления.СтавкиНДС.НДС10_110 Тогда
Возврат 10;
ИначеЕсли СтавкаНДС = Перечисления.СтавкиНДС.НДС18 ИЛИ СтавкаНДС = Перечисления.СтавкиНДС.НДС18_118 Тогда
Возврат 18;
КонецЕсли;
Возврат 0;
КонецФункции
Если в вашей функции отсутствует проверка условий для НДС20 и НДС20_120, обязательно добавьте их. Это фундамент, без которого система не сможет динамически определять процентную ставку для расчетов.
Теперь обратимся к модулю формы документа (например, «Реализация товаров и услуг»). Проанализируем поведение системы при вводе пользователем значения в колонку «Всего». В этот момент срабатывает событие ПриИзменении для соответствующего элемента формы табличной части.
Посмотрим на пример обработчика изменения суммы для табличной части Услуги. Нам нужно гарантировать, что расчет налога опирается на актуальную дату документа и корректно извлекает процентную ставку:
Процедура УслугиВсегоПриИзменении(Элемент)
ТекСтр = ЭлементыФормы.Услуги.ТекущаяСтрока;
Если УчитыватьНДС Тогда
// Динамически определяем ставку НДС в зависимости от выбранного значения
ПроцентСтавки = УчетНДС.ПолучитьСтавкуНДС(ТекСтр.СтавкаНДС);
// Если ставка не определилась, а дата поздняя — применяем 20% по умолчанию
Если ПроцентСтавки = 0 Тогда
ПроцентСтавки = ?(Дата >= Дата(2019, 1, 1), 20, 18);
КонецЕсли;
// Выполняем расчет суммы НДС от обратного
ТекСтр.СуммаНДС = Элемент.Значение / (100 + ПроцентСтавки) * ПроцентСтавки;
Если СуммаВключаетНДС Тогда
ТекСтр.Сумма = Элемент.Значение;
Иначе
ТекСтр.Сумма = Элемент.Значение - ТекСтр.СуммаНДС;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Обратите внимание: мы ушли от жесткого кодирования делителей (118 и 120). Использование переменной ПроцентСтавки делает алгоритм универсальным и предотвращает ошибки расчетов для любых видов ставок (будь то 10%, 18% или 20%).
Почему же при первоначальном выборе услуги или товара в документе ставка визуально отображалась как «20%», но считала как 18%? Проблема кроется в процедуре ПриИзмененииНоменклатуры (или аналогичной процедуре заполнения строки табличной части).
При выборе номенклатуры программа копирует значение ставки НДС из справочника в документ, но забывает обновить связанный реквизит числового процента. Чтобы исправить это, найдем обработчик изменения номенклатуры в модуле формы документа и убедимся, что там присутствует вызов обновления ставки:
Процедура ТоварыНоменклатураПриИзменении(Элемент)
СтрокаТабличнойЧасти = ЭлементыФормы.Товары.ТекущаяСтрока;
// Выполняем стандартное заполнение строки данными номенклатуры
ОбработкаТабличныхЧастей.ЗаполнитьСтрокуТабличнойЧастиТовары(СтрокаТабличнойЧасти, ЭтотОбъект);
// Принудительно перезаписываем процент НДС на основании новой ставки
СтрокаТабличнойЧасти.ПроцентНДС = УчетНДС.ПолучитьСтавкуНДС(СтрокаТабличнойЧасти.СтавкаНДС);
// Запускаем перерасчет сумм в строке
ОбработкаТабличныхЧастей.РассчитатьСуммуТабличнойЧасти(СтрокаТабличнойЧасти, ЭтотОбъект);
ОбработкаТабличныхЧастей.РассчитатьНДСТабЧасти(СтрокаТабличнойЧасти, ЭтотОбъект);
КонецПроцедуры
Добавление строки СтрокаТабличнойЧасти.ПроцентНДС = УчетНДС.ПолучитьСтавкуНДС(...) гарантирует, что внутренний кэш документа синхронизируется с выбранной ставкой НДС сразу же при подборе номенклатуры, исключая необходимость повторного ручного перевыбора ставки пользователем.
Если программный код вашей конфигурации полностью типовой и обновлен до актуального релиза, но проблема все равно воспроизводится у отдельных бухгалтеров, дело может быть в персональных настройках сеанса.
Выполним следующие шаги для проверки индивидуальных параметров:
После этого при создании новых документов система изначально будет ориентироваться на актуальную ставку налога, что позволит избежать конфликтов при расчете сумм «от обратного».
Используя предложенные методики, мы сможем полностью локализовать и устранить любые несоответствия в расчетах НДС 20% в конфигурации БП 2.0, обеспечив быструю и корректную работу бухгалтерской службы.