При переходе с редакции 2.0 на редакцию 3.0 конфигурации «1С:Бухгалтерия предприятия» либо в процессе повседневной работы пользователи могут столкнуться с ситуацией, когда при выборе в строке табличной части ставки «Без НДС» или «0%» сумма налога не обнуляется, а продолжает рассчитываться по стандартной ставке (например, 12%, 18% или 20%). При этом попытка отладить алгоритм расчета нередко приводит в замешательство: точка останова внутри функции получения ставки срабатывает через раз или не срабатывает вовсе.
Разберем детально, почему возникает такое поведение, как устроена работа типовых механизмов расчета НДС и как локализовать и устранить первопричину ошибки.
Рассмотрим типовой фрагмент кода, отвечающий за расчет налога при изменении реквизитов табличной части документа:
СтрокаТабличнойЧасти[ИмяРеквизитаСуммаНДС] = УчетНДСиАкцизаКлиентСервер.РассчитатьСуммуНДС(
СтрокаТабличнойЧасти.Сумма,
УчитыватьНДС,
СуммаВключаетНДС,
УчетНДСиАкцизаВызовСервераПовтИсп.ПолучитьСтавкуНДС(СтрокаТабличнойЧасти.СтавкаНДС),
?(СтрокаТабличнойЧасти.Свойство("СуммаАкциза"), СтрокаТабличнойЧасти.СуммаАкциза, 0),
?(ПараметрыОбъекта.Свойство("СуммаВключаетАкциз"), ПараметрыОбъекта.СуммаВключаетАкциз, Ложь)
);
В приведенном вызове числовое значение процента определяется функцией УчетНДСиАкцизаВызовСервераПовтИсп.ПолучитьСтавкуНДС(). Ее реализация обращается к реквизитам переданного элемента справочника:
Функция ПолучитьСтавкуНДС(СтавкаНДС) Экспорт
ЗначениеСтавки = 0;
Если ТипЗнч(СтавкаНДС) = Тип("СправочникСсылка.СтавкиНДС") Тогда
ЗначениеСтавки = СтавкаНДС.Ставка;
КонецЕсли;
Возврат ЗначениеСтавки;
КонецФункции
Если в документе выбрана ставка «Без НДС», ожидается, что функция вернет значение 0, однако на практике может возвращаться ненулевой процент. Выясним, почему это происходит и почему отладчик ведет себя нестандартно.
Модуль УчетНДСиАкцизаВызовСервераПовтИсп имеет признак «Повторное использование возвращаемых значений» (на время сеанса или на время вызова). Проанализируем специфику работы таких модулей платформы «1С:Предприятие 8.3»:
СтавкаНДС, отладчик просто пропустит вход в функцию.Для принудительного сброса кэша повторно используемых значений без перезапуска сеанса 1С используется метод глобального контекста:
ОбновитьПовторноИспользуемыеЗначения();
Разберем по шагам, что именно приводит к некорректному расчету суммы налога при выборе ставки:
Ставка в элементе справочника СтавкиНДС с наименованием «Без НДС» пользователем или бухгалтером. Если в карточке ставки «Без НДС» указан процент (например, 12% или 20%), платформа корректно считывает значение 12 и производит по нему расчет.Для устранения проблемы и исключения подобных инцидентов в будущем выполним следующие действия:
Откроем справочник СтавкиНДС (через «Все функции» / «Функции для технического специалиста») и проверим числовой реквизит Ставка у каждого элемента. Для элементов «Без НДС» и «0%» значение ставки должно быть строго равно 0.
Если в системе обнаружено несколько одинаковых ставок НДС, воспользуемся типовой обработкой «Поиск и удаление дублей» (раздел «Администрирование» — «Обслуживание» — «Корректировка данных»), чтобы объединить ссылки и оставить только корректные элементы.
Чтобы исключить случайное редактирование системных ставок пользователями, в модуле объекта справочника СтавкиНДС в обработчике ПередЗаписью рекомендуется добавить проверку целостности предопределенных значений:
Процедура ПередЗаписью(Отказ)
Если Предопределенный Тогда
Если (ИмяПредопределенныхДанных = "БезНДС" Или ИмяПредопределенныхДанных = "НДС0") И Ставка <> 0 Тогда
ВызватьИсключение "Для ставки """ + Наименование + """ значение процента должно быть равно 0.";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
На уровне ролей и прав пользователей следует закрыть возможность редактирования и добавления новых элементов в справочник СтавкиНДС, оставив доступ только администраторам системы.
Таким образом, если при смене ставки НДС сумма налога рассчитывается некорректно, в первую очередь необходимо проверить числовое значение реквизита Ставка непосредственно в справочнике СтавкиНДС информационной базы клиента, а также учитывать особенности кэширования модулей с повторным использованием значений при отладке.