Как перевести доработанную конфигурацию 1С на ставку НДС 20%

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

Переход на новую ставку НДС 20% — это не просто замена одной цифры в справочнике. Для программиста 1С, работающего с доработанной конфигурацией (например, Управление торговлей 11 или УПП 1.3), эта задача превращается в полноценный аудит всей системы. Проблема осложняется тем, что в старых релизах ставки НДС часто были «зашиты» непосредственно в программный код, запросы и макеты отчетов. Рассмотрим подробно, как правильно организовать этот переход, на что обратить внимание и какие программные механизмы лучше всего использовать.

Анализ проблемы: почему нельзя просто поменять ставку в справочнике

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

  1. Жесткая привязка в запросах. Часто разработчики используют конструкции ВЫБОР КОГДА для расчета суммы налога прямо в тексте запроса.
  2. Массивы предопределенных значений. В модулях ценообразования или печати могут встречаться конструкции, где ставки 18% и 10% собираются в массивы для фильтрации.
  3. Отсутствие историчности. Справочник номенклатуры хранит только актуальную ставку. Если мы просто заменим 18 на 20, документы прошлого года могут начать пересчитываться некорректно при перепроведении.

Стратегия 1: Точечные правки в коде с проверкой даты

Если ваша конфигурация сильно изменена и обновление до последнего типового релиза невозможно или слишком дорого, придется вносить изменения вручную. Проанализируем типичный пример «плохого» кода, который можно встретить в УТ 11, и выясним, как его исправить. Рассмотрим фрагмент, где ставки задаются массивом:


Ставки18 = Новый Массив;
Ставки18.Добавить(Перечисления.СтавкиНДС.НДС18);
Ставки18.Добавить(Перечисления.СтавкиНДС.НДС18_118);
ЗначениеСтавки18 = ЦенообразованиеКлиентСервер.ПолучитьСтавкуНДСЧислом(Ставки18[0]);

Запрос.УстановитьПараметр("Ставки18", Ставки18);
Запрос.УстановитьПараметр("ЗначениеСтавки18", ЗначениеСтавки18);

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


ТекущаяСтавка = ?(Объект.Дата > '20181231235959', 
                 Перечисления.СтавкиНДС.НДС20, 
                 Перечисления.СтавкиНДС.НДС18);

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

Стратегия 2: Переход на механизм «Виды ставок НДС»

Это наиболее правильный и современный подход, который внедрила 1С в последних редакциях Бухгалтерии предприятия 3.0 и УТ 11.4. Суть метода заключается в отказе от хранения конкретного процента в номенклатуре. Вместо этого вводится новая сущность — Вид ставки НДС.

Разберем, как это работает по шагам:

  1. Создается новое перечисление ВидыСтавокНДС со значениями: Общая, Пониженная, Нулевая, БезНДС.
  2. В справочник Номенклатура добавляется реквизит ВидСтавкиНДС.
  3. Пишется функция-менеджер, которая возвращает конкретное значение Перечисления.СтавкиНДС в зависимости от переданной даты.

Рассмотрим пример логики такой функции:


Функция ПолучитьСтавкуПоВидуИДате(ВидСтавки, ДатаДокумента) Экспорт
    Если ВидСтавки = Перечисления.ВидыСтавокНДС.Общая Тогда
        Возврат ?(ДатаДокумента >= '20190101', 
                 Перечисления.СтавкиНДС.НДС20, 
                 Перечисления.СтавкиНДС.НДС18);
    КонецЕсли;
    // ... логика для остальных видов ставок
КонецФункции

Этот метод позволяет пользователю не менять ставки в карточках товаров вручную в новогоднюю ночь. Система сама «поймет», какой процент подставить в документ, исходя из его даты. Посмотрим на пример кода обработки обновления, которая заполняет новые реквизиты на основе старых данных:


Если СтавкаНДС = Перечисления.СтавкиНДС.НДС18 Тогда
    ВидСтавкиНДС = Перечисления.ВидыСтавокНДС.Общая;
ИначеЕсли СтавкаНДС = Перечисления.СтавкиНДС.НДС10 Тогда
    ВидСтавкиНДС = Перечисления.ВидыСтавокНДС.Пониженная;
КонецЕсли;

Особенности работы с запросами в отчетности

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


ВЫБРАТЬ
    СУММА(ВЫБОР
        КОГДА НДСЗаписиКнигиПродаж.СтавкаНДС В (&СтавкаНДС18, &СтавкаНДС20)
            ТОГДА НДСЗаписиКнигиПродаж.СуммаБезНДС
        ИНАЧЕ 0
    КОНЕЦ) КАК СуммаОбщая,
    СУММА(ВЫБОР
        КОГДА НДСЗаписиКнигиПродаж.СтавкаНДС В (&СтавкаНДС20)
            ТОГДА НДСЗаписиКнигиПродаж.НДС
        ИНАЧЕ 0
    КОНЕЦ) КАК СуммаНДС20
ИЗ
    РегистрНакопления.НДСПродажи КАК НДСЗаписиКнигиПродаж

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

Использование типового «Помощника замены ставок»

В типовых решениях (УПП 1.3, УТ 11.4) 1С выпустила специальную обработку Помощник замены ставки НДС на 20%. Мы рекомендуем проанализировать ее код, прежде чем писать свой велосипед. Помощник делает следующее:

  1. Находит всю номенклатуру, где установлена ставка 18%.
  2. Массово меняет ее на 20% (для версий, где еще нет «Видов ставок»).
  3. Позволяет отобрать номенклатуру по группам или категориям.

Помните, что замена ставки в номенклатуре — это лишь половина дела. Если у вас есть Заказы клиентов, созданные в 2018 году, но отгружаемые в 2019, вам придется пересчитывать НДС в этих документах. Рассмотрим пример логики пересчета:


Процедура ПересчитатьНДСПриПереходе(СтрокаТЧ, НоваяСтавка)
    СтрокаТЧ.СтавкаНДС = НоваяСтавка;
    ЗначениеСтавки = ЦенообразованиеКлиентСервер.ПолучитьСтавкуНДСЧислом(НоваяСтавка);
    // Сумма с НДС обычно остается неизменной, меняется пропорция
    СтрокаТЧ.СуммаНДС = СтрокаТЧ.СуммаСНДС * ЗначениеСтавки / (100 + ЗначениеСтавки);
КонецПроцедуры

Подведем итоги

Работа с НДС 20% в доработанных базах — это отличный повод навести порядок в коде. Мы рекомендуем придерживаться следующих правил:

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

← На главную