Как получить записи регистра накопления с отбором через REST API в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции 1С со сторонними системами с использованием стандартного интерфейса OData (REST API) часто возникает необходимость получить движения регистра накопления с фильтрацией по конкретным измерениям. Однако разработчики нередко сталкиваются с ситуацией, когда фильтр срабатывает, но в полученном JSON-ответе отсутствуют реквизиты записей.

Рассмотрим подробно причину возникновения такой проблемы и разберем по шагам правильные способы формирования REST-запросов к регистрам накопления в 1С.

Выясним причину проблемы: почему не выводятся реквизиты

Проанализируем ситуацию, из-за которой в ответе сервера 1С могут отсутствовать реквизиты регистра накопления. Главных причин две:

  1. Обращение к виртуальной таблице вместо физической: Виртуальные таблицы регистра накопления (такие как Balance, Turnovers, BalanceAndTurnovers) предназначены для расчета сводных итогов — остатков и оборотов. Они агрегируют данные в разрезе измерений и ресурсов, но по своей архитектуре не хранят и не возвращают реквизиты отдельных движений или документов-регистраторов.
  2. Отсутствие параметра $select: При запросе к таблице движений платформа 1С по умолчанию может возвращать сокращенный набор полей, если состав запрашиваемых свойств не ограничен и не указан явно.

Способ 1. Запрос к физической таблице движений регистра

Для получения полных записей регистра вместе с их реквизитами необходимо обращаться напрямую к физической сущности вида AccumulationRegister_<ИмяРегистра>, передавая отбор через параметр $filter.

Рассмотрим пример формирования URL-запроса для получения движений с отбором по измерению:


GET /odata/standard.odata/AccumulationRegister_Продажи?$filter=Номенклатура_Key eq guid'00000000-0000-0000-0000-000000000000'

В данном случае платформа вернет физические записи движения регистра, содержащие все заполненные измерения, ресурсы и реквизиты.

Способ 2. Явное указание состава полей с помощью параметра $select

Чтобы гарантировать получение всех необходимых полей и уменьшить объем передаваемых данных, рекомендуется явно перечислять их в параметре $select.

Посмотрим на пример запроса с явным выбором периода, регистратора, типа записи, измерений и реквизитов:


GET /odata/standard.odata/AccumulationRegister_Продажи?$select=Period,Recorder,RecordType,Номенклатура_Key,Количество,Сумма,Комментарий&$filter=Номенклатура_Key eq guid'00000000-0000-0000-0000-000000000000'

При таком подходе в JSON-ответе будут присутствовать только запрошенные свойства, включая реквизиты движений. Для автоматического составления и визуальной настройки подобных параметров можно использовать генератор запросов OData.

Способ 3. Получение итогов через виртуальные таблицы (если реквизиты не требуются)

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

Разберем пример запроса остатков с отбором:


GET /odata/standard.odata/AccumulationRegister_ТоварыНаСкладах/Balance(Condition='Склад_Key eq guid''00000000-0000-0000-0000-000000000000''', Dimensions='Номенклатура')

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

Ограничения OData и альтернативные решения

При работе со стандартным REST API 1С необходимо учитывать важные архитектурные ограничения:

  1. Отсутствие произвольных соединений (JOIN): Стандартный OData-интерфейс 1С не поддерживает объединение таблиц. Из-за этого нельзя в одном OData-запросе к таблице остатков наложить отбор по реквизитам документа-регистратора.
  2. Альтернатива — HTTP-сервис в 1С: Если требуется сложная выборка с соединениями таблиц, отборами по реквизитам регистраторов или специальной группировкой, оптимальным решением является создание собственного HTTP-сервиса в конфигураторе. В нем можно написать полноценный запрос на языке 1С и вернуть результат в формате JSON.
← На главную