Как получить цены номенклатуры через 1С OData и почему запрос возвращает пустой результат?

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

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

Разберем архитектуру хранения цен в 1С

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

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

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

Как получить данные через OData

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

Вместо стандартного регистра используйте InformationRegister_ЦеныНоменклатурыДокументов. Для получения данных через OData используйте следующую структуру запроса:


GET http://localhost/ИмяБазы/odata/standard.odata/InformationRegister_ЦеныНоменклатурыДокументов?$format=json

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

Как проверить заполненность данных в 1С

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

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

Рекомендации при работе с OData

При проектировании обмена данными через OData всегда учитывайте следующие моменты:

Во-первых, всегда проверяйте доступность метаданных. Если регистр не отображается в $metadata, значит, он не опубликован для доступа через OData в настройках веб-сервиса 1С.

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

В-третьих, если вы разрабатываете интеграцию для 1С:Бухгалтерии, учитывайте, что функционал установки цен может быть отключен в разделе Администрирование -> Продажи -> Виды цен. Если этот флаг снят, регистр ЦеныНоменклатуры будет оставаться пустым по определению.

Надеемся, что теперь, понимая разницу между двумя этими регистрами, вы сможете настроить корректное получение данных и успешно интегрировать вашу систему с 1С.

← На главную