В процессе разработки в среде 1С:Предприятие программисты часто сталкиваются с необходимостью вычислить сумму налога или произвести иные математические операции со ставкой НДС. Однако в документах ставка НДС обычно хранится в виде ссылки на ПеречислениеСсылка.СтавкиНДС. Чтобы использовать это значение в формулах, его необходимо преобразовать в число (например, из значения НДС20 получить число 20).
В типовых конфигурациях 1С уже существуют встроенные механизмы для такого преобразования. Использование штатных функций вместо написания собственных "велосипедов" гарантирует корректную работу системы при обновлении и соблюдение методологии учета. В этой статье мы подробно разберем, какие модули и функции следует использовать в разных версиях программ 1С.
В современных конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), разработчики унифицировали механизмы работы с налогами. Проанализируем наиболее эффективные способы получения ставки.
Самым универсальным методом является использование модуля УчетНДСКлиентСервер. Данный модуль доступен во всех контекстах выполнения кода. Рассмотрим пример использования:
// Получаем числовое значение ставки (например, 20)
СтавкаЧислом = УчетНДСКлиентСервер.ПолучитьСтавкуНДС(ТекущаяСтрока.СтавкаНДС);
// Получаем коэффициент ставки для расчетов (например, 0.2)
Коэффициент = УчетНДСКлиентСервер.ПолучитьКоэффициентСтавкиНДС(ТекущаяСтрока.СтавкаНДС);
Если нам требуется массовый расчет (например, при заполнении большой табличной части или в отчете), с точки зрения производительности лучше использовать функции с повторным использованием значений. Разберем, как это работает в модуле УчетНДСПовтИсп:
// Функция кэширует результат, что ускоряет повторные вызовы
СтавкаНДСЧисло = УчетНДСПовтИсп.ПолучитьСтавкуНДС(СтавкаНДС);
В конфигурации 1С:Бухгалтерия предприятия 3.0 также можно встретить обращение к специализированным модулям. Например, для переопределяемой логики используется функция:
ОбщийМодуль.УчетНДСПереопределяемый.ПолучитьСтавкуНДС
В конфигурациях Комплексная автоматизация и ERP названия функций могут отличаться в зависимости от версии. Выясним, какие варианты могут встретиться в коде:
УчетНДС и функция ПолучитьСтавкуНДС.УчетНДСУПКлиентСервер.ПолучитьСтавкуНДС(СтавкаНДС).УчетНДСУПВызовСервера.ЗначениеСтавкиНДС(СтавкаНДС).Рассмотрим пример программного получения ставки в документе "Поступление товаров и услуг" для КА:
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
СтавкаЧислом = УчетНДСУПВызовСервера.ЗначениеСтавкиНДС(ТекущиеДанные.СтавкаНДС);
// Дальнейший расчет суммы НДС
КонецЕсли;
Проанализируем ситуацию, когда в старой конфигурации (например, Управление строительной организацией на платформе 8.2) необходимо добавить новую ставку НДС (например, 22%), которой ранее не было в системе. Пользователи часто сталкиваются с тем, что простое добавление нового значения в перечисление СтавкиНДС не приводит к автоматическому расчету налога в документах.
Выясним причину этой проблемы. В старых системах логика расчета часто содержит "жесткое кодирование" (hardcode). Программа буквально проверяет каждое значение перечисления. Рассмотрим типичный пример проблемного кода в общем модуле:
Функция ПолучитьСтавкуНДС(СтавкаНДС) Экспорт
Если СтавкаНДС = Перечисления.СтавкиНДС.НДС18 Тогда
Возврат 18;
ИначеЕсли СтавкаНДС = Перечисления.СтавкиНДС.НДС20 Тогда
Возврат 20;
ИначеЕсли СтавкаНДС = Перечисления.СтавкиНДС.НДС10 Тогда
Возврат 10;
КонецЕсли;
Возврат 0;
КонецФункции
Что нужно сделать для решения:
ПолучитьСтавкуНДС. Чаще всего она находится в модуле ОбщегоНазначения или УчетНДС.НДС22.ЗаполнениеДокументов или модуль самого документа, где вызывается процедура РассчитатьСуммуНДС.Важно помнить, что ставка НДС — это не всегда просто число. Посмотрим, как функции 1С обрабатывают сложные случаи:
1. Расчетные ставки (20/120, 18/118). Типовые функции преобразования обычно возвращают основное число (например, 20). Логика деления на 120 или на 100 определяется флагом в документе НДСВключенВСтоимость или СуммаВключаетНДС. Если вы пишете свой расчет, обязательно учитывайте этот флаг.
2. Значения "0%" и "Без НДС". С математической точки зрения обе эти ставки возвращают 0. Однако с точки зрения учета это разные сущности. Для налоговой отчетности важно сохранять ссылку на перечисление, а числовое значение использовать только в момент умножения/деления в коде.
3. Универсальный (но "грязный") способ. Если вы работаете в нетиповой конфигурации, где нет нужных функций, можно попытаться получить число из имени перечисления, но мы рекомендуем использовать этот метод только в крайнем случае:
// Очистка строки от букв "НДС" и знака "%"
ИмяСтавки = Строка(ТекущаяСтавка);
ЧислоСтрокой = СтрЗаменить(ИмяСтавки, "НДС", "");
ЧислоСтрокой = СтрЗаменить(ЧислоСтрокой, "%", "");
СтавкаЧисло = Число(ЧислоСтрокой);
Внимание: такой метод крайне ненадежен, так как зависит от того, как именно названы элементы в метаданных и какая локализация используется. Всегда отдавайте предпочтение штатным функциям общих модулей УчетНДС....
Подводя итог, можно сказать: для корректного преобразования ставки НДС в число в 1С 8.3 используйте УчетНДСКлиентСервер.ПолучитьСтавкуНДС(). Это обеспечит надежность кода и его совместимость с будущими обновлениями конфигурации.