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