При интеграции 1С со сторонними системами с использованием стандартного интерфейса OData (REST API) часто возникает необходимость получить движения регистра накопления с фильтрацией по конкретным измерениям. Однако разработчики нередко сталкиваются с ситуацией, когда фильтр срабатывает, но в полученном JSON-ответе отсутствуют реквизиты записей.
Рассмотрим подробно причину возникновения такой проблемы и разберем по шагам правильные способы формирования REST-запросов к регистрам накопления в 1С.
Проанализируем ситуацию, из-за которой в ответе сервера 1С могут отсутствовать реквизиты регистра накопления. Главных причин две:
Balance, Turnovers, BalanceAndTurnovers) предназначены для расчета сводных итогов — остатков и оборотов. Они агрегируют данные в разрезе измерений и ресурсов, но по своей архитектуре не хранят и не возвращают реквизиты отдельных движений или документов-регистраторов.$select: При запросе к таблице движений платформа 1С по умолчанию может возвращать сокращенный набор полей, если состав запрашиваемых свойств не ограничен и не указан явно.Для получения полных записей регистра вместе с их реквизитами необходимо обращаться напрямую к физической сущности вида AccumulationRegister_<ИмяРегистра>, передавая отбор через параметр $filter.
Рассмотрим пример формирования URL-запроса для получения движений с отбором по измерению:
GET /odata/standard.odata/AccumulationRegister_Продажи?$filter=Номенклатура_Key eq guid'00000000-0000-0000-0000-000000000000'
В данном случае платформа вернет физические записи движения регистра, содержащие все заполненные измерения, ресурсы и реквизиты.
Чтобы гарантировать получение всех необходимых полей и уменьшить объем передаваемых данных, рекомендуется явно перечислять их в параметре $select.
Посмотрим на пример запроса с явным выбором периода, регистратора, типа записи, измерений и реквизитов:
GET /odata/standard.odata/AccumulationRegister_Продажи?$select=Period,Recorder,RecordType,Номенклатура_Key,Количество,Сумма,Комментарий&$filter=Номенклатура_Key eq guid'00000000-0000-0000-0000-000000000000'
При таком подходе в JSON-ответе будут присутствовать только запрошенные свойства, включая реквизиты движений. Для автоматического составления и визуальной настройки подобных параметров можно использовать генератор запросов OData.
Если задача заключается в получении сводных остатков или оборотов, а не конкретных строк движений, следует использовать виртуальные таблицы. В этом случае фильтрация передается внутри параметра Condition функции виртуальной таблицы, а не через $filter.
Разберем пример запроса остатков с отбором:
GET /odata/standard.odata/AccumulationRegister_ТоварыНаСкладах/Balance(Condition='Склад_Key eq guid''00000000-0000-0000-0000-000000000000''', Dimensions='Номенклатура')
Обратите внимание, что виртуальная таблица вернет только итоговые остатки по ресурсам в разрезе указанных измерений без деталей о реквизитах регистратора.
При работе со стандартным REST API 1С необходимо учитывать важные архитектурные ограничения: