В процессе автоматизации работы с коммерческими предложениями часто возникает задача динамического расчета цены. Пользователи хотят, чтобы система автоматически учитывала ставку НДС товара и добавляла к ней определенный процент наценки. Рассмотрим, почему типовые механизмы 1С не предусматривают такой прямой связи и какими способами можно реализовать данную задачу.
Важно понимать, что в типовых конфигурациях 1С:Управление торговлей или 1С:ERP ставка СтавкаНДС в карточке номенклатуры предназначена для целей налогового и бухгалтерского учета, а не для логики ценообразования. Механизм ВидыЦен оперирует базовыми ценами и формулами, которые при расчете не «смотрят» на налоговую ставку конкретной строки товара. Именно поэтому создание универсальной формулы вида «Цена = База + НДС + 1%» в стандартном конструкторе цен невозможно без доработок.
Если вы хотите избежать написания кода, самым правильным подходом будет использование сегментации товаров. Разберем этот алгоритм по шагам:
Ценовые группы для товаров с разными ставками НДС (например: «НДС 20%», «НДС 10%», «Без НДС»).Вид цены, в формуле которого будет заложена нужная наценка (например, 21% для группы «НДС 20%»).Коммерческого предложения используйте автоматический подбор цен согласно правилам ценообразования.Этот метод позволяет системе автоматически подставлять корректную цену при выборе товара, исключая необходимость ручного пересчета.
Если специфика вашего бизнеса требует динамического расчета, при котором цена должна пересчитываться «на лету» в табличной части документа, необходимо использовать Расширение конфигурации. Разберем подход к реализации:
Для корректной работы кода в Управляемых формах необходимо перехватывать событие ПриИзменении для колонки Номенклатура. Это позволит системе получать ставку НДС из справочника и сразу вычислять итоговую цену.
Рассмотрим структуру кода, который нужно использовать при работе с табличной частью:
// Пример правильного перебора строк ТЧ
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
Ставка = СтрокаТЧ.СтавкаНДС;
Если Ставка = Перечисления.СтавкиНДС.НДС20 Тогда
Коэффициент = 1.21;
ИначеЕсли Ставка = Перечисления.СтавкиНДС.НДС10 Тогда
Коэффициент = 1.11;
Иначе
Коэффициент = 1.01;
КонецЕсли;
СтрокаТЧ.Цена = СтрокаТЧ.ЦенаПриобретения * Коэффициент;
КонецЦикла;
Если вы столкнулись с трудностями при подтягивании ЦенаПриобретения в документ, обратите внимание на структуру запроса. Чтобы получить актуальную цену из регистра ЦеныНоменклатуры, запрос должен обязательно учитывать номенклатуру как параметр:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ВидЦены = &ВидЦены И Номенклатура = &Номенклатура) КАК ЦеныНоменклатурыСрезПоследних";
Запрос.УстановитьПараметр("ВидЦены", Справочники.ВидыЦен.НайтиПоНаименованию("Цена приобретения"));
Запрос.УстановитьПараметр("Дата", Объект.Дата);
Запрос.УстановитьПараметр("Номенклатура", СсылкаНаТовар);
Проанализировав поставленную задачу, мы можем сделать следующие выводы:
Обработки табличных частей.УТ 11 или КА стандартные методы изменения цен через «костыли» в коде форм работают некорректно. Расширение позволяет внедрить логику без изменения основной конфигурации.ЦеныНоменклатуры, чтобы не получить нулевую стоимость в коммерческом предложении.Следуя этим шагам, вы сможете настроить систему так, чтобы она учитывала ставку НДС при формировании цены, обеспечивая точность ваших расчетов и коммерческих предложений.