К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как получить цену товара в 1С: программно и через интерфейс

Как получить цену товара в 1С: функция ПолучитьЦенуНоменклатуры, запрос к регистру цен, работа с типами цен и видами ценообразования. Примеры кода и типичные ошибки.

В любой торговой конфигурации 1С цена товара хранится не в карточке номенклатуры, а в отдельном регистре сведений — поэтому простая попытка прочитать реквизит «Цена» у справочника ни к чему не приведёт. Цена зависит от типа цен (оптовая, розничная, закупочная), валюты, даты и, в управляемых решениях, от вида цены и правил ценообразования.

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

Ниже разобраны оба подхода: через интерфейс для пользователя и программно для разработчика, с примерами кода для типовых конфигураций вроде «Управление торговлей 11», «Комплексная автоматизация» и «ERP», а также для старых версий вроде «Управление торговлей 10.3».

Где в 1С хранится цена товара

Ключевой принцип: цена — это не свойство товара, а запись в регистре сведений. В большинстве конфигураций регистр называется «Цены номенклатуры» и имеет измерения «Номенклатура» и «Тип цен» (или «Вид цены»), а также период — дату, с которой цена действует. Это позволяет хранить историю изменений и несколько цен для одного товара одновременно.

Устанавливаются цены документом «Установка цен номенклатуры». Каждый такой документ делает записи в регистр на дату своего проведения. Поэтому актуальная цена — это последняя запись регистра на интересующую дату по заданному типу цен.

В новых конфигурациях (УТ 11, КА 2, ERP) действует расширенная модель: виды цен могут рассчитываться по формулам от других видов цен, использовать соглашения с клиентами и скидки. Но базовый механизм хранения — тот же регистр сведений.

Как посмотреть цену товара в интерфейсе

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

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

Третий вариант — журнал документов «Установка цен номенклатуры». Открыв последний документ по нужному типу цен, можно увидеть, какие цены были установлены и когда. Это полезно при расследовании вопроса «почему в заказ подставилась не та цена».

Как получить цену программно в типовых конфигурациях

В типовых решениях не нужно обращаться к регистру напрямую — есть готовые функции общих модулей. Конкретное имя зависит от конфигурации и версии. В «Управлении торговлей 10.3» и «Управлении производственным предприятием 1.3» используется функция общего модуля «Ценообразование»:

Цена = Ценообразование.ПолучитьЦенуНоменклатуры(

Номенклатура,

ХарактеристикаНоменклатуры,

ТипЦен,

ВалютаЦены);

Функция возвращает цену, приведённую к указанной валюте, с учётом единицы измерения. Если характеристики не ведутся, вторым параметром передаётся пустая ссылка. Дату функция берёт текущую либо из контекста — в ряде версий есть перегрузки с явным параметром даты.

В УТ 11, КА 2 и ERP механизм другой: цены получают через модуль «Ценообразование» или «ЦеныПредприятия» с помощью табличного вызова, например при подборе товаров в документ. Для разовых задач чаще применяют запрос к регистру (см. следующий раздел) — он универсальнее и понятнее при сопровождении.

bsl
Цена = Ценообразование.ПолучитьЦенуНоменклатуры(Номенклатура, Характеристика, ТипЦен, Валюта);

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

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ЦеныНоменклатурыСрезПоследних.Цена

|ИЗ

| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период,

| Номенклатура = &Номенклатура

| И ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних";

Запрос.УстановитьПараметр("Период", ТекущаяДатаСеанса());

Запрос.УстановитьПараметр("Номенклатура", Номенклатура);

Запрос.УстановитьПараметр("ТипЦен", ТипЦен);

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

Цена = Выборка.Цена;

Иначе

Цена = 0; // цена не установлена

КонецЕсли;

Обратите внимание на обработку пустого результата: если цена по данному типу цен никогда не устанавливалась, запрос вернёт пустую выборку, и это нужно явно обработать, иначе в документ уйдёт неинициализированное значение. Также учтите, что в конфигурациях с характеристиками номенклатуры в регистре есть дополнительное измерение «Характеристика» — его тоже надо включить в отбор.

Особенности ценообразования в УТ 11, КА 2 и ERP

В современных конфигурациях цена в документ может подставляться не напрямую из регистра, а через цепочку: соглашение с клиентом → вид цены → скидки и наценки. Поэтому «цена из регистра» и «цена в заказе конкретного клиента» могут отличаться, и это нормальное поведение системы.

Если задача — получить именно ту цену, которую увидит менеджер при заполнении документа, корректнее использовать механизмы типового кода: в УТ 11 заполнение цен в табличной части выполняется через обработку табличной части с действием «ЗаполнитьЦены» и структурой параметров (соглашение, валюта, дата, налогообложение). Повторять эту логику вручную запросом к регистру — значит потерять скидки и правила округления.

