Как программно преобразовать ставку НДС из перечисления в число в 1С:Предприятие

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

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

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

Решения для современных конфигураций (БП 3.0, ERP 2.0, КА 2.0)

В современных конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), разработчики унифицировали механизмы работы с налогами. Проанализируем наиболее эффективные способы получения ставки.

Самым универсальным методом является использование модуля УчетНДСКлиентСервер. Данный модуль доступен во всех контекстах выполнения кода. Рассмотрим пример использования:


// Получаем числовое значение ставки (например, 20)
СтавкаЧислом = УчетНДСКлиентСервер.ПолучитьСтавкуНДС(ТекущаяСтрока.СтавкаНДС);

// Получаем коэффициент ставки для расчетов (например, 0.2)
Коэффициент = УчетНДСКлиентСервер.ПолучитьКоэффициентСтавкиНДС(ТекущаяСтрока.СтавкаНДС);

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


// Функция кэширует результат, что ускоряет повторные вызовы
СтавкаНДСЧисло = УчетНДСПовтИсп.ПолучитьСтавкуНДС(СтавкаНДС);

В конфигурации 1С:Бухгалтерия предприятия 3.0 также можно встретить обращение к специализированным модулям. Например, для переопределяемой логики используется функция:

ОбщийМодуль.УчетНДСПереопределяемый.ПолучитьСтавкуНДС

Особенности работы в комплексных конфигурациях (КА 1.1, КА 2.0, ERP)

В конфигурациях Комплексная автоматизация и ERP названия функций могут отличаться в зависимости от версии. Выясним, какие варианты могут встретиться в коде:

  1. В старых редакциях (КА 1.1) использовался модуль УчетНДС и функция ПолучитьСтавкуНДС.
  2. В более свежих версиях метод может располагаться в модуле УчетНДСУПКлиентСервер.ПолучитьСтавкуНДС(СтавкаНДС).
  3. Также существует серверный вариант вызова: УчетНДСУПВызовСервера.ЗначениеСтавкиНДС(СтавкаНДС).

Рассмотрим пример программного получения ставки в документе "Поступление товаров и услуг" для КА:


ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
    СтавкаЧислом = УчетНДСУПВызовСервера.ЗначениеСтавкиНДС(ТекущиеДанные.СтавкаНДС);
    // Дальнейший расчет суммы НДС
КонецЕсли;

Проблема добавления новых ставок НДС (на примере УСО и УПП)

Проанализируем ситуацию, когда в старой конфигурации (например, Управление строительной организацией на платформе 8.2) необходимо добавить новую ставку НДС (например, 22%), которой ранее не было в системе. Пользователи часто сталкиваются с тем, что простое добавление нового значения в перечисление СтавкиНДС не приводит к автоматическому расчету налога в документах.

Выясним причину этой проблемы. В старых системах логика расчета часто содержит "жесткое кодирование" (hardcode). Программа буквально проверяет каждое значение перечисления. Рассмотрим типичный пример проблемного кода в общем модуле:


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

Что нужно сделать для решения:

  1. Найти глобальным поиском функцию ПолучитьСтавкуНДС. Чаще всего она находится в модуле ОбщегоНазначения или УчетНДС.
  2. Добавить условие для новой ставки НДС22.
  3. Проверить модуль ЗаполнениеДокументов или модуль самого документа, где вызывается процедура РассчитатьСуммуНДС.

Нюансы работы с расчетными и нулевыми ставками

Важно помнить, что ставка НДС — это не всегда просто число. Посмотрим, как функции 1С обрабатывают сложные случаи:

1. Расчетные ставки (20/120, 18/118). Типовые функции преобразования обычно возвращают основное число (например, 20). Логика деления на 120 или на 100 определяется флагом в документе НДСВключенВСтоимость или СуммаВключаетНДС. Если вы пишете свой расчет, обязательно учитывайте этот флаг.

2. Значения "0%" и "Без НДС". С математической точки зрения обе эти ставки возвращают 0. Однако с точки зрения учета это разные сущности. Для налоговой отчетности важно сохранять ссылку на перечисление, а числовое значение использовать только в момент умножения/деления в коде.

3. Универсальный (но "грязный") способ. Если вы работаете в нетиповой конфигурации, где нет нужных функций, можно попытаться получить число из имени перечисления, но мы рекомендуем использовать этот метод только в крайнем случае:


// Очистка строки от букв "НДС" и знака "%"
ИмяСтавки = Строка(ТекущаяСтавка); 
ЧислоСтрокой = СтрЗаменить(ИмяСтавки, "НДС", "");
ЧислоСтрокой = СтрЗаменить(ЧислоСтрокой, "%", "");
СтавкаЧисло = Число(ЧислоСтрокой);

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

Подводя итог, можно сказать: для корректного преобразования ставки НДС в число в 1С 8.3 используйте УчетНДСКлиентСервер.ПолучитьСтавкуНДС(). Это обеспечит надежность кода и его совместимость с будущими обновлениями конфигурации.

← На главную