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

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

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

Где хранятся цены: архитектура данных

Первым делом выясним, где физически располагается информация о ценах. В отличие от простых справочников, цены в 1С — это периодические данные. Проанализируем основные объекты метаданных, задействованные в процессе:

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

Получение цен с помощью запроса к регистру сведений

Самый быстрый и эффективный способ получить цену в коде — использование языка запросов 1С. Рассмотрим ситуацию, когда нам нужно получить актуальную цену на текущий момент. Для этого мы будем использовать виртуальную таблицу СрезПоследних.

Проанализируем пример запроса, который извлекает цену для конкретной номенклатуры:


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

Запрос.УстановитьПараметр("Период", ТекущаяДата());
Запрос.УстановитьПараметр("Номенклатура", ВыбраннаяНоменклатура);
Запрос.УстановитьПараметр("ВидЦены", ВыбранныйВидЦены);
Запрос.УстановитьПараметр("Характеристика", Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка());

РезультатЗапроса = Запрос.Выполнить();

Важный нюанс: В УТ 11 активно используются характеристики. Если вы не ведете учет по характеристикам, в параметрах запроса обязательно нужно передавать ПустаяСсылка. Если же характеристики используются, но вы передадите пустую ссылку, запрос может не найти цену, установленную на конкретное свойство товара.

Использование типового API конфигурации

Разработчики УТ 11 предусмотрели готовые инструменты в общих модулях, которые позволяют избежать написания объемных запросов вручную. Это особенно полезно, когда нужно получить цены сразу для списка товаров или учесть сложные правила округления и валютного пересчета. Для реализации пересчета в собственном запросе можно использовать пример запроса для пересчета цен по курсу на дату документа в УТ 11.5.

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


ПараметрыЗаполнения = ЦенообразованиеКлиентСервер.ПараметрыДанныхДляРасчетаЦен();
ПараметрыЗаполнения.Номенклатура = СсылкаНаТовар;
ПараметрыЗаполнения.ВидЦены = СсылкаНаВидЦены;
ПараметрыЗаполнения.Дата = ТекущаяДата();

// Вызов типовой функции для получения рассчитанной цены
ЦенаИнфо = ЦенообразованиеВызовСервера.ПолучитьЦенуНоменклатуры(ПараметрыЗаполнения);
Сообщить("Цена товара: " + ЦенаИнфо.Цена);

Преимущество этого метода заключается в том, что система автоматически проверит, является ли цена статической (хранится в регистре) или динамической (рассчитывается по формуле от другой цены в момент обращения). Если цена рассчитывается «на лету», обычный запрос к ЦеныНоменклатуры вернет ноль, а метод общего модуля выдаст корректный результат.

Особенности Ценообразования 2.0 (версии УТ 11.5 и выше)

Выясним причину, по которой старые методы могут не работать в новых релизах конфигурации. Начиная с версии 11.5, в УТ внедрена архитектура Ценообразование 2.0. Основное отличие здесь заключается в расширенных возможностях ведения прайс-листов.

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

Практические советы при работе с кодом

При написании кода для работы с ценами, всегда придерживайтесь следующих правил:

Таким образом, мы проанализировали основные механизмы доступа к ценам в конфигураторе. Выбор метода зависит от вашей задачи: для простых отчетов подойдет прямой запрос к регистру ЦеныНоменклатуры, а для сложной бизнес-логики в документах лучше использовать функции типовых общих модулей, которые гарантируют корректность расчетов согласно настройкам системы.

← На главную