В процессе работы с импортными товарами в программе 1С:Управление нашей фирмой (УНФ) пользователи часто сталкиваются с необходимостью формирования итоговой розничной цены в рублях на основе нескольких закупочных цен, номинированных в разных валютах (например, в долларах и евро). Типовой функционал программы при расчете по формулам часто преподносит неприятный сюрприз: вместо корректной конвертации система может сложить или сравнить номинальные значения валют «один к одному». В результате, если товар стоит 10 долларов, розничная цена может рассчитаться как 10 рублей.
В данной статье мы подробно разберем, почему возникает эта проблема, и проанализируем несколько эффективных способов реализации автоматического выбора максимальной цены из нескольких валютных источников с корректным пересчетом в рубли по актуальному курсу.
Проанализируем ситуацию: в типовой конфигурации 1С:УНФ (версий 1.6 и 3.0) конструктор формул в справочнике ВидыЦен предназначен для работы с числами в рамках одной валютной логики. Когда мы пишем формулу вида Макс([ОптЕвро], [ОптДоллар]), система берет значения из соответствующих регистров. Если для товара установлена цена 100 USD и 90 EUR, механизм сравнения увидит числа 100 и 90. Он выберет 100 и подставит это значение в итоговую цену. Если итоговая цена имеет валюту «рубль», программа просто запишет туда «100», не обращаясь к регистру КурсыВалют внутри самой математической функции.
Рассмотрим по шагам, как можно обойти это ограничение и заставить программу учитывать текущий курс ЦБ РФ.
Этот способ является наиболее стабильным и не требует программирования или покупки дополнительных расширений. Суть метода заключается в создании промежуточных динамических цен, которые будут выступать в роли конвертеров.
Закупка USD и Закупка EUR. Валюта этих цен должна соответствовать валюте прайса поставщика.Закупка USD (в рублях) и Закупка EUR (в рублях).
Розничная цена.
Макс([ЗакупкаUSD_в_рублях], [ЗакупкаEUR_в_рублях]).Посмотрим на пример: система сначала пересчитает 10 USD в 900 рублей, а 9 EUR в 880 рублей. Затем функция Макс сравнит уже сопоставимые величины (900 и 880) и выдаст корректный результат в 900 рублей.
Выясним причину, по которой иногда выгоднее использовать не свои виды цен, а цены поставщиков. В 1С:УНФ есть встроенный функционал автоматического выбора минимальной или максимальной цены среди всех зарегистрированных цен поставщиков.
Разберем алгоритм настройки:
ВидЦены выберем способ расчета «По ценам поставщиков».Этот метод избавляет от необходимости плодить промежуточные ВидыЦен, но требует аккуратного ведения документов ПриходнаяНакладная или РегистрацияЦенНоменклатурыПоставщика.
Если вам необходимо, чтобы цены были «статическими» (записанными в базу, а не вычисляемыми в момент открытия заказа), можно использовать механизм регламентных заданий. Это особенно актуально, если цены должны выгружаться на сайт, который не умеет обращаться к формулам 1С.
Проанализируем пример логики, которую можно внедрить с помощью небольшого расширения или внешней обработки:
// Пример алгоритма для регламентного задания
Процедура ПересчитатьЦеныПоКурсу() Экспорт
КурсUSD = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(ТекущаяДата(), Новый Структура("Валюта", ВалютаUSD)).Курс;
КурсEUR = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(ТекущаяДата(), Новый Структура("Валюта", ВалютаEUR)).Курс;
// Получение текущих цен номенклатуры
// Сравнение значений: Макс(ЦенаUSD * КурсUSD, ЦенаEUR * КурсEUR)
// Запись результата в документ "Установка цен"
КонецПроцедуры
Такой подход позволяет обновлять прайс-лист каждое утро сразу после автоматической загрузки курсов валют с сервера РБК. Это гарантирует актуальность цен в течение всего рабочего дня.
На рынке существуют готовые расширения для 1С:УНФ, которые модифицируют стандартный конструктор формул. Рассмотрим преимущества такого решения:
[ОптUSD] * КурсВалюты("USD").Макс(), Мин(), а также логических условий ?(Условие, Значение1, Значение2), которых не хватает в ранних версиях 1.6.Валюты, все зависимые динамические цены мгновенно обновятся без участия пользователя.При настройке кросс-валютных формул следует учитывать несколько критически важных моментов, выявленных практическим путем:
Ошибка «Нулевой цены»: В последних релизах 1С:УНФ (линейка 3.0) расчетная цена может возвращать «0», если хотя бы у одного из базовых видов цен нет записи в истории (даже если цена фактически установлена). Убедитесь, что для всех используемых в формуле ВидовЦен создан документ Установка цен.
Версионность программы: Если вы используете версию 1.6.4.27, имейте в виду, что в ней зафиксирована программная ошибка в механизме обработки формул. Рекомендуется обновиться до версии 1.6.4.28 или выше (актуально для исторических конфигураций).
Динамические vs Расчетные цены: Помните, что Динамические цены рассчитываются «на лету» в документах. Если у вас в справочнике 10 000 позиций, использование сложных формул со сравнением валют может замедлить работу программы при подборе товара в заказ. В таких случаях лучше использовать Расчетные цены, которые сохраняются в регистре физически.
Подводя итог, можно сказать, что хотя прямой функционал «сравни валюты в формуле» в 1С:УНФ ограничен, задача успешно решается через архитектурную настройку видов цен (способ №1) или через автоматизированную регистрацию цен поставщиков. Выбор метода зависит от объема вашей номенклатуры и необходимости фиксации цен для синхронизации с внешними витринами.