Для интеграционных задач (выгрузка цен на сайт, в обмен с маркетплейсом) обычно достаточно среза последних по конкретному виду цен, выбранному как «цена для выгрузки». Главное — зафиксировать в настройках обмена, какой именно вид цены считается источником.

Сравнение способов получения цены

Типовая функция (Ценообразование.ПолучитьЦенуНоменклатуры)

Подходит для старых конфигураций (УТ 10.3, УПП 1.3). Учитывает валюту и единицу измерения, но привязана к конкретной версии конфигурации.

Запрос к регистру «Цены номенклатуры»

Универсален и переносим между конфигурациями. Не учитывает скидки, соглашения и правила расчёта зависимых видов цен.

Типовые механизмы заполнения цен документа (УТ 11, КА, ERP)

Дают цену с учётом соглашений и скидок — ту, что видит пользователь. Сложнее в вызове, требуют структуры параметров.

Просмотр в интерфейсе (карточка, отчёт «Прайс-лист»)

Для ручной проверки без программирования. Не подходит для автоматизации и массовой обработки.

Типичные ошибки при получении цены

Самая распространённая ошибка — попытка прочитать цену как реквизит справочника «Номенклатура». Такого реквизита в типовых конфигурациях нет, а добавление собственного реквизита «Цена» в карточку товара приводит к рассинхронизации: регистр обновляется документами, а реквизит — нет.

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

Типичные ошибки
01
Искать цену в реквизитах карточки товара — цены там нет, она в регистре сведений
02
Не указывать тип цен в отборе — получите произвольную цену из нескольких
03
Брать срез на текущую дату вместо даты документа — старые документы пересчитаются неверно
04
Не обрабатывать пустой результат запроса — в документ уйдёт неопределённое значение
05
Забыть про измерение «Характеристика» — для товара с характеристиками цена не найдётся
06
Игнорировать валюту цены — цена в валюте попадёт в рублёвый документ без пересчёта

Как проверить, что цена получена правильно

После написания кода проверьте результат на контрольном примере: возьмите товар с известной ценой, сравните значение, возвращаемое кодом, с данными отчёта «Цены номенклатуры» на ту же дату и по тому же типу цен. Значения должны совпадать с точностью до валюты и единицы измерения.

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

Контрольные точки

Как проверить результат

Совпадение с отчётом «Цены номенклатуры» на ту же дату и тип цен
Норма

Значения идентичны

Тревожный признак

Код возвращает другую цену — проверьте отборы и дату среза

Товар без установленной цены
Норма

Код возвращает 0 или понятное сообщение

Тревожный признак

Ошибка исполнения или пустое значение в документе

Документ прошлой датой
Норма

Цена соответствует исторической записи регистра

Тревожный признак

Подставляется текущая цена

Товар с характеристиками
Норма

Цена найдена по связке номенклатура + характеристика

Тревожный признак

Цена не находится, хотя в регистре она есть

FAQ

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

Скорее всего, не совпадают условия отбора: другой тип цен, не указана характеристика или дата среза раньше первой установки цены. Откройте отчёт «Цены номенклатуры» с теми же параметрами и сверьте, по какому типу цен и с какой даты цена реально установлена.

Как получить цену с учётом скидки конкретного клиента?

Запросом к регистру это сделать нельзя — скидки рассчитываются отдельным механизмом. В УТ 11 и КА 2 нужно использовать типовое заполнение цен документа с параметрами соглашения клиента, где уже учитываются скидки и наценки.

Можно ли хранить цену прямо в карточке товара, добавив реквизит?

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

Как получить цены сразу для списка товаров, а не по одному?

Используйте запрос со срезом последних и отбором «Номенклатура В (&СписокНоменклатуры)» — параметром передаётся массив или таблица значений. Это выполняется одним обращением к базе и работает значительно быстрее, чем вызов функции в цикле.

Чем отличается «Тип цен» в УТ 10.3 от «Вида цены» в УТ 11?

По сути это аналоги — справочники, определяющие назначение цены. Разница в том, что в УТ 11 вид цены может быть расчётным (вычисляться по формуле от другого вида) и связанным с соглашениями, поэтому не каждая цена физически хранится в регистре — часть рассчитывается на лету.

Как программно установить цену, а не только прочитать?

Создайте и проведите документ «Установка цен номенклатуры» с заполненной табличной частью товаров. Прямая запись в регистр сведений в обход документа нарушает историю ценообразования и не рекомендуется.

Итог

Что важно запомнить

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