Почему в 1С:Бухгалтерии 3.0 не пересчитывается сумма НДС при смене ставки?

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

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

Разберем детально, почему возникает такое поведение, как устроена работа типовых механизмов расчета НДС и как локализовать и устранить первопричину ошибки.

Анализ программного механизма расчета суммы НДС

Рассмотрим типовой фрагмент кода, отвечающий за расчет налога при изменении реквизитов табличной части документа:


СтрокаТабличнойЧасти[ИмяРеквизитаСуммаНДС] = УчетНДСиАкцизаКлиентСервер.РассчитатьСуммуНДС(
    СтрокаТабличнойЧасти.Сумма,
    УчитыватьНДС, 
    СуммаВключаетНДС,
    УчетНДСиАкцизаВызовСервераПовтИсп.ПолучитьСтавкуНДС(СтрокаТабличнойЧасти.СтавкаНДС),
    ?(СтрокаТабличнойЧасти.Свойство("СуммаАкциза"), СтрокаТабличнойЧасти.СуммаАкциза, 0),
    ?(ПараметрыОбъекта.Свойство("СуммаВключаетАкциз"), ПараметрыОбъекта.СуммаВключаетАкциз, Ложь)
);

В приведенном вызове числовое значение процента определяется функцией УчетНДСиАкцизаВызовСервераПовтИсп.ПолучитьСтавкуНДС(). Ее реализация обращается к реквизитам переданного элемента справочника:


Функция ПолучитьСтавкуНДС(СтавкаНДС) Экспорт
    
    ЗначениеСтавки = 0;    
    Если ТипЗнч(СтавкаНДС) = Тип("СправочникСсылка.СтавкиНДС") Тогда        
        ЗначениеСтавки = СтавкаНДС.Ставка;
    КонецЕсли;
    
    Возврат ЗначениеСтавки;
    
КонецФункции

Если в документе выбрана ставка «Без НДС», ожидается, что функция вернет значение 0, однако на практике может возвращаться ненулевой процент. Выясним, почему это происходит и почему отладчик ведет себя нестандартно.

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

Модуль УчетНДСиАкцизаВызовСервераПовтИсп имеет признак «Повторное использование возвращаемых значений» (на время сеанса или на время вызова). Проанализируем специфику работы таких модулей платформы «1С:Предприятие 8.3»:

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

Для принудительного сброса кэша повторно используемых значений без перезапуска сеанса 1С используется метод глобального контекста:

ОбновитьПовторноИспользуемыеЗначения();

Причины сбоя расчета и пошаговая диагностика

Разберем по шагам, что именно приводит к некорректному расчету суммы налога при выборе ставки:

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

Способы решения и рекомендации по предотвращению ошибок

Для устранения проблемы и исключения подобных инцидентов в будущем выполним следующие действия:

  1. Проверить и исправить справочник «Ставки НДС»:

    Откроем справочник СтавкиНДС (через «Все функции» / «Функции для технического специалиста») и проверим числовой реквизит Ставка у каждого элемента. Для элементов «Без НДС» и «0%» значение ставки должно быть строго равно 0.

  2. Устранить дубликаты ставок:

    Если в системе обнаружено несколько одинаковых ставок НДС, воспользуемся типовой обработкой «Поиск и удаление дублей» (раздел «Администрирование» — «Обслуживание» — «Корректировка данных»), чтобы объединить ссылки и оставить только корректные элементы.

  3. Защитить системные элементы от изменения:

    Чтобы исключить случайное редактирование системных ставок пользователями, в модуле объекта справочника СтавкиНДС в обработчике ПередЗаписью рекомендуется добавить проверку целостности предопределенных значений:

    
    Процедура ПередЗаписью(Отказ)
        
        Если Предопределенный Тогда
            Если (ИмяПредопределенныхДанных = "БезНДС" Или ИмяПредопределенныхДанных = "НДС0") И Ставка <> 0 Тогда
                ВызватьИсключение "Для ставки """ + Наименование + """ значение процента должно быть равно 0.";
            КонецЕсли;
        КонецЕсли;
        
    КонецПроцедуры
    
  4. Ограничить права доступа:

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

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

← На главную