В типовой конфигурации 1С:Управление торговлей 11 (УТ 11) заложена строгая логика работы с мультивалютностью. Если базовая цена задана в долларах (USD), а рассчитываемая — в рублях (RUB), система автоматически обращается к регистру сведений КурсыВалют и выполняет пересчет по официальному курсу ЦБ РФ на дату установки цен. Однако в реальном бизнесе часто возникает задача зафиксировать внутренний курс (например, «заморозить» его на отметке 60 рублей) или добавить к официальному курсу определенную маржу, чтобы не менять прайс-листы ежедневно.
В этой статье мы разберем, как обойти стандартные ограничения и реализовать расчет цен по собственному алгоритму, используя возможности платформы 1С:Предприятие 8.3.
Рассмотрим ситуацию: вы создаете Вид цены, где формула выглядит как [ВалютнаяЦена] * 60 + 10. Казалось бы, результат очевиден. Но при записи документа Установка цен номенклатуры система видит, что исходная цена в USD, а целевая в RUB. Программа сначала принудительно конвертирует USD в RUB по курсу из справочника Валюты, а затем применяет вашу формулу к уже пересчитанному числу. В итоге получается двойной или некорректный пересчет. Выясним, как этого избежать.
Это самый простой и надежный метод, не требующий программирования и изменения конфигурации. Проанализируем последовательность действий:
Валюты (Настройки — Общие настройки — Валюты).Теперь при настройке Вида цены мы указываем, что базовая цена (например, цена закупки) хранится именно в этой «виртуальной» валюте. Поскольку ее курс статичен и управляется вами вручную, итоговая розничная цена в рублях будет всегда рассчитываться по формуле Цена закупки * 60, независимо от того, что происходит на валютной бирже.
Если вам нужна более сложная логика, чем просто фиксированный курс, разберем использование произвольных запросов. В настройках Вида цены выберите способ задания цены: «Произвольный запрос к данным ИБ».
Этот метод позволяет полностью игнорировать типовой механизм пересчета валют. Мы можем написать запрос в Системе компоновки данных (СКД), который будет обращаться к значениям цен напрямую. Рассмотрим пример логики запроса:
Проанализируем ситуацию, когда нам нужно взять числовое значение из валютной цены «как есть», без учета валюты. В схеме компоновки данных мы выбираем поле Цена из регистра ЦеныНоменклатурыСрезПоследних. В выражении для расчета поля можно прописать прямую математическую операцию, например:
Выбор
Когда ЦеныНоменклатуры.ВидЦены = &ВидЦеныЗакупки
Тогда ЦеныНоменклатуры.Цена * 60 + 10
Конец
Таким образом, 1С будет воспринимать цену просто как число, не пытаясь привязать ее к курсам валют из регистра КурсыВалют.
Иногда система все равно пытается вмешаться в расчеты. В таком случае мы можем применить архитектурную хитрость — создание промежуточного звена. Посмотрим на этот процесс по шагам:
[Базовая (число)] * 60 + 10.В этой схеме 1С не видит валютного перехода (RUB -> RUB), поэтому никакой автоматический пересчет не срабатывает. Вы получаете полный контроль над математикой формирования цены.
Для продвинутых пользователей и программистов существует вариант с использованием Расширений. Это позволяет добавить в документ Установка цен номенклатуры дополнительный реквизит ВнутреннийКурс. Проанализируем, как это работает:
При расчете цен менеджер вводит значение курса прямо в документе. Расширение перехватывает процедуру расчета и заменяет стандартное значение КурсВалюты на введенное пользователем значение. Это удобно, если курс нужно менять оперативно для каждой новой партии товара, не заходя в справочник валют.
Пример кода (фрагмент), который может быть использован в расширении для корректировки расчета:
&После("РассчитатьЦеныПоДаннымИБ")
Процедура Расшир_РассчитатьЦеныПоДаннымИБ(ПараметрыРасчета)
// Здесь переопределяется курс, если заполнен внутренний реквизит
Для Каждого СтрокаЦены Из ПараметрыРасчета.ТаблицаЦен Цикл
Если СтрокаЦены.СвойКурс <> 0 Тогда
СтрокаЦены.Цена = СтрокаЦены.ЦенаЧислом * СтрокаЦены.СвойКурс + 10;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Посмотрим на важный нюанс: при использовании формул вроде * 60 + 10 часто получаются дробные или «некрасивые» значения (например, 734.22 руб.). В УТ 11 предусмотрен мощный механизм округления.
Разберем, как его настроить в Виде цены:
Мы выяснили, что наиболее стабильный и простой способ реализовать расчет по собственному курсу в 1С:Управление торговлей 11 — это использование виртуальной валюты. Она позволяет обойти жесткие механизмы платформы, связанные с официальными курсами ЦБ, и дает полную свободу в ценообразовании. Если же задача требует автоматизации и сложной логики — использование СКД или расширений станет наиболее профессиональным решением.