Разработка и Конфигурация · 11 мин
Как получить тип цены в 1С
Как получить тип цены в 1С: через запрос, в коде 1С:Предприятие 8, в УТ 11 и ERP. Примеры запросов к регистру цен, типичные ошибки и проверка результата.
Тип цены в 1С — это элемент справочника, который определяет, какая именно цена применяется к номенклатуре: розничная, оптовая, закупочная, партнерская и т. д. В зависимости от конфигурации он называется по-разному: «Типы цен номенклатуры» в Управлении торговлей 10.3 и УПП, «Виды цен» в УТ 11, ERP и Комплексной автоматизации, «Типы цен» в УНФ. Получить тип цены может понадобиться при разработке отчета, выгрузке прайса, обмене с сайтом или проверке корректности заполнения данных.
Задача «получить тип цены» обычно распадается на три разные: найти нужный элемент справочника видов цен, получить сами значения цен по этому виду из регистра сведений и определить, какой вид цен подставляется в документ по умолчанию. Ниже разобраны все три сценария с примерами кода на встроенном языке 1С и запросами.
Приведенные примеры ориентированы на типовые конфигурации. В самописных или сильно доработанных решениях имена объектов метаданных могут отличаться — перед использованием кода проверьте фактические имена справочников и регистров в конфигураторе.
Где хранятся типы цен в типовых конфигурациях
Прежде чем писать код, нужно понять, с какими объектами метаданных вы работаете. В УТ 11, ERP 2 и КА 2 справочник называется «Виды цен», регистр сведений — «Цены номенклатуры» (периодический, измерения «Номенклатура», «ВидЦены», иногда «ХарактеристикаЦО»). В УТ 10.3 и УПП 1.3 — справочник «Типы цен номенклатуры» и регистр «Цены номенклатуры» с измерением «ТипЦен».
В 1С:Розница используется «Виды цен» и регистр «Цены номенклатуры», при этом часто задействован механизм цен магазинов. В УНФ — справочник «Виды цен» и регистр «Цены номенклатуры» с учетом характеристик. В Бухгалтерии предприятия 3.0 есть справочник «Типы цен номенклатуры» и регистр «Цены номенклатуры», но функционал ценообразования там минимален.
Точные имена объектов смотрите в конфигураторе: откройте дерево конфигурации, найдите нужный справочник и регистр сведений, проверьте имена измерений и реквизитов. Это избавит от ошибок «Поле не найдено» при выполнении запроса.
Как получить тип цены запросом к справочнику
Самый частый случай — найти ссылку на вид цены по его наименованию, чтобы затем использовать её в отборе. Для этого подходит простой запрос к справочнику:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВидыЦен.Ссылка КАК ВидЦены
|ИЗ
| Справочник.ВидыЦен КАК ВидыЦен
|ГДЕ
| ВидыЦен.Наименование = &Наименование
| И НЕ ВидыЦен.ПометкаУдаления";
Запрос.УстановитьПараметр("Наименование", "Розничная");
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
ВидЦены = Результат.ВидЦены;
КонецЕсли;
Искать по наименованию рискованно: пользователь может переименовать элемент, и код перестанет работать. Надежнее искать по предопределенному имени (если вид цены предопределенный), по коду или по дополнительному реквизиту. Для предопределенных элементов используйте Справочники.ВидыЦен.ИмяПредопределенного или метод ПредопределенныйЭлемент в зависимости от версии платформы.
Если нужен список всех действующих видов цен — например, для заполнения выпадающего списка в обработке, — выберите все элементы без отбора по наименованию, отсортировав по наименованию и исключив помеченные на удаление.
Как получить значение цены по типу цены
Зная вид цены, можно получить само значение цены конкретного товара. Цены хранятся в периодическом регистре сведений, поэтому правильный способ — срез последних на нужную дату с отбором по измерениям:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Цены.Номенклатура КАК Номенклатура,
| Цены.Цена КАК Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
| &Период,
| ВидЦены = &ВидЦены
| И Номенклатура В (&СписокНоменклатуры)) КАК Цены";
Запрос.УстановитьПараметр("Период", ТекущаяДатаСеанса());
Запрос.УстановитьПараметр("ВидЦены", ВидЦены);
Запрос.УстановитьПараметр("СписокНоменклатуры", СписокТоваров);
Обратите внимание: параметры виртуальной таблицы «СрезПоследних» задают отбор до соединения с другими таблицами — это важно для производительности. Отбор в секции ГДЕ вместо параметров виртуальной таблицы заставит СУБД построить срез по всей номенклатуре, что на больших базах приведет к заметному замедлению.
В УТ 11 и ERP есть и программный интерфейс: функции общего модуля Ценообразование и связанных модулей, а также механизм «Цены номенклатуры» через документ «Установка цен номенклатуры». Если задача решается штатными средствами, предпочтительнее использовать API конфигурации, а не прямые запросы, — так код переживет обновления.
ВидЦены = Справочники.ВидыЦен.НайтиПоНаименованию("Оптовая", Истина);
Если Не ВидЦены.Пустая() Тогда
// вид цены найден, можно использовать в отборах
КонецЕсли;Как определить тип цены, подставляемый в документы
Вид цены, который автоматически попадает в документ продажи, обычно берется из соглашения с клиентом, договора, карточки партнера или настроек торгового документа. В УТ 11 поле «Вид цены» есть в соглашении с клиентом; если соглашение не указано, используется вид цены из условий продаж по умолчанию или из настроек пользователя.
Программно получить вид цены из соглашения можно так: обратиться к реквизиту соглашения, например Соглашение.ВидЦен. В УТ 10.3 аналогичная роль — у реквизита «Тип цен» договора контрагента или типа цен в карточке контрагента.
Если нужно узнать, какой вид цен задан «по умолчанию» для текущего пользователя, проверьте настройки пользователя (в УТ 11 — подсистема настроек пользователей, общие модули работы с персональными настройками). Универсального кросс-конфигурационного способа нет — логика зависит от конкретного решения.
Как выбрать способ получения типа цены
Получение типа цены в СКД и отчетах
В отчетах на СКД вид цены обычно выносят в параметры. Создайте параметр «ВидЦены» с типом «СправочникСсылка.ВидыЦен», установите значение по умолчанию и используйте его в параметрах виртуальной таблицы среза цен. Тогда пользователь сможет переключать вид цены в настройках отчета без изменения запроса.
Если в отчете нужно показать цены сразу по нескольким видам (например, оптовую и розничную рядом), сделайте несколько левых соединений со срезом последних с разными отборами или используйте свертку: выберите вид цены как поле группировки и разверните цены по колонкам через ресурсы с выражениями вида Максимум(Выбор Когда ВидЦены = &Опт Тогда Цена Конец).
Проверьте результат отчета на тестовом товаре, для которого цена известна: сверьте значение в отчете с карточкой номенклатуры или документом установки цен. Расхождение чаще всего означает, что срез взят не на ту дату или отбор по виду цены не сработал.
Как проверить результат
Переменная содержит непустую ссылку, ЗначениеЗаполнено() возвращает Истина
Пустая ссылка — элемент не найден, проверьте наименование и пометку удаления
Цена совпадает с данными карточки товара на ту же дату
Цена пустая или устаревшая — нет записи в регистре на эту дату либо неверный вид цены
Совпадает с видом цен из соглашения клиента
Подставился другой вид — проверьте соглашение и настройки по умолчанию
Типичные ошибки и ограничения
Самая распространенная ошибка — поиск вида цены по наименованию без учета регистра и лишних пробелов. «Оптовая» и «Оптовая » (с пробелом) — разные строки. Используйте сравнение без учета регистра или храните ссылку в константе либо параметре сеанса, а не ищите каждый раз по строке.
Вторая ошибка — забыть про периодичность регистра. Прямой запрос к таблице регистра без среза последних вернет все исторические записи, и вы получите задвоение данных или неактуальную цену. Всегда используйте виртуальные таблицы «СрезПоследних» или «СрезПервых».
Третья группа проблем — характеристики и упаковки. В УТ 11 цена может быть задана на характеристику, а единица измерения цены может отличаться от базовой единицы товара. Если в отборе не учесть характеристику, цена «не найдется»; если не учесть коэффициент упаковки, цена окажется неверной по величине.
Границы безопасной самостоятельной работы
Чтение данных о видах и значениях цен безопасно: запросы и внешние обработки с выборкой ничего не меняют в базе. Риск появляется, когда обработка начинает записывать цены — например, массово создавать документы установки цен или писать напрямую в регистр сведений.
Прямая запись в регистр «Цены номенклатуры» в обход документа «Установка цен номенклатуры» нарушает логику конфигурации: не сработают проверки, не обновятся связанные данные, а в УТ 11 могут не пересчитаться зависимые виды цен. Всегда записывайте цены через штатный документ.
Перед запуском любой обработки массовой загрузки или изменения цен сделайте резервную копию базы или сначала выполните обработку на копии. Ошибочно установленные цены уйдут в документы продажи, на сайт и в кассы — откатить последствия будет значительно дороже, чем профилактика.
Что важно запомнить
Вид цены — элемент справочника, значение цены — запись периодического регистра сведений. Получайте вид цены запросом или через предопределенный элемент, значение — срезом последних с отбором в параметрах виртуальной таблицы, а записывайте цены только через документ установки цен.
Частые вопросы
Как получить тип цены по коду, а не по наименованию?
Используйте метод Справочники.ВидыЦен.НайтиПоКоду("000000001") или запрос с условием ВидыЦен.Код = &Код. Учтите, что код может быть строковым с лидирующими нулями — передавайте его точно в том формате, в котором он хранится в базе.
Почему запрос возвращает пустую цену, хотя в карточке товара цена есть?
Чаще всего срез взят на дату раньше установки цены, указан другой вид цены или у товара цена задана на характеристику, а в отборе характеристика не учтена. Проверьте документ «Установка цен номенклатуры» по этому товару — там видно, каким видом цены и на какую дату установлено значение.
Как выгрузить цены по нескольким видам цен одним запросом?
Передайте в отбор виртуальной таблицы список видов цен: ВидЦены В (&СписокВидовЦен), где параметр — массив или список значений. В результате добавьте поле «ВидЦены» в выборку, чтобы различать строки.
Можно ли получить тип цены без программирования?
Да. В УТ 11 список видов цен доступен в разделе «CRM и маркетинг — Настройки и справочники — Виды цен», значения цен видны в карточке номенклатуры на вкладке цен и в обработке «Прайс-лист». Для разового анализа достаточно стандартного прайс-листа с отбором по нужному виду цены.
Чем отличается «Тип цен» в УТ 10.3 от «Вида цен» в УТ 11?
Суть та же — это справочник категорий цен. Отличаются имена метаданных («ТипыЦенНоменклатуры» против «ВидыЦен»), имя измерения в регистре («ТипЦен» против «ВидЦены») и механизмы расчета: в УТ 11 появились расширенные правила ценообразования, формулы и зависимые виды цен.
Как узнать, какой вид цены использовался в уже проведенном документе?
В документах продажи вид цены хранится в шапке документа (реквизит «ВидЦены» или «ТипЦен» в зависимости от конфигурации). Программно обратитесь к этому реквизиту через ссылку на документ; в интерфейсе поле видно в форме документа рядом с валютой и соглашением.