При интеграции 1С с внешними системами, например, с веб-сайтом, часто возникает задача получить сводные данные из нескольких источников: номенклатура, ее цены, остатки на складах. В мире баз данных для этого используется оператор JOIN. Возникает закономерный вопрос: можно ли сделать нечто подобное через стандартный OData-интерфейс 1С или он предназначен только для запроса «сырых» таблиц?
Давайте подробно разберемся в возможностях и ограничениях OData в контексте соединения данных и рассмотрим наиболее эффективные подходы для решения этой задачи.
Начнем с главного: в OData нет прямого аналога оператора JOIN, как в SQL. Нельзя написать запрос, который бы произвольно соединил, например, регистр сведений и регистр накопления по общим измерениям, если между ними нет прямой ссылочной связи в метаданных.
Это связано с самой сутью протокола OData. Он предназначен для работы с сущностями (объектами метаданных, такими как справочники, документы, регистры) в рамках REST-архитектуры, а не для выполнения произвольных SQL-запросов к базе данных. Его цель — предоставить стандартизированный CRUD-интерфейс к объектам, а не служить полноценным сервером баз данных.
Наиболее близким к JOIN функционалом в OData является системный параметр $expand. Он позволяет «развернуть» или «расширить» связанные данные, подтянув их в один ответ с основным запросом. Фактически, это аналог LEFT JOIN.
Ключевое условие: $expand работает только для полей, которые имеют ссылочный тип, то есть когда связь между объектами явно определена в конфигурации 1С.
Рассмотрим на примере. Допустим, у нас есть документ «РеализацияТоваровУслуг», в котором есть реквизит «Контрагент» (ссылка на справочник «Контрагенты»). Мы можем одним запросом получить и сам документ, и данные связанного с ним контрагента.
Пример запроса:
/odata/standard.odata/Document_РеализацияТоваровУслуг?$filter=Ref_Key eq guid'...'&$expand=Контрагент
В ответе мы получим поля документа реализации, а внутри будет вложенный объект с полями контрагента. Это очень удобно и позволяет избежать проблемы «N+1 запросов», когда на каждый объект из списка приходится делать отдельный запрос за связанными данными.
Ограничения $expand:
При работе с большими объемами данных важно загружать их порциями. В OData для этого есть стандартные параметры:
$top=N — аналог LIMIT или TOP N. Указывает, сколько записей нужно вернуть.$skip=N — аналог OFFSET. Указывает, сколько записей нужно пропустить от начала выборки.Комбинируя эти два параметра, легко реализовать пагинацию. Например, чтобы получить третью страницу данных по 50 товаров на странице, запрос будет выглядеть так:
/odata/standard.odata/Catalog_Номенклатура?$top=50&$skip=100
Этот запрос пропустит первые 100 записей (2 страницы по 50) и вернет следующие 50. Для быстрого формирования и отладки таких URL можно использовать генератор запросов OData для платформы 1С.
Когда требуется сложная выборка с произвольными соединениями, использованием виртуальных таблиц или агрегацией, стандартных возможностей OData не хватает. В этом случае есть два основных пути.
Это наиболее гибкий и правильный архитектурный подход для сложных интеграций. Вы создаете в конфигурации 1С собственный HTTP-сервис, который будет выполнять роль кастомного API. Для ускорения этой задачи можно использовать конструктор API для интеграции 1С в формате JSON.
Разберем по шагам:
/products/list с методом GET).Запрос вы можете составить абсолютно любой по сложности запрос:
ЛЕВОЕ СОЕДИНЕНИЕ, ВНУТРЕННЕЕ СОЕДИНЕНИЕ.Остатки, Обороты, СрезПоследних).СУММА, КОЛИЧЕСТВО) и вложенные запросы.HTTPОтвет, помещаете в его тело строку JSON и отправляете клиенту.Преимущества этого подхода:
Этот подход заключается в том, чтобы сделать несколько последовательных OData-запросов и «склеить» данные уже на стороне принимающей системы (например, на сайте).
Например, для получения списка товаров с ценами и остатками, клиенту придется:
Недостатки этого подхода:
in) скорее всего не сработает из-за ограничений на максимальную длину URL.Этот метод может быть оправдан только для очень простых случаев с небольшим объемом данных.
Подведем итоги. Стандартный интерфейс OData в 1С — мощный инструмент, но его сфера применения ограничена.
$expand. Он идеален, когда структура вашего API близка к структуре объектов метаданных.