В типовой конфигурации 1С:Управление торговлей 11 (а также в ERP и Комплексной автоматизации) пользователи часто сталкиваются с ограничением: один Вид цены жестко привязан к одной валюте. Это создает неудобства, когда часть товаров закупается и оценивается в рублях, а часть — в долларах или евро, но при этом в документах продажи хочется использовать единую колонку цен. Рассмотрим подробно, почему так происходит и какие существуют пути решения этой задачи.
Для начала разберем внутреннюю структуру системы. Все цены в 1С хранятся в регистре сведений ЦеныНоменклатуры. В этом регистре Валюта является ресурсом, а не измерением. Проанализируем, что это означает на практике: для уникальной комбинации «Номенклатура + Вид цены + Характеристика» в одну точку времени может существовать только одна запись. Если мы попытаемся записать для одного и того же товара цену в USD, а следом — в RUB, вторая запись просто затрет первую.
Многие начинающие разработчики пытаются решить проблему «в лоб», добавляя валюту в измерения регистра или создавая колонку в документе установки цен. Как справедливо отмечено в обсуждении, это влечет за собой необходимость переписывать логику подбора цен во всех заказах, реализациях и отчетах. Поэтому мы рассмотрим более изящные и безопасные методы.
Это самый правильный метод с точки зрения архитектуры 1С. Мы не ломаем типовой функционал, а используем механизм компоновки данных. Рассмотрим алгоритм настройки по шагам:
Проанализируем ситуацию: в документе «Установка цен номенклатуры» менеджер будет видеть обе колонки. Для «Товара А» он заполнит цену в долларах, для «Товара Б» — в рублях. Итоговая розничная цена рассчитается автоматически для обоих позиций, и в чеке или заказе клиента всё будет в единой валюте (рублях), что исключает путаницу в учете.
Если логика выбора валюты сложнее, чем просто «заполнено/не заполнено», воспользуемся схемой компоновки данных (СКД). Рассмотрим пример логики запроса, который можно внедрить в правило расчета цены:
ВЫБРАТЬ
Номенклатура,
ВЫБОР
КОГДА ЦенаUSD > 0 ТОГДА ЦенаUSD * КурсВалюты
ИНАЧЕ ЦенаRUB
КОНЕЦ КАК Цена
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, )
Такой подход позволяет системе автоматически «подтягивать» нужную валюту в зависимости от того, какая базовая цена была установлена для конкретной карточки товара. Выясним преимущество: вам не нужно менять программный код, всё настраивается в пользовательском режиме через конструктор запросов.
Чтобы пользователь не путался в десятках видов цен, в последних версиях УТ 11 реализован механизм групп. Мы можем объединить Виды цен по валютам в одну группу. В рабочем месте «Цены номенклатуры (прайс-лист)» это позволит:
Если бизнес-процесс требует, чтобы в документе «Установка цен номенклатуры» была именно одна колонка «Цена» и рядом колонка «Валюта» (как это было в старых версиях 7.7), можно прибегнуть к доработке через расширение конфигурации. Разберем принцип работы такой доработки:
УстановкаЦенНоменклатуры реквизит ВалютаСтроки.ПередЗаписью или ОбработкаПроведения).ВидЦены, если RUB — в другой.Важно: При таком подходе структура регистра ЦеныНоменклатуры остается типовой. Мы меняем только интерфейс ввода данных для пользователя, а в базе данных всё хранится корректно по разным видам цен. Это позволяет безболезненно обновлять конфигурацию в будущем.
Рассмотрим, почему крайне не рекомендуется добавлять Валюту в измерения регистра сведений ЦеныНоменклатуры. Если вы решитесь на это, приготовьтесь к следующим проблемам:
Подведем итог: Оптимальным решением для 1С:УТ 11 является создание нескольких базовых видов цен по количеству используемых валют и одного результирующего (продажного) вида цены, который собирает данные по формуле или запросу. Это сохраняет целостность системы и обеспечивает необходимую гибкость в управлении ценообразованием.