При попытке интеграции внешних систем с 1С через протокол OData часто возникают ситуации, когда стандартный запрос к регистру сведений InformationRegister_ЦеныНоменклатуры возвращает пустой массив данных, даже если в самой программе цены отображаются корректно. Давайте разберемся, почему это происходит и где на самом деле хранятся данные о ценах в типовых конфигурациях.
Основная причина того, что запрос к InformationRegister_ЦеныНоменклатуры возвращает пустоту, заключается в специфике ведения учета в конфигурациях, таких как 1С:Бухгалтерия 3.0. В системе существует два принципиально разных механизма ценообразования, которые часто путают между собой:
InformationRegister_ЦеныНоменклатуры. Если вы не используете этот документ в своей работе, данный регистр будет всегда пустым.InformationRegister_ЦеныНоменклатурыДокументов.Когда вы видите цену, подставляющуюся в заказ автоматически, в большинстве случаев это происходит именно из регистра InformationRegister_ЦеныНоменклатурыДокументов. Система берет цену из последнего документа движения, если для конкретной номенклатуры не задан отдельный вид цен.
Если ваша задача — получить ту же цену, которую видит пользователь в документе при подборе товара, вам следует перенаправить запрос на другой ресурс. Проанализируем, как правильно сформировать запрос.
Вместо стандартного регистра используйте InformationRegister_ЦеныНоменклатурыДокументов. Для получения данных через OData используйте следующую структуру запроса:
GET http://localhost/ИмяБазы/odata/standard.odata/InformationRegister_ЦеныНоменклатурыДокументов?$format=json
Если вам все же необходимо работать именно с InformationRegister_ЦеныНоменклатуры, убедитесь, что в вашей базе настроены ВидыЦен и используются документы УстановкаЦенНоменклатуры. В противном случае, программный доступ к ним не вернет никаких записей, так как они просто не были созданы в базе данных.
Чтобы убедиться, где именно хранятся ваши цены, выполните следующие шаги в интерфейсе программы:
Shift + F11 для открытия окна навигации.e1cib/list/РегистрСведений.ЦеныНоменклатуры.e1cib/list/РегистрСведений.ЦеныНоменклатурыДокументов.Анализируя записи в этих списках, вы поймете, какой из регистров содержит нужную вам информацию. Помните, что InformationRegister_ЦеныНоменклатурыДокументов является служебным хранилищем истории последних операций и ориентироваться на него следует только с полным пониманием бизнес-логики вашей конфигурации.
При проектировании обмена данными через OData всегда учитывайте следующие моменты:
Во-первых, всегда проверяйте доступность метаданных. Если регистр не отображается в $metadata, значит, он не опубликован для доступа через OData в настройках веб-сервиса 1С.
Во-вторых, если данных очень много, используйте параметры фильтрации $filter по измерению Номенклатура или ВидЦены, чтобы не загружать весь массив записей целиком, что может привести к переполнению памяти или таймауту запроса.
В-третьих, если вы разрабатываете интеграцию для 1С:Бухгалтерии, учитывайте, что функционал установки цен может быть отключен в разделе Администрирование -> Продажи -> Виды цен. Если этот флаг снят, регистр ЦеныНоменклатуры будет оставаться пустым по определению.
Надеемся, что теперь, понимая разницу между двумя этими регистрами, вы сможете настроить корректное получение данных и успешно интегрировать вашу систему с 1С.