Как программно получить цену номенклатуры в 1С:Управление торговлей 11?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При разработке интеграций или дополнительных модулей в 1С:Управление торговлей 11 часто возникает задача получения актуальной цены товара по заданному ВидЦены. Начинающие разработчики часто пытаются искать сложные функции в модулях, пытаясь «рассчитать» цену налету, но давайте разберемся, как сделать это проще и эффективнее.

Понимание архитектуры хранения цен

Важно уяснить один ключевой момент: в УТ 11 цены не рассчитываются динамически в момент каждого запроса (если мы не говорим о скидках). Система спроектирована так, что все виды цен, включая так называемые «динамические» (которые зависят от других видов цен с определенным процентом наценки), записываются в РегистрСведений.ЦеныНоменклатуры в уже готовом, рассчитанном виде.

Это происходит благодаря регламентным заданиям, которые следят за актуальностью данных. Поэтому, если вам нужно получить «тупую» цену из прайс-листа, вам не нужно вызывать сложные серверные методы расчета — достаточно обратиться к базе данных.

Решение через прямой запрос к регистру сведений

Самый надежный и быстрый способ получить цену — это использовать запрос к виртуальной таблице СрезПоследних регистра ЦеныНоменклатуры. Это позволит вам получить актуальное значение на текущую дату или любую другую выбранную точку времени.

Разберем пример кода, который позволит вам получить цену для конкретной номенклатуры:


ВЫБРАТЬ
    ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ВидЦены = &ВидЦены И Номенклатура = &Номенклатура) КАК ЦеныНоменклатурыСрезПоследних

В этом запросе мы используем следующие параметры:

Почему не стоит использовать сложные функции расчета для прайса?

В обсуждениях часто предлагают программно заполнять документ ЗаказКлиента, чтобы система сама рассчитала цену через свои механизмы. Однако, если ваша задача — просто вывести цену в отчет или обработку, этот подход является избыточным. Давайте проанализируем, почему:

  1. Производительность: Создание объекта документа — это тяжелая операция для сервера 1С. Запрос к регистру выполняется в десятки раз быстрее.
  2. Контекст скидок: Как было отмечено в теме, скидки — это отдельная «экосистема». Если вам не нужно учитывать индивидуальные скидки по соглашениям (например, «купи 3 штуки»), то усложнять код нет никакого смысла.
  3. Поддерживаемость: Код, который вызывает штатные методы заполнения, может сломаться при обновлении конфигурации, если 1С изменит логику работы с табличными частями документов. Прямое обращение к РегистрСведений.ЦеныНоменклатуры является гораздо более стабильным решением.

Когда стоит использовать типовые механизмы?

Рассмотрим ситуацию, когда прямого запроса может быть недостаточно. Если в вашей компании активно используются сложные Соглашения с клиентами, которые могут переопределять виды цен, или если цена зависит от валюты, которую нужно конвертировать в момент формирования заказа, тогда следует смотреть в сторону модуля ЦенообразованиеКлиентСервер.

Однако, даже в этом случае, сначала попробуйте решить задачу запросом. Если ВидЦены настроен корректно (имеет правило расчета), то в регистре уже будет лежать итоговая цена в нужной вам валюте, с учетом всех наценок, примененных регламентным заданием.

Подведем итоги

Для большинства задач по получению цены товара в УТ 11:

Следуя этим рекомендациям, вы получите надежный и быстрый код, который не будет ломаться при обновлении системы и обеспечит корректное отображение цен для любых аналитических целей.

← На главную