1с odata ошибка 500

   абзац

29.03.19 — 12:06

Доброго дня всем.

Имею Apache 2.4 на Centos 7, настроен для работы с сервером 1С (на win/lin — неважно, ситуация одинакова) по протоколу oData. Все работает (добавление/изменение и т.д.), кроме одного — проведение/распроведение документов через oData при помощи команд Post/Unpost не пашет. Ответ: HTTP статус 500,

<m:code>-1</m:code>

<m:message>Error running processor — ‘ОбработкаУдаленияПроведения'</m:message>

Если работать через Apache, установленный на Windows, все отрабатывает корректно — документы проводятся/отменяются. Проблема только с апачем на Linux. Конфиги апача почти дефолтные, с изменениями для 1С. Пробовал версии 1С 8.3.12 и 8.3.14 — одинаково.

Кто-нибудь сталкивался с подобным? Куда копать?

   zehn

1 — 29.03.19 — 12:10

В логи/журнал регистрации/технологический журнал. Это же так естественно, не?

   bolero

2 — 29.03.19 — 14:11

(0) OData работает с правами того пользователя, логин которого ты указал.

Если у этого пользователя не хватает прав на отмену проведения (а у администратора их может тоже не хватить), то и OData не отработает.

А вот сообщение с конкретной ошибкой можно посмотреть, зайдя этим пользователем в предприятие и попытавшись выполнить ту же самую операцию (отменить проведение конкретного документа).

Предполагаю, что ты разными пользователями ходишь через один и другой апач.

   zehn

3 — 29.03.19 — 14:26

(2) Ты хочешь сказать, что 1Сная реализация OData при нарушении прав вместо 403 выбрасывает 500?

   Сияющий в темноте

4 — 29.03.19 — 15:24

403 логично кидать,если пользователь не авторизован,а если авторизован,но метод 1с сказал,что не выйдет,то ошибка 500,т.к.веб сервер в нутро 1с не лезет.

   Вафель

5 — 29.03.19 — 15:26

(3) при любых ошибках кода 1с бросает 500

   zehn

6 — 29.03.19 — 15:51

(5) При развале кода/компилцяии — да. А вот при нарушении прав надо уточнить, потому как ошибка-то клиентская.

Впрочем, это все равно не случай ТС. При нехватке прав, согласно https://its.1c.ru/db/v838doc#bookmark:dev:TI000001367 в <m:code> должен был прилететь код 20.

Так что, таки ТС все равно придется читать логи.

   bolero

7 — 29.03.19 — 16:07

(2) Еще мне там в соседнем треде подсказывали, что при работе апача под виндой он может получить авторизацию операционной системы.

Т.е. типа не важно, какой логин вводишь, все равно от своего работать будет.

Проверить утверждение не могу, нет винды. Под линуксом такого в принципе нет.

(3) Я считаю, 500 в этом случае бросать корректно. Не давать подробного сообщения об ошибке — тоже корректно, оно в ЖР должно быть.

   Вафель

8 — 29.03.19 — 16:15

(6)  ну все верно. код возврата хттп — 500, код ответа — 20

   абзац

9 — 29.03.19 — 16:24

(1) Логи апача смотрел конечно, не помогло (или не увидел). Различия между апачем на винде, где все ОК, и линуксовом с ошибкой, в одной строке:

на винде : Response sent with status 200, headers:

на линуксе: Response sent with status 500, headers:

До этого все одинаково.

В ЖР при ошибке 3 малоинформативных строки: «Сеанс. Начало», «Сеанс. Аутентификация», «Сеанс. Завершение». Без подробностей.

(2) Вряд ли дело в правах — пользователь с полными правами, один и тот же в обоих случаях, при входе под ним в 1С все проводится/распроводится.

(7) Авторизация ОС тут вряд ли поможет — сервер 1С на другом хосте, доменной авторизации на нем нет.

   zehn

10 — 29.03.19 — 16:36

(8) Здесь как раз правильней бросать 403.

401 для совсем неавторизованного, 403 при отсутствии прав на ресурс. Потому как это клиентская ошибка, которая исправляется сменой пользователя, а не «починкой» сервера. REST бестпрактикс и все такое. Но 1Сники, видимо, схалявили.

(9) ТЖ запусти. Там скорей всего какая-нибудь ошибка компиляции/назначения обработчиков и т.п., которая выплывает под линуксом/пользователем и наверх пробиться не может.

  

абзац

11 — 29.03.19 — 16:40

(10) Да, вечером включу полный ТЖ и попробую собрать больше информации.

В этой статье рассказывается об использовании стандартного интерфейса OData для программного чтения и записи данных приложений абонентов сервиса 1С:Фреш.

1. Протокол OData

OData (Open Data Protocol) — это открытый веб-протокол для запроса, добавления, удаления и обновления данных. OData позволяет выполнять операции с ресурсами с помощью HTTP-запросов и получать ответы в форматах XML или JSON. Подробнее о протоколе OData можно прочесть в Википедии.

Доступ к данным посредством OData можно использовать, например:

  • для загрузки и выгрузки данных;
  • для интеграции со сторонними информационными системами;
  • для реализация дополнительной функциональности сторонними средствами.

2. Поддержка в платформе «1С:Предприятие»

Начиная с версии 8.3.5, в платформе «1С:Предприятие» поддерживается доступ через протокол OData к данным информационных баз «1С:Предприятия». Это позволяет читать и записывать из внешнего приложения данные прикладного решения «1С:Предприятия» без модификации кода этого прикладного решения.

2.1. Автоматически создаваемый REST-интерфейс для использования OData

Разработчикам прикладных решений на платформе «1С:Предприятие» не нужно писать ни строчки кода для того, чтобы с данными прикладного решения можно было работать по протоколу OData. Достаточно включить поддержку OData при публикации на веб-сервере, и платформа «1С:Предприятие» автоматически создаст REST-интерфейс, с помощью которого можно обращаться к данным всего прикладного решения по протоколу OData.

Этот автоматически создаваемый REST-интерфейс прикладных решений на платформе «1С:Предприятие» принято называть стандартным интерфейсом OData.

2.2. Условия использования стандартного интерфейса OData

Для использования стандартного интерфейса OData:

  • для доступа к данным следует использовать протокол OData версии 3 (с некоторыми расширениями и ограничениями фирмы 1С);
  • состав объектов прикладного решения, к которым разрешен доступ с помощью интерфейса OData, должен быть установлен путем вызова метода глобального контекста УстановитьСоставСтандартногоИнтерфейсаOData.

2.3. Возможности стандартного интерфейса OData

С помощью стандартного интерфейса OData доступны:

  • практически все основные виды объектов конфигураций прикладных решений на платформе «1С:Предприятие»: бизнес-процессы, документы, журналы документов, задачи, константы, планы видов расчета, планы видов характеристик, планы обмена, планы счетов, регистры бухгалтерии, регистры накопления, регистры расчета, регистры сведений, справочники (подробнее см. здесь);
  • операции чтения, создания, модификации и удаления данных;
  • реквизиты объектов конфигурации, табличные части и реквизиты табличных частей;
  • получение списков документов, справочников, записей регистров сведений и т. п., возможно, с применением фильтра;
  • получение данных документа, элемента справочника, записи регистра сведений и т. д.;
  • редактирование данных документа, элемента справочника или другого ссылочного объекта;
  • создание нового элемента справочника, документа, набора записей;
  • выполнение различных действий с объектами прикладных решений: проведение и отмена проведения документов, выполнение задач, запуск бизнес-процессов, получение остатков и оборотов для регистров накопления и регистров бухгалтерии, и т. п.

При действиях с данными с помощью стандартного интерфейса OData платформа «1С:Предприятие» выполняет все обычные проверки прав доступа и вызывает обработчики событий.

Подробнее о возможностях стандартного интерфейса OData рассказано здесь.

3. Использование интерфейса OData в сервисе 1С:Фреш (1cfresh.com)

В сервисе 1С:Фреш (1cfresh.com) все прикладные информационные базы опубликованы с включенной поддержкой интерфейса OData.

Поэтому для приложений абонентов сервиса 1С:Фреш возможны чтение и запись данных с помощью HTTP-запросов стандартного интерфейса OData.

Ограничение: в сервисе 1С:Фреш в OData-запросах не поддерживается HTTP-заголовок 1C_OData-DataLoadMode: true, позволяющий при записи объектов эмулировать запись, выполняемую во время работы механизма обмена данными (свойство ОбменДанными.Загрузка = Истина). OData-запросы с таким заголовком не будут обработаны.

4. Обработка «Настройка автоматического REST-сервиса»

Для настройки доступа через интерфейс OData в прикладных решениях обычно используется обработка Настройка автоматического REST-сервиса, позволяющая:

  1. Создать служебного пользователя, от имени которого может вызываться интерфейс OData.
  2. Настроить состав объектов приложения, которые будут доступны через интерфейс OData.

Обработка доступна пользователям, имеющим в приложении административные права (роль Полные права). В сервисе Фреш такие права в приложении имеет владелец абонента.

4.1. Вызов обработки

Команды, которые нужно выбрать в меню приложения для вызова обработки, могут быть следующими:

  • Администрирование — Синхронизация данных — Настройки стандартного интерфейса OData;
  • Администрирование и НСИ — Синхронизация данных — Настройки стандартного интерфейса OData;
  • Настройки — Синхронизация данных — Настройки стандартного интерфейса OData.

4.2. Создание служебного пользователя

Для использования интерфейса OData рекомендуется создать в приложении отдельного служебного пользователя. Это можно сделать в обработке Настройка автоматического REST-сервиса на вкладке Авторизация.

Созданному служебному пользователю будут автоматически назначены права, необходимые для использования интерфейса OData, в частности, роль УдаленныйДоступOData. Этот служебный пользователь не будет отображаться ни в списке пользователей приложения (в режиме «1С:Предприятие»), ни в списке пользователей абонента в менеджере сервиса.

4.3. Настройка состава объектов, доступных через интерфейс OData

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

Рекомендуется включать доступ только для видов объектов, используемых в задачах, для которых будет использоваться интерфейс OData. Если для доступа к каким-либо видам объектов необходимо включить доступ через интерфейс OData также и к подчиненным им видам объектов, то обработка Настройка автоматического REST-сервиса выведет соответствующее сообщение и позволит включить такой доступ.

Не рекомендуется включать доступ через OData к планам обмена, так как их некорректное изменение может привести к неработоспособности приложения абонента.

После задания состава объектов, доступных через интерфейс OData, нужно нажать кнопку
.

5. HTTP-запросы интерфейса OData

5.1. URL запроса

5.1.1. Формат URL

URL HTTP-запросов стандартного интерфейса OData имеет вид:

  • URL-приложения/odata/standard.odata/идентификатор-ресурса?параметры

Здесь:

  • URL-приложения — адрес, по которому выполняется доступ к приложению в браузере (без кода языка), например, https://1cfresh.com/a/sbm/12345;
  • /odata/standard.odata/ — признак обращения к стандартному интерфейсу OData;
  • идентификатор-ресурса — особым образом сформированный идентификатор ресурса (возможно, с параметром) или предопределенные ресурсы. Например:

    • Catalog_Контрагенты — обращение к справочнику Контрагенты;
    • Catalog_Контрагенты(guid’c3fbdcaf-b8e1-11e4-8271-001e101f0864′) — обращение к записи справочника Контрагенты с указанным guid;
  • параметры — параметры запроса, они указываются в виде пар ключ=значение, разделенных символами &, как это принято в HTTP-запросах. Параметры не обязательны. Если параметры отсутствуют, то и символ ?, разделяющий имя ресурса и параметры, в запросе не указывается.

5.1.2. Пример

Например, в запросе:

GET https://1cfresh.com/a/sbm/12345/odata/standard.odata/Catalog_Номенклатура?$format=json&$filter=Артикул eq '345'
  • https://1cfresh.com/a/sbm/12345 — URL приложения, к которому делается запрос;
  • /odata/standard.odata/ — признак обращения к стандартному интерфейсу OData;
  • Catalog_Номенклатура — наименование ресурса, к которому относится запрос (справочник Номенклатура);
  • $format=json и $filter=Артикул eq ‘345’ — параметры запроса, разделенные символами &.

5.2. Заголовок аутентификации

В запросе нужно использовать HTTP-заголовок Authorization: Basic с указанием логина/пароля пользователя, от имени которого осуществляется HTTP-запрос (строка логин:пароль, закодированная в формате base64). Этот пользователь должен иметь в приложении либо административные права (роль Полные права), либо роль УдаленныйДоступOData.

5.3. Метод запроса

HTTP-метод запроса выбирается в зависимости от того, какая операция выполняется:

При использовании для обновления данных метода PATCH в запросе можно указывать только обновляемые свойства сущности, а при использовании метода PUT нужно указывать все свойства сущности.

5.4. Указание строк, уникальных идентификаторов и дат

В запросе OData:

  • строки указываются в одинарных кавычках (апострофах). Например: ’Санкт-Петербург’;
  • уникальные идентификаторы указываются как guid’строка. Например: guid’7426fe18-e7e6-11ec-872c-fa163e21d4b7’;
  • даты указываются как datetime’yyyy-mm-ddThh:mm:ss. Например: datetime’2022-09-25T12:30:59’.

5.5. Результат запроса

В результате выполнения запроса клиентское приложение получает ответ сервера, который может содержать данные, предоставленные сервером. Формат этих данных может быть XML (по умолчанию) или JSON.

Чтобы получить от сервера данные в формате JSON, можно:

  • указать параметр запроса $format=json
  • или указать в запросе HTTP-заголовок Accept: application/json

5.6. Правила формирования идентификатора ресурса

5.6.1. Тип и имя объекта конфигурации

Идентификатор ресурса, указываемый в URL стандартного интерфейса OData, начинается с указания типа и имени объекта конфигурации:

Здесь имя объекта записывается так, как оно показано в свойстве объекта Имя в конфигураторе.

5.6.2. Суффикс имени

После указания типа и имени объекта конфигурации может быть указан суффикс, начинающийся с символа подчеркивания:

5.6.3. Выбор элемента

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

Для обращения к отдельному элементу в URL запроса после указания типа и имени объекта конфигурации, и суффикса, если он имеется, необходимо указать в круглых скобках названия и значения ключевых полей нужного элемента в виде пар название=значение, перечисленных через запятую.

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

5.6.4. Указание действия

В заключительной части идентификатора ресурса можно указать после символа / действие с ресурсом. Например:

Замечание. В ответе можно вывести значение реквизита подчиненного объекта. В этом случае полное имя реквизита формируется с использованием разделителя /. Например, /Контрагент/ИНН означает, что в запросе следует вывести только значение реквизита ИНН объекта, на который ссылается реквизит ответа Контрагент.

5.6.5. Методы

Вот некоторые методы, которые можно использовать в OData-запросах (подробнее см. здесь):

Ниже приведены примеры использования некоторых из этих методов:

  • в разделе 6.5.1 — проведение и отмена проведения документов с помощью методов Post и Unpost;
  • в разделе 6.5.2 — вывод курса валюты на указанную дату с помощью метода SliceFirst.

Также имеются специальные методы для регистров накопления, бухгалтерии и расчета подробнее (см. здесь, здесь и здесь):

5.7. Параметры запроса

Как уже говорилось, в HTTP-запросе стандартного интерфейса OData после символа ? могут указываться параметры запроса в виде разделенных амперсендами пар ключ=значение. Если параметры отсутствуют, то символ ?, разделяющий имя ресурса и параметры, в запросе не указывается.

5.7.1. Параметры, задающие условия отбора

5.7.2. Параметры, задающие режимы отображения результатов

Параметры $inlinecount, $orderby и $expand применимы только для запросов, выдающих список элементов. Параметр $expand не может использоваться для расширения реквизитов табличных частей.

В параметре $orderby возможны:

  • использование вызовов функций (см. раздел 5.10);
  • упорядочивание по свойствам дочерних реквизитов — в этом случае полное имя реквизита, по которому выполняется упорядочивание, формируется с использованием разделителя /. Например, $orderby=Контрагент/ИНН asc означает, что упорядочивание будет произведено по возрастанию значения реквизита ИНН объекта, на который ссылается реквизит ответа Контрагент.

В параметре $select при использовании совместно с параметром $expand возможно использование символов * и **:

Подробнее о правилах составления HTTP-запросов стандартного интерфейса OData рассказано здесь и здесь.

5.8. Условия отбора

В параметрах запроса $filter, а также в параметрах Condition, AccountCondition, BalancedAccountCondition применяемых для выполнения действий с ресурсами (см. раздел 5.6.4), указывается условие отбора. Условие формируется из:

  • имен реквизитов;
  • арифметических и логических операций (см. раздел 5.9);
  • вызовов функций (см. раздел 5.10);
  • литералов (чисел, строк, дат, уникальных идентификаторов);
  • круглых скобок (как обычно, они используются для явного задания порядка вычисления значения).

При указании условий запроса (параметр $filter) или реквизита, по которому выполняется упорядочивание результатов (параметр $orderby) могут применяться следующие функции:

5.9. Арифметические и логические операции

В условиях отбора запросов OData могут использоваться арифметические и логические операции.

5.9.1. Логические операции

Не поддерживаются операции сравнения с реквизитом типа ХранилищеЗначения.

5.9.2. Арифметические операции

5.10. Функции

В параметрах запроса $filter и $orderby, а также в параметрах Condition, AccountCondition, BalancedAccountCondition методов, применяемых для выполнения действий с ресурсами (см. раздел 5.6.4), могут применяться следующие функции.

5.10.1. Функции для работы со строками

5.10.2. Функции для работы с датами

5.10.3. Функции all и any

Для отбора по реквизитам табличных частей в запросах стандартного интерфейса OData можно использовать лямбда-функции all и any. Эти функции проверяют указанное условие для всех строк табличной части объекта, и возвращают значение true:

  • для функции any — если условие выполнено хотя бы для одной строки табличной части;
  • для функции all — если условие выполнено для всех строк табличной части.

В иных случаях эти функции возвращают значение false.

Поясним синтаксис функций all и any на примере. Пусть нужно отобрать документы РасходТовара, в которых имеется хотя бы один товар с ценой большей 10000. Иными словами, в табличной части Товары этих документов должна быть хотя бы одна строка, в которой значение реквизита Цена больше 10000. Это можно сделать, использовав в запросе OData такую конструкцию:

.../Document_РасходТовара?$filter=Товары/any(d: d/Цена gt 10000)

Как видно, непосредственно перед названием функции any указывается имя табличной части Товары и слеш /. В скобках указывается имя переменной (в данном случае использовано имя d). Эта переменная будет использоваться в логическом выражении, она обозначает строку табличной части. После имени переменной следует двоеточие и затем указывается проверяемое логическое выражение. Обозначение d/Цена означает реквизит Цена строки d табличной части документа.

Аналогично, чтобы отобрать документы РасходТовара, у которых в табличной части Товары во всех строках значение реквизита Цена больше 10000, в запросе OData можно использовать следующую конструкцию:

.../Document_РасходТовара?$filter=Товары/all(d: d/Цена gt 10000)

Ниже в разделе 6.5.1 приведен пример использования функции any.

5.10.4. Прочие функции

6. Примеры запросов с помощью стандартного интерфейса OData

Приведенные ниже примеры показывают лишь некоторые самые простые возможности запросов с помощью стандартного интерфейса OData. Более полные сведения можно прочесть в руководстве разработчика 1С:Предприятия.

6.1. Общие сведения

6.1.1. Приложение для примеров использования стандартного интерфейса OData

Для удобства приведем сквозной пример использования стандартного интерфейса OData. В нем мы будем использовать демонстрационное приложение Управление нашей фирмой. В нем нужно:

  1. Включить валютный учет (Настройки — Еще больше возможностей —Деньги —установить флажок Несколько валют.
  2. Добавить валюту Доллар США (Деньги —Валюты), включив для нее режим установки курса загружается из Интернета.
  3. В обработке Настройка автоматического REST-сервиса (см. раздел 4) включить доступ через интерфейс OData к следующим объектам конфигурации:

    • справочники Номенклатура, Организации, Сотрудники, Физические лица
    • документы Доверенность, ЗаказПокупателя
    • регистр сведений КурсыВалют

6.1.2. Клиент для HTTP-запросов

GET-запросы стандартного интерфейса OData можно выполнять с помощью браузера. В адресной строке браузера нужно вводить только URL, без указания метода GET.

Для выдачи всех видов HTTP-запросов можно использовать расширение REST Client среды разработки Visual Studio Code (ссылка) или любое аналогичное приложение.

6.1.3. ПрефиксURL

Все OData-запросы к приложению начинаются со строки адрес-приложения/odata/standard.odata. Например, если адрес приложения https://1cfresh.com/a/sbm_demo/1962515, то OData-запросы к этому приложению начинаются со строки https://1cfresh.com/a/sbm_demo/1962515/odata/standard.odata

Для наглядности и экономии места мы будем в дальнейшем вместо этой строки использовать обозначение ПрефиксURL.

6.2. Получение списков

Покажем применение методов стандартного интерфейса OData, выдающих списки различных сущностей — записей справочника, записей регистров, документов и т.д. Мы будем это делать на примере справочников Сотрудники, ФизическиеЛица и Номенклатура. Аналогичным образом можно получать сведения о других видах объектов прикладного решения.

6.2.1. Количество объектов

Просмотрим сведения о справочнике Сотрудники. Для начала узнаем количество записей в этом справочнике. Для этого укажем в GET-запросе после имени объекта Catalog_Сотрудники нужное действие /$count:

GET ПрефиксURL/Catalog_Сотрудники/$count

Здесь вместо ПрефиксURL нужно использовать строку, как указано в разделе 6.1.3. Далее это замечание мы повторять не будем.

Запрос можно ввести в адресной строке браузера (только URL, без указания метода GET).

Должен быть выдан ответ — количество сотрудников, например:

29

6.2.2. Вывод списка

Выведем первые 2 записи справочника ФизическиеЛица. Для этого укажем в запросе параметр $top=2. Также зададим в этом запросе и будем указывать в последующих запросах параметр $format=json, указывающий применение формата JSON для кодирования данных в теле ответа и в теле запроса.

GET ПрефиксURL/Catalog_ФизическиеЛица?$format=json&$top=2

Должен быть выдан примерно такой ответ:

{
  "odata.metadata": "https://1cfresh.com:443/a/sbm_demo/1962515/odata/standard.odata/$metadata#Catalog_ФизическиеЛица",
  "value": [
    {
      "Ref_Key": "baebacee-b80e-11e4-826f-001e101fe696",
      "DataVersion": "AAAAAAAAAAA=",
      "DeletionMark": false,
      "Parent_Key": "00000000-0000-0000-0000-000000000000",
      "IsFolder": false,
      "Code": "ФР-0000002",
      "Description": "Абнагимова Ирина Витальевна",
      "ДатаРождения": "1947-08-05T00:00:00",
      "Пол": "Женский",
      "ИНН": "",
      "СтраховойНомерПФР": "",
      "Гражданство_Key": "00000000-0000-0000-0000-000000000000",
      "Недействителен": false,
      "БанковскийСчетПоУмолчанию_Key": "00000000-0000-0000-0000-000000000000",
      "КонтактнаяИнформация": [],
      "ДополнительныеРеквизиты": [],
      "Predefined": false,
      "PredefinedDataName": ""
    },
    {
      "Ref_Key": "baebad03-b80e-11e4-826f-001e101fe696",
      "DataVersion": "AAAAAAAAAAA=",
      "DeletionMark": false,
      "Parent_Key": "00000000-0000-0000-0000-000000000000",
      "IsFolder": false,
      "Code": "ФР-0000003",
      "Description": "Аввакумов Вадим Иванович",
      "ДатаРождения": "1966-06-04T00:00:00",
      "Пол": "Мужской",
      "ИНН": "",
      "СтраховойНомерПФР": "",
      "Гражданство_Key": "00000000-0000-0000-0000-000000000000",
      "Недействителен": false,
      "БанковскийСчетПоУмолчанию_Key": "00000000-0000-0000-0000-000000000000",
      "КонтактнаяИнформация": [],
      "ДополнительныеРеквизиты": [],
      "Predefined": false,
      "PredefinedDataName": ""
    }
  ]
}

6.2.3. Отбор отображаемых реквизитов

Пусть нас интересуют только ФИО, пол и дата рождения. Выведем первые 3 записи справочника ФизическиеЛица только с этими реквизитами. Для этого укажем в запросе параметры $top=3 и $select=Description,Пол,ДатаРождения. Введем GET-запрос:

GET ПрефиксURL/Catalog_ФизическиеЛица?$format=json&$top=3&$select=Description,Пол,ДатаРождения

Должен быть выдан примерно такой ответ:

{
  "odata.metadata": "https://1cfresh.com:443/a/sbm_demo/1962515/odata/standard.odata/$metadata#Catalog_ФизическиеЛица",
  "value": [
    {
      "Description": "Абнагимова Ирина Витальевна",
      "Пол": "Женский",
      "ДатаРождения": "1947-08-05T00:00:00"
    },
    {
      "Description": "Аввакумов Вадим Иванович",
      "Пол": "Мужской",
      "ДатаРождения": "1966-06-04T00:00:00"
    },
    {
      "Description": "Авдеев Александр Алексеевич",
      "Пол": "Мужской",
      "ДатаРождения": "1980-11-15T00:00:00"
    }
  ]
}

6.2.4. Отбор объектов

Пусть нас интересуют только сведения о мужчинах. Выведем ФИО и дату рождения для первых 3 записей справочника ФизическиеЛица, в которых Пол=’Мужской’. Для этого добавим в запрос параметр $filter=Пол eq ‘Мужской’:

GET ПрефиксURL/Catalog_ФизическиеЛица?$format=json&$top=3&$select=Description,ДатаРождения&$filter=Пол eq 'Мужской'

Должен быть выдан примерно такой ответ:

{
  "odata.metadata": "https://1cfresh.com:443/a/sbm_demo/1962515/odata/standard.odata/$metadata#Catalog_ФизическиеЛица",
  "value": [
    {
      "Description": "Аввакумов Вадим Иванович",
      "ДатаРождения": "1966-06-04T00:00:00"
    },
    {
      "Description": "Авдеев Александр Алексеевич",
      "ДатаРождения": "1980-11-15T00:00:00"
    },
    {
      "Description": "Александров Дмитрий Олегович",
      "ДатаРождения": "1977-08-04T00:00:00"
    }
  ]
}

6.2.5. Показ количества объектов, удовлетворяющих условиям отбора

Указав в запросе OData параметр $inlinecount=allpages, можно одновременно получить записи, удовлетворяющие условиям отбора, и общее количество таких записей.

Выведем ФИО и дату рождения для первых 3 записей справочника ФизическиеЛица, в которых Пол=’Мужской’, и получим общее количество записей, в которых Пол=’Мужской’. Введем запрос:

GET ПрефиксURL/Catalog_ФизическиеЛица?$format=json&$top=3&$select=Description,ДатаРождения&$filter=Пол eq 'Мужской'&$inlinecount=allpages

Должен быть выдан примерно такой ответ:

{
  "odata.metadata": "https://1cfresh.com:443/a/sbm_demo/1962515/odata/standard.odata/$metadata#Catalog_ФизическиеЛица",
  "odata.count": "28",
  "value": [
    {
      "Description": "Аввакумов Вадим Иванович",
      "ДатаРождения": "1987-06-04T00:00:00"
    },
    {
      "Description": "Авдеев Александр Алексеевич",
      "ДатаРождения": "1980-11-15T00:00:00"
    },
    {
      "Description": "Александров Дмитрий Олегович",
      "ДатаРождения": "1977-08-04T00:00:00"
    }
  ]
}

Как видно, ответ на запрос такой же, как в разделе 6.2.4, только добавилась строка:

"odata.count": "28",

Это означает, что условиям отбора удовлетворяют 28 записей. Обратите внимание, что в ответе показаны сведения лишь о трех записях, так как использован параметр $top=3.

6.2.6. Использование функций при отборе

В запросе OData, выдающем список, можно использовать функции (см. раздел 5.10):

  • при задании условий отбора (параметр $filter, см. раздел 5.7.1);
  • при задании порядка сортировки результатов (параметр $orderby, см. раздел 5.7.2).

Покажем пример использования функции при задании условий отбора. Выведем список наименований и артикулов первых трех записей справочника Номенклатура, в которых наименование начинается со строки ‘Таз’.

Для проверки будем использовать функцию startswith. Введем такой запрос:

GET ПрефиксURL/Catalog_Номенклатура?$format=json&$filter=startswith(НаименованиеПолное,'Таз')&$select=НаименованиеПолное,Артикул&$top=3

Должен быть выдан примерно такой ответ:

{
  "odata.metadata": "https://1cfresh.com:443/a/sbm_demo/1962515/odata/standard.odata/$metadata#Catalog_Номенклатура",
  "value": [
    {
      "НаименованиеПолное": "Таз пластмассовый овальный с ручками ("POBEDA"), 25 л",
      "Артикул": "8940"
    },
    {
      "НаименованиеПолное": "Таз пластмассовый овальный с ручками ("POBEDA"), 35 л",
      "Артикул": "8941"
    },
    {
      "НаименованиеПолное": "Таз пластмассовый овальный с ручками ("POBEDA"), 55 л",
      "Артикул": "8942"
    }
  ]
}

6.2.7. Раскрытие подчиненных объектов

Посмотрим, как устроена запись справочника Сотрудники:

GET ПрефиксURL/Catalog_Сотрудники?$format=json&$top=1

Должен быть выдан примерно такой ответ:

{
  "odata.metadata": "https://1cfresh.com:443/a/sbm_demo/1962515/odata/standard.odata/$metadata#Catalog_Сотрудники",
  "value": [
    {
      "Ref_Key": "baebacef-b80e-11e4-826f-001e101fe696",
      "DataVersion": "AAAAAAAAAAA=",
      "DeletionMark": false,
      "Parent_Key": "00000000-0000-0000-0000-000000000000",
      "IsFolder": false,
      "Code": "В-02",
      "Description": "Абнагимова Ирина Витальевна",
      "Физлицо_Key": "baebacee-b80e-11e4-826f-001e101fe696",
      "ТипЗанятости": "ОсновноеМестоРаботы",
      "СчетРасчетовСПерсоналом_Key": "60f112fb-b5b8-11e4-8355-74d02b7dfd8c",
      "СчетРасчетовСПодотчетниками_Key": "60f112fd-b5b8-11e4-8355-74d02b7dfd8c",
      "СчетРасчетовПоПерерасходу_Key": "60f112fe-b5b8-11e4-8355-74d02b7dfd8c",
      "Недействителен": false,
      "ШтрихКод": "",
      "МагнитныйКод": "",
      "ДополнительныеРеквизиты": [],
      "Predefined": false,
      "PredefinedDataName": "",
      "Физлицо@navigationLinkUrl": "Catalog_Сотрудники(guid'baebacef-b80e-11e4-826f-001e101fe696')/Физлицо",
      "СчетРасчетовСПерсоналом@navigationLinkUrl": "Catalog_Сотрудники(guid'baebacef-b80e-11e4-826f-001e101fe696')/СчетРасчетовСПерсоналом",
      "СчетРасчетовСПодотчетниками@navigationLinkUrl": "Catalog_Сотрудники(guid'baebacef-b80e-11e4-826f-001e101fe696')/СчетРасчетовСПодотчетниками",
      "СчетРасчетовПоПерерасходу@navigationLinkUrl": "Catalog_Сотрудники(guid'baebacef-b80e-11e4-826f-001e101fe696')/СчетРасчетовПоПерерасходу"
    }
  ]
}

Как видно, в этой записи есть реквизит Физлицо_Key. Это ссылка на запись справочника ФизическиеЛица. Попросим включить эту запись в ответ интерфейса OData. Для этого добавим к запросу параметр $expand=Физлицо. Введем запрос:

GET ПрефиксURL/Catalog_Сотрудники??$format=json&$top=1&$expand=Физлицо

Должен быть выдан примерно такой ответ:

{
  "odata.metadata": "https://1cfresh.com:443/a/sbm_demo/1962515/odata/standard.odata/$metadata#Catalog_Сотрудники",
  "value": [
    {
      "Ref_Key": "baebacef-b80e-11e4-826f-001e101fe696",
      "DataVersion": "AAAAAAAAAAA=",
      "DeletionMark": false,
      "Parent_Key": "00000000-0000-0000-0000-000000000000",
      "IsFolder": false,
      "Code": "В-02",
      "Description": "Абнагимова Ирина Витальевна",
      "Физлицо_Key": "baebacee-b80e-11e4-826f-001e101fe696",
      "ТипЗанятости": "ОсновноеМестоРаботы",
      "СчетРасчетовСПерсоналом_Key": "60f112fb-b5b8-11e4-8355-74d02b7dfd8c",
      "СчетРасчетовСПодотчетниками_Key": "60f112fd-b5b8-11e4-8355-74d02b7dfd8c",
      "СчетРасчетовПоПерерасходу_Key": "60f112fe-b5b8-11e4-8355-74d02b7dfd8c",
      "Недействителен": false,
      "ШтрихКод": "",
      "МагнитныйКод": "",
      "ДополнительныеРеквизиты": [],
      "Predefined": false,
      "PredefinedDataName": "",
      "Физлицо@navigationLinkUrl": "Catalog_Сотрудники(guid'baebacef-b80e-11e4-826f-001e101fe696')/Физлицо",
      "Физлицо": {
        "Parent_Key": "00000000-0000-0000-0000-000000000000",
        "Гражданство_Key": "00000000-0000-0000-0000-000000000000",
        "БанковскийСчетПоУмолчанию_Key": "00000000-0000-0000-0000-000000000000",
        "DeletionMark": false,
        "IsFolder": false,
        "DataVersion": "AAAAAAAAAAA=",
        "ИНН": "",
        "ДатаРождения": "1947-08-05T00:00:00",
        "Недействителен": false,
        "Predefined": false,
        "Ref_Key": "baebacee-b80e-11e4-826f-001e101fe696",
        "Code": "ФР-0000002",
        "Description": "Абнагимова Ирина Витальевна",
        "СтраховойНомерПФР": "",
        "Пол": "Женский",
        "КонтактнаяИнформация": [],
        "PredefinedDataName": "",
        "ДополнительныеРеквизиты": []
      },
      "СчетРасчетовСПерсоналом@navigationLinkUrl": "Catalog_Сотрудники(guid'baebacef-b80e-11e4-826f-001e101fe696')/СчетРасчетовСПерсоналом",
      "СчетРасчетовСПодотчетниками@navigationLinkUrl": "Catalog_Сотрудники(guid'baebacef-b80e-11e4-826f-001e101fe696')/СчетРасчетовСПодотчетниками",
      "СчетРасчетовПоПерерасходу@navigationLinkUrl": "Catalog_Сотрудники(guid'baebacef-b80e-11e4-826f-001e101fe696')/СчетРасчетовПоПерерасходу"
    }
  ]
}

6.2.8. Раскрытие подчиненных объектов и отбор отображаемых реквизитов

Пусть нам нужны только ФИО, код, тип занятости, дата рождения и пол сотрудника. Переформулируем запрос так, чтобы получать только эту информацию. Для этого добавим в запрос параметр:

$expand=Физлицо&$select=Description,Code,ТипЗанятости,Физлицо/Пол,Физлицо/ДатаРождения

Так как реквизиты Пол и ДатаРождения входят в подчиненный объект Физлицо, то они указываются в параметре $select как Физлицо/Пол и Физлицо/ДатаРождения. Получается следующий запрос:

GET ПрефиксURL/Catalog_Сотрудники?$format=json&$top=1&$expand=Физлицо&$select=Description,Code,ТипЗанятости,Физлицо/Пол,Физлицо/ДатаРождения

Должен быть выдан примерно такой ответ:

{
  "odata.metadata": "https://1cfresh.com:443/a/sbm_demo/1962515/odata/standard.odata/$metadata#Catalog_Сотрудники",
  "value": [
    {
      "Description": "Абнагимова Ирина Витальевна",
      "Code": "В-02",
      "ТипЗанятости": "ОсновноеМестоРаботы",
      "Физлицо@navigationLinkUrl": "Catalog_Сотрудники(guid'baebacef-b80e-11e4-826f-001e101fe696')/Физлицо",
      "Физлицо": {
        "Пол": "Женский",
        "ДатаРождения": "1947-08-05T00:00:00"
      }
    }
  ]
}

6.2.9. Сортировка результатов

Упорядочим записи справочника Сотрудники по реквизитам Тип занятости и Code, и выведем значения реквизитов Тип занятости, Code и Description для первых 3 записей упорядоченного списка. Для упорядочения записей в запросе нужно указать параметр $orderby=ТипЗанятости desc,Code:

GET ПрефиксURL/Catalog_Сотрудники?$format=json&$orderby=ТипЗанятости desc,Code&$select=Description,Code,ТипЗанятости&$top=3

Должен быть выдан примерно такой ответ:

{
  "odata.metadata": "https://1cfresh.com:443/a/sbm_demo/1962515/odata/standard.odata/$metadata#Catalog_Сотрудники",
  "value": [
    {
      "Description": "Администратор",
      "Code": "",
      "ТипЗанятости": "ОсновноеМестоРаботы"
    },
    {
      "Description": "Абдулов Юрий Владимирович",
      "Code": "В-01",
      "ТипЗанятости": "ОсновноеМестоРаботы"
    },
    {
      "Description": "Абнагимова Ирина Витальевна",
      "Code": "В-02",
      "ТипЗанятости": "ОсновноеМестоРаботы"
    }
  ]
}

6.2.10. Сортировка по полям подчиненного объекта

Пусть нам нужно получить сведения о сотрудниках, упорядоченные по полу, типу занятости и коду. Пол сотрудника хранится в подчиненном объекте Физлицо. Поэтому в запрос нужно включить:

  • параметр $expand=Физлицо, включающий в ответ содержимое объекта Физлицо, а не только ссылку на этот объект;
  • строку Физлицо/Пол в значения параметров $orderby и $select, чтобы сведения о поле сотрудника учитывались при сортировке результатов и выводились в результатах запроса.

Получается запрос следующего вида:

GET ПрефиксURL/Catalog_Сотрудники?$format=json&$expand=Физлицо&$select=Description,Code,ТипЗанятости,Физлицо/Пол&$orderby=Физлицо/Пол,Code,Description&$top=3

Должен быть выдан примерно такой ответ:

{
  "odata.metadata": "https://1cfresh.com:443/a/sbm_demo/1962515/odata/standard.odata/$metadata#Catalog_Сотрудники",
  "value": [
    {
      "Description": "Абдулов Юрий Владимирович",
      "Code": "В-01",
      "ТипЗанятости": "ОсновноеМестоРаботы",
      "Физлицо@navigationLinkUrl": "Catalog_Сотрудники(guid'b770ac08-b76d-11e4-be02-74d02b7dfd8c')/Физлицо",
      "Физлицо": {
        "Пол": "Мужской"
      }
    },
    {
      "Description": "Аввакумов Вадим Иванович",
      "Code": "В-04",
      "ТипЗанятости": "ОсновноеМестоРаботы",
      "Физлицо@navigationLinkUrl": "Catalog_Сотрудники(guid'baebacfa-b80e-11e4-826f-001e101fe696')/Физлицо",
      "Физлицо": {
        "Пол": "Мужской"
      }
    },
    {
      "Description": "Аввакумов Вадим Иванович",
      "Code": "В-05",
      "ТипЗанятости": "Совместительство",
      "Физлицо@navigationLinkUrl": "Catalog_Сотрудники(guid'baebad04-b80e-11e4-826f-001e101fe696')/Физлицо",
      "Физлицо": {
        "Пол": "Мужской"
      }
    }
  ]
}

6.3. Работа с отдельными объектами

С помощью стандартного интерфейса OData можно не только получать списки объектов, но также читать, изменять, создавать и удалять отдельные объекты. Покажем эти действия на примерах.

6.3.1. Получение записи

Получим запись справочника ФизическиеЛица с ключом baebad03-b80e-11e4-826f-001e101fe696:

GET ПрефиксURL/Catalog_ФизическиеЛица(guid'baebad03-b80e-11e4-826f-001e101fe696')?$format=json

Должен быть выдан примерно такой ответ:

{
  "odata.metadata": "https://1cfresh.com:443/a/sbm_demo/1962515/odata/standard.odata/$metadata#Catalog_ФизическиеЛица/@Element",
  "Гражданство_Key": "00000000-0000-0000-0000-000000000000",
  "КонтактнаяИнформация": [],
  "ДополнительныеРеквизиты": [],
  "БанковскийСчетПоУмолчанию_Key": "00000000-0000-0000-0000-000000000000",
  "Недействителен": false,
  "DeletionMark": false,
  "ДатаРождения": "1966-06-04T00:00:00",
  "Пол": "Мужской",
  "Ref_Key": "baebad03-b80e-11e4-826f-001e101fe696",
  "Description": "Аввакумов Вадим Иванович",
  "IsFolder": false,
  "PredefinedDataName": "",
  "DataVersion": "AAAAAAAAAAA=",
  "Code": "ФР-0000003",
  "Parent_Key": "00000000-0000-0000-0000-000000000000",
  "СтраховойНомерПФР": "",
  "ИНН": "",
  "Predefined": false
}

6.3.2. Чтение записи с отбором отображаемых реквизитов

Получим ту же запись справочника, но выведем только ФИО, пол и дату рождения. Для этого нужно добавить в запрос параметр $select=Description,Пол,ДатаРождения:

GET ПрефиксURL/Catalog_ФизическиеЛица(guid'baebad03-b80e-11e4-826f-001e101fe696')?$format=json&$select=Description,Пол,ДатаРождения

Должен быть выдан примерно такой ответ:

{
  "odata.metadata": "https://1cfresh.com:443/a/sbm_demo/1962515/odata/standard.odata/$metadata#Catalog_ФизическиеЛица/@Element",
  "Description": "Аввакумов Вадим Иванович",
  "ДатаРождения": "1966-06-04T00:00:00",
  "Пол": "Мужской"
}

6.3.3. Раскрытие подчиненных объектов и отбор отображаемых реквизитов

При получении одной записи справочника нельзя сразу же раскрыть содержимое подчиненных объектов с помощью оператора $expand. Как было сказано ранее, этот оператор применим только при получении списка элементов. Если требуется получить ФИО, код, тип занятости, дату рождения и пол конкретного сотрудника, то для этого придется выполнить два запроса. Первым запросом получаем ФИО, код, тип занятости сотрудника из записи справочника Сотрудники:

GET ПрефиксURL/Catalog_Сотрудники(guid'baebacfa-b80e-11e4-826f-001e101fe696')?$format=json&$select=Description,Code,ТипЗанятости

Должен быть выдан примерно такой ответ:

{
  "odata.metadata": "https://1cfresh.com:443/a/sbm_demo/1962515/odata/standard.odata/$metadata#Catalog_Сотрудники/@Element",
  "ТипЗанятости": "ОсновноеМестоРаботы",
  "Code": "В-04",
  "Description": "Аввакумов Вадим Иванович"
}

Вторым запросом получаем дату рождения и пол из подчиненного объекта Физлицо. Чтобы обратиться к подчиненному объекту, добавляем в URL после выбора записи справочника строку /Физлицо:

GET ПрефиксURL/Catalog_Сотрудники(guid'baebacef-b80e-11e4-826f-001e101fe696')/Физлицо?$format=json&$select=Пол,ДатаРождения

Должен быть выдан примерно такой ответ:

{
  "odata.metadata": "https://1cfresh.com:443/a/sbm_demo/1962515/odata/standard.odata/$metadata#Catalog_ФизическиеЛица/@Element",
  "Пол": "Мужской",
  "ДатаРождения": "1966-06-04T00:00:00"
}

6.3.4. Исправление данных

Исправим данные записи справочника ФизическиеЛица, которую мы получили в разделе 6.3.1. А именно, заменим значение ИНН на ‘772800173088’, а год рождения на 1987.

Для этого можно применить PATCH-запрос:

PATCH ПрефиксURL/Catalog_ФизическиеЛица(guid'baebad03-b80e-11e4-826f-001e101fe696')?$format=json

В теле этого запроса необходимо передать JSON-объект с исправленными данными:

{
    "ИНН": "772800173088",
    "ДатаРождения": "1987-06-04T00:00:00"
}

Должен быть выдан примерно такой ответ:

{
  "odata.metadata": "https://1cfresh.com:443/a/sbm_demo/1962515/odata/standard.odata/$metadata#Catalog_ФизическиеЛица/@Element",
  "DeletionMark": false,
  "ИНН": "772800173088",
  "Parent_Key": "00000000-0000-0000-0000-000000000000",
  "Code": "ФР-0000003",
  "БанковскийСчетПоУмолчанию_Key": "00000000-0000-0000-0000-000000000000",
  "Недействителен": false,
  "Predefined": false,
  "КонтактнаяИнформация": [],
  "ДополнительныеРеквизиты": [],
  "ДатаРождения": "1987-06-04T00:00:00",
  "Пол": "Мужской",
  "Description": "Аввакумов Вадим Иванович",
  "Гражданство_Key": "00000000-0000-0000-0000-000000000000",
  "IsFolder": false,
  "PredefinedDataName": "",
  "Ref_Key": "baebad03-b80e-11e4-826f-001e101fe696",
  "DataVersion": "AAAAAAAAAAE=",
  "СтраховойНомерПФР": ""
}

Как видно, результат запроса — это исправленная запись справочника ФизическиеЛица. Реквизиты ИНН и ДатаРождения в ней получили новые значения.

При желании можно вывести карточку этого физического лица в приложении (меню Персонал — Физические лица), и убедиться, что в карточке показаны исправленные значения реквизитов ИНН и Дата рождения.

6.3.5. Добавление

Добавим в справочник ФизическиеЛица новую запись. Для этого можно использовать POST-запрос:

POST ПрефиксURL/Catalog_ФизическиеЛица?$format=json

В теле этого запроса необходимо передать JSON-объект с данными записи справочника:

{
    "DeletionMark": false,
    "Parent_Key": "00000000-0000-0000-0000-000000000000",
    "IsFolder": false,
    "Code": "ФР-0000041",
    "Description": "Иванов Андрей Борисович",
    "ДатаРождения": "1992-12-13T00:00:00",
    "Пол": "Мужской",
    "ИНН": "772800192179",
    "СтраховойНомерПФР": "",
    "Гражданство_Key": "00000000-0000-0000-0000-000000000000",
    "Недействителен": false,
    "БанковскийСчетПоУмолчанию_Key": "00000000-0000-0000-0000-000000000000",
    "КонтактнаяИнформация": [],
    "ДополнительныеРеквизиты": [],
    "Predefined": false,
    "PredefinedDataName": ""
}

Как видно, здесь указаны те же реквизиты, которые получены при чтении записи справочника (см. раздел 6.3.1), только без служебных реквизитов odata.metadata, DataVersion и Ref_Key.

Должен быть выдан примерно такой ответ:

{
  "odata.metadata": "https://1cfresh.com:443/a/sbm_demo/1962515/odata/standard.odata/$metadata#Catalog_ФизическиеЛица/@Element",
  "Description": "Иванов Андрей Борисович",
  "ИНН": "772800192179",
  "ДатаРождения": "1992-12-13T00:00:00",
  "PredefinedDataName": "",
  "ДополнительныеРеквизиты": [],
  "DataVersion": "AAAAAAAAAAA=",
  "Ref_Key": "1683a3cc-44e5-11ed-8d7b-005056892602",
  "СтраховойНомерПФР": "",
  "Гражданство_Key": "00000000-0000-0000-0000-000000000000",
  "IsFolder": false,
  "КонтактнаяИнформация": [],
  "Predefined": false,
  "Пол": "Мужской",
  "БанковскийСчетПоУмолчанию_Key": "00000000-0000-0000-0000-000000000000",
  "Code": "ФР-0000041",
  "Parent_Key": "00000000-0000-0000-0000-000000000000",
  "DeletionMark": false,
  "Недействителен": false
}

Как видно, результат запроса содержит сведения о добавленной записи справочника ФизическиеЛица.

При желании можно вывести в приложении форму справочника ФизическиеЛица (меню Персонал — Физические лица) и убедиться, что в справочнике имеется добавленная запись.

6.3.6. Удаление

Удалим созданную запись из справочника ФизическиеЛица. Для этого можно использовать DELETE-запрос:

DELETE ПрефиксURL/Catalog_ФизическиеЛица(guid'1683a3cc-44e5-11ed-8d7b-005056892602')

В запросе указывается ключ (guid) той записи, которую нужно удалить.

Ответ на запрос будет с HTTP-кодом состояния 204 No content и пустым телом. При желании можно вывести в приложении форму справочника ФизическиеЛица и убедиться, что запись удалена из справочника.

Внимание. Следует иметь в виду, что при удалении объектов посредством стандартного интерфейса OData пометка на удаление не выполняется, а объект удаляется непосредственно.

6.4. Работа с табличными частями

Стандартный интерфейс OData содержит специальные средства для работы с табличными частями документов, справочников, задач и бизнес-процессов. Покажем их использование на примерах.

6.4.1. Отбор по значениям реквизитов табличных частей

Покажем пример применения функции any. Выведем список документов ЗаказПокупателя, в табличной части Запасы которых имеется хотя бы один товар с ценой большей 50000. В списке покажем только номера, даты и guid документов.

Отбор будет выполнен с помощью указания параметра $filter=Запасы/any(d: d/Цена gt 50000). Синтаксис функций all и any был объяснен в разделе 5.10.3.

Можно использовать следующий запрос:

GET ПрефиксURL/Document_ЗаказПокупателя?$format=json&$select=Number,Date,Ref_Key&$filter=Запасы/any(d: d/Цена gt 50000)

Должен быть выдан примерно такой ответ:

{
  "odata.metadata": "https://1cfresh.com:443/a/sbm_demo/1962515/odata/standard.odata/$metadata#Document_ЗаказПокупателя",
  "value": [
    {
      "Number": "АСФР-000068",
      "Date": "2017-08-14T12:00:00",
      "Ref_Key": "5977a565-4afc-11e5-808c-74d02b7dfd8c"
    },
    {
      "Number": "АСФР-000026",
      "Date": "2018-03-04T17:43:55",
      "Ref_Key": "e558b378-e040-11e5-9ef1-bcaec5b897eb"
    },
    {
      "Number": "АСФР-000030",
      "Date": "2018-03-18T10:45:53",
      "Ref_Key": "f1a6853a-e5c7-11e5-9ef1-bcaec5b897eb"
    },
    {
      "Number": "АСФР-000032",
      "Date": "2018-04-06T17:34:54",
      "Ref_Key": "f1a6855e-e5c7-11e5-9ef1-bcaec5b897eb"
    }
  ]
}

6.4.2. Чтение табличных частей

В OData-запросе можно вывести список табличных частей объектов. Предположим, что мы хотим получить список типов и представлений контактной информации для записей справочника Организации. Для этого можно использовать следующий запрос:

GET ПрефиксURL/Catalog_Организации_КонтактнаяИнформация/?$format=json&$top=5&$select=Тип,Представление

Здесь мы запросили сведения только о 5 первых строках табличных частей (параметр $top=5). Должен быть выдан примерно такой ответ:

{
  "odata.metadata": "https://1cfresh.com:443/a/sbm_demo/1962515/odata/standard.odata/$metadata#Catalog_Организации_КонтактнаяИнформация",
  "value": [
    {
      "Тип": "АдресЭлектроннойПочты",
      "Представление": "assol@mail.ru"
    },
    {
      "Тип": "АдресЭлектроннойПочты",
      "Представление": "sborka@mail.ru"
    },
    {
      "Тип": "Телефон",
      "Представление": "(495) 5552255, доб. 702"
    },
    {
      "Тип": "Телефон",
      "Представление": "(495) 502-77-55"
    },
    {
      "Тип": "Факс",
      "Представление": "(495) 5553322"
    }
  ]
}

Как видно, для обращения к строкам табличной части КонтактнаяИнформация справочника Организации используется обозначение Catalog_Организации_КонтактнаяИнформация.

6.4.3. Отбор строк табличных частей

В OData-запросе к табличной части можно задать условие отбора. Предположим, что мы заметили неточность в электронной почте assol@mail.ru. Получим все сведения строки табличной части, в которой указана эта электронная почта. Для этого можно использовать следующий запрос:

GET ПрефиксURL/Catalog_Организации_КонтактнаяИнформация/?$format=json&$filter=Представление eq 'assol@mail.ru'

Должен быть выдан примерно такой ответ:

{
  "odata.metadata": "https://1cfresh.com:443/a/sbm_demo/1962515/odata/standard.odata/$metadata#Catalog_Организации_КонтактнаяИнформация",
  "value": [
    {
      "Ref_Key": "6e3445bb-b5b8-11e4-8355-74d02b7dfd8c",
      "LineNumber": "2",
      "Тип": "АдресЭлектроннойПочты",
      "Вид_Key": "6e34475f-b5b8-11e4-8355-74d02b7dfd8c",
      "Представление": "assol@mail.ru",
      "ЗначенияПолей": "<КонтактнаяИнформация xmlns="http://www.v8.1c.ru/ssl/contactinfo" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Представление="assol@mail.ru"><Комментарий/><Состав xsi:type="ЭлектроннаяПочта" Значение="assol@mail.ru"/>",
      "Страна": "",
      "Регион": "",
      "Город": "",
      "АдресЭП": "assol@mail.ru",
      "ДоменноеИмяСервера": "mail.ru",
      "НомерТелефона": "",
      "НомерТелефонаБезКодов": "",
      "Значение": "",
      "ВидДляСписка_Key": "6e34475f-b5b8-11e4-8355-74d02b7dfd8c",
      "ДействуетС": "0001-01-01T00:00:00",
      "Вид@navigationLinkUrl": "Catalog_Организации_КонтактнаяИнформация(Ref_Key=guid'6e3445bb-b5b8-11e4-8355-74d02b7dfd8c', LineNumber=2)/Вид",
      "ВидДляСписка@navigationLinkUrl": "Catalog_Организации_КонтактнаяИнформация(Ref_Key=guid'6e3445bb-b5b8-11e4-8355-74d02b7dfd8c', LineNumber=2)/ВидДляСписка"
    }
  ]
}

6.4.4. Чтение табличной части объекта

Для показа табличной части объекта можно задать параметр $select=имя-табличной-части. Например, для показа табличной части Запасы документа Доверенность с guid 98043082-f588-11e5-98a6-bcaec5b897eb можно использовать следующий запрос:

GET ПрефиксURL/Document_Доверенность(guid'98043082-f588-11e5-98a6-bcaec5b897eb')/?$format=json&$select=Запасы

Должен быть выдан примерно такой ответ:

{
  "odata.metadata": "https://1cfresh.com:443/a/sbm_demo/1962515/odata/standard.odata/$metadata#Document_Доверенность/@Element",
  "Запасы": [
    {
      "LineNumber": "1",
      "НаименованиеТовара": "Ручка",
      "ЕдиницаИзмерения": "шт",
      "Количество": 1
    }
  ]
}

Другой способ — указать слеш / и имя табличной части после операции выбора объекта:

GET ПрефиксURL/Document_Доверенность(guid'98043082-f588-11e5-98a6-bcaec5b897eb')/Запасы?$format=json

Должен быть выдан примерно такой ответ:

{
  "odata.metadata": "https://1cfresh.com:443/a/sbm_demo/1962515/odata/standard.odata/$metadata#Collection(StandardODATA.Document_Доверенность_Запасы_RowType)",
  "value": [
    {
      "LineNumber": "1",
      "НаименованиеТовара": "Ручка",
      "ЕдиницаИзмерения": "шт",
      "Количество": 1
    }
  ]
}

6.4.5. Изменение табличной части

Для изменения табличной части объекта можно использовать PATCH-запрос для объекта, которому принадлежит табличная часть. Например, пусть в документе Доверенность, который мы читали в разделе 6.4.4, нужно изменить в первой строке табличной части количество на 10, и добавить строку табличной части с наименованием Стул и количеством 5. Для этого можно использовать следующий запрос:

PATCH ПрефиксURL/Document_Доверенность(Ref_Key=guid'98043082-f588-11e5-98a6-bcaec5b897eb')/?$format=json

В теле этого запроса необходимо передать JSON-объект с данными табличной части:

{
    "Запасы": [
        {
            "LineNumber": "1",
            "НаименованиеТовара": "Ручка",
            "ЕдиницаИзмерения": "шт",
            "Количество": 10
        },
        {
            "LineNumber": "2",
            "НаименованиеТовара": "Стул",
            "ЕдиницаИзмерения": "шт",
            "Количество": 5
        }
    ]
}

Заметим, что в PATCH-запросе нужно передать все данные табличной части, даже если меняется только один реквизит в одной строке.

В ответе будут выданы данные измененного документе Доверенность.

6.5. Применение методов

Для отдельных видов объектов предусмотрены методы, позволяющие выполнить действия с этими объектами (см. раздел 5.6.5). Покажем два примера:

  • проведение и отмена проведения документа;
  • применение среза первых для регистра сведений.

6.5.1. Проведение и отмена проведения документа

Покажем возможность проведения и отмены проведения документа на примере документа ЗаказПокупателя. Создадим в приложении заказ покупателя (пункт меню Продажи — Заказы покупателя), например, скопировав один из имеющихся заказов.

Установим для нового заказа состояние Обсуждение КП и заполним дату отгрузки, иначе приложение не позволит провести документ. Сохраним документ, нажав кнопку Записать (не Провести и закрыть).

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

Теперь узнаем guid созданного документа, введя запрос:

GET ПрефиксURL/Document_ЗаказПокупателя?$format=json&$orderby=Date desc&$top=1&$select=Ref_Key,Number,Date,Posted

Здесь мы сортируем сведения о документах по убыванию даты (параметр $orderby=Date desc), запрашиваем вывод сведений только об одном документе (параметр $top=1) и просим вывести только значения реквизитов Ref_Key, Number, Date и Posted.

Должен быть выдан примерно такой ответ:

{
  "odata.metadata": "https://1cfresh.com:443/a/sbm_demo/1962515/odata/standard.odata/$metadata#Document_ЗаказПокупателя",
  "value": [
    {
      "Ref_Key": "f3f4dc08-4553-11ed-8d7b-005056892602",
      "Number": "АСФР-000112",
      "Date": "2022-10-06T11:50:38",
      "Posted": false
    }
  ]
}

Как видно, последний заказ покупателя имеет ключ f3f4dc08-4553-11ed-8d7b-005056892602, и документ не проведен («Posted»: false).

Проведем этот документ, применив к нему метод Post():

POST ПрефиксURL/Document_ЗаказПокупателя(guid'f3f4dc08-4553-11ed-8d7b-005056892602')/Post()

Ответ на запрос будет содержать HTTP-код состояния 200 OK и пустое тело ответа.

Проверим свойства документа. Это можно сделать с помощью приведенного выше GET-запроса. Увидим, что документ проведен («Posted»: true). Также можно обновить в приложении список заказов покупателей и увидеть, что значок заказа содержит галочку, обозначающую, что документ проведен.

При желании можно отменить проведение документа, применив к нему метод Unpost():

POST ПрефиксURL/Document_ЗаказПокупателя(guid'f3f4dc08-4553-11ed-8d7b-005056892602')/Unpost()

Следует иметь в виду, что приложение может, исходя из своей бизнес-логики, отказать в проведении или отмене проведения документа. В этом случае на OData-запрос будет выдан ответ с HTTP-кодом состояния 500. Причину ошибки можно узнать, попробовав провести или отменить проведение документа интерактивно в приложении:

6.5.2. Срез первых для периодического регистра сведений

Покажем применение метода SliceFirst для вывода курса валюты на указанную дату. Формат вызова этого метода: SliceFirst(Period=дата, Condition=’строка-условия‘).

Курсы валют хранятся в периодическом регистре сведений КурсыВалют. Чтобы найти курс валюты USD (доллара США), введем запрос:

GET ПрефиксURL/InformationRegister_КурсыВалют/SliceFirst(Period=datetime'2022-09-30T00:00:00', Condition='Валюта/Description eq 'USD')?$format=json&$expand=Валюта&$select=Курс,Period

Здесь в ответе на OData-запрос раскрывается вложенный объект Валюта и накладывается условие, что значение реквизита Description этого объекта равно USD. Параметр $select=Курс,Period означает, что в ответе нужно вывести только значения реквизитов Курс и Period.

Должен быть выдан примерно такой ответ:

{
  "odata.metadata": "https://1cfresh.com:443/a/sbm_demo/1962515/odata/standard.odata/$metadata#InformationRegister_КурсыВалют",
  "value": [
    {
      "Курс": 57.413,
      "Period": "2022-09-30T00:00:00"
    }
  ]
}

Таким образом, значение курса валюты USD на 30 сентября 2022 г. — 57.413.


См. также:

@devig, сложно сказать, ведь обязательные поля при создании какого-либо объекта всегда индивидуальны для используемой конфигурации 1С. Привожу пример создания заказа для УТ 11:

$odata = array (
  'Number' => 'ORDER-NB-128938',
  'Date' => '2019-05-15T09:27:51+03:00',
  'ЖелаемаяДатаОтгрузки' => '2019-05-15T00:00:00+03:00',
  'ДатаОтгрузки' => '2019-05-15T00:00:00+03:00',
  'Организация_Key' => '2b3e8ebe-c1c2-11e6-d495-00155dd9fc47',
  'Партнер_Key' => '473eac84-c1b3-11e6-3b95-00155dd9fc47',
  'Контрагент_Key' => '335e9bcc-76ea-11e9-ce91-4110cd835450',
  'Соглашение_Key' => 'd8e27e68-c370-11e6-d495-00155dd9fc47',
  'Сделка_Key' => '00000000-0000-0000-0000-000000000000',
  'Валюта_Key' => 'ec4378f4-c1b3-11e6-3b95-00155dd9fc47',
  'СуммаДокумента' => 28990.0,
  'ГрафикОплаты_Key' => '00000000-0000-0000-0000-000000000000',
  'Склад_Key' => '4a1b565a-c1c2-11e6-d495-00155dd9fc47',
  'Менеджер_Key' => '3df9babc-1042-11e9-2580-3561ecf9b9a1',
  'НеОтгружатьЧастями' => true,
  'Статус' => 'КОбеспечению',
  'МаксимальныйКодСтроки' => 2,
  'ПорядокОплаты' => 'РасчетыВРубляхОплатаВРублях',
  'ЭтапыГрафикаОплаты' => 
  array (
    0 => 
    array (
      'LineNumber' => '1',
      'ВариантОплаты' => 'КредитПослеОтгрузки',
      'ДатаПлатежа' => '2019-05-15T00:00:00+03:00',
      'ПроцентПлатежа' => 100,
      'СуммаПлатежа' => 28990.0,
      'ПроцентЗалогаЗаТару' => 0,
      'СуммаЗалогаЗаТару' => 0,
    ),
  ),
  'Товары' => 
  array (
    0 => 
    array (
      'LineNumber' => 1,
      'КодСтроки' => 1,
      'ДатаОтгрузки' => '2019-05-15T00:00:00+03:00',
      'Номенклатура_Key' => '40366f94-cded-11e6-e880-00155dd9fc47',
      'Характеристика_Key' => '00000000-0000-0000-0000-000000000000',
      'Упаковка_Key' => '00000000-0000-0000-0000-000000000000',
      'КоличествоУпаковок' => '1',
      'Содержание' => 'Куртка пух муж BASK TAIMYR',
      'Количество' => '1',
      'ВидЦены' => 'b9bb5abe-c370-11e6-d495-00155dd9fc47',
      'СтавкаНДС' => 'БезНДС',
      'СуммаНДС' => 0,
      'Цена' => '28990',
      'Сумма' => 28990.0,
      'СуммаСНДС' => 28990.0,
      'ПроцентРучнойСкидки' => '0',
      'СуммаРучнойСкидки' => '0.00',
      'Склад_Key' => '4a1b565a-c1c2-11e6-d495-00155dd9fc47',
      'ВариантОбеспечения' => 'Отгрузить',
    ),
    1 => 
    array (
      'LineNumber' => 2,
      'КодСтроки' => 2,
      'ДатаОтгрузки' => '2019-05-15T00:00:00+03:00',
      'Номенклатура_Key' => '0bb4403c-d0f6-11e6-2786-00155dd9fc47',
      'Характеристика_Key' => '00000000-0000-0000-0000-000000000000',
      'Упаковка_Key' => '00000000-0000-0000-0000-000000000000',
      'КоличествоУпаковок' => 1,
      'Количество' => 1,
      'ВидЦены' => '00000000-0000-0000-0000-000000000000',
      'СтавкаНДС' => 'БезНДС',
      'СуммаНДС' => 0,
      'Цена' => '0',
      'ПроцентРучнойСкидки' => 0,
      'СуммаРучнойСкидки' => 0,
      'Сумма' => 0,
      'СуммаСНДС' => 0,
      'ВариантОбеспечения' => 'Отгрузить',
      'Содержание' => 'Самовывоз',
    ),
  ),
);
$data = $client->{'Document_ЗаказКлиента'}->create($odata);
if(!$client->isOk()) {
    var_dump($id,$odata,$client->getErrorCode(),$client->getErrorMessage());
    return false;
} else {
    if(!$id) $id = $client->getLastId();
    ...
}
Я тоже хотел бы это видеть в ИР

Но сразу расскажу один секрет, который в подобных обработках не обрабатывается ни как  tongue  :

Сейчас по протоколу OData не работают внешние источники данных! Т.е. если у вас в справочнике/документе/регистре/и т.п. есть реквизит, который является ссылкой внешнего источника данных, то включив его в OData интерфейс и попытавшись запросить данные, через HTTP, то в ответ придёт ошибка HTTP 500.

Например у нас в ERP 2 справочник Контрагентов содержал реквизит «Customer» тип которого «ВнешнийИсточникДанныхТаблицаСсылка.ХХХ.dbo_Customer» (связь с контрагентами, созданными в других системах (SAP, Lotus)). Мы этот справочник включили в OData интерфейс. Попытались запросить из него данные (например используя Telerik Fiddler Web Debugger) получаем:

Код

HTTP/1.1 500 Internal server error
Content-Length: 334
Content-Type: application/xml;charset=utf-8
Server: Microsoft-IIS/7.5
DataServiceVersion: 3.0
X-Powered-By: ASP.NET

<m:error xmlns:m=»http://schemas.microsoft.com/ado/2007/08/dataservices/metadata»>
   <m:code>-1</m:code>
   <m:message>Произошла внутренняя ошибка OData сервиса. Дополнительные сведения можно найти в технологическом журнале.</m:message>
</m:error>

1С 8.3 редакция 3.0 Делаю интеграцию сайта с 1С через Odata в формате json. Контрагентов создал успешно. При создании акта возникла проблема: акт создал, далее пытаюсь заполнить табличную часть. Отправляю запрос на добавление одной строки, а мне в ответ: { «value»: «Cоздание строк табличной части напрямую не поддерживается» } } } Через odata в json нельзя добавить строки?

Какое из написанных слов тебе непонятно?

Непонятно как тогда добавить строки

Покажи формирование запроса

/odata/standard.odata/Document_ПоступлениеТоваровУслуг?$format=application/jsonArray /odata/standard.odata/Document_ПоступлениеТоваровУслуг_Услуги?$format=application/jsonArray Видимо так нельзя потому что 1с-у надо что то пересчитать при добавлении строк… ((

Используй ПАТЧ-запрос, передавая всю ТЧ целиком

1. Делаю POST запрос на создание акта. 2. Методом PATCH по guid редактирую его с такими данными /odata/standard.odata/Document_ПоступлениеТоваровУслуг(guid’01d22eff-f1d2-11e6-8da2-50e549a0019a’)?$format=application/json Array (     [Услуги] => Array                 )                 )         ) ) Получаю ошибку: resulted in a `500 Internal server error` response Я правильно обновляю акт?

«lang»: «ru», «value»: «Произошла внутренняя ошибка OData сервиса. Дополнительные сведения можно найти в технологическом журнале.» } } } К сожалению, нет возможности этот журнал посмотреть, мне кажется, что я неправильно json запрос формирую.

Есть где нибудь документация? какие поля обязательные, какие нет, думаю что дело в полях

«кажется, что я неправильно json запрос формирую» «Есть где нибудь документация?» ИТС тебе в помощь:

Cyberhawk, спасибо за ссылку, доступа нет у меня туда, распечатали всю 17 главу мне ). А проблема была вот в чем. В каждой услуге надо было поставить поле LineNumber. Как его поставил, 500 ошибка пропала. Потом появилась следующая ошибка: данные шапки менялись, а услуги не добавлялись. Проблема решилась так: Добавил поле в шапку ВидОперации = «Услуги».

«доступа нет у меня туда» // Там есть демо-доступ

Кстати, если правильно сформировать json сразу, то POST-ом все прекрасно записывается =)

Код-то выкладывай потомкам не память

Код на php, написан свой клиент небольшой, ну все элементарно: генерация url, да отправка на него json-а. В качестве http клиента используется Guzzle. Основные методы: /** * @param string $method1C Метод в 1С, например «Document_ПоступлениеТоваровУслуг» * @param array  $data     Массив данных который надо отправить в 1C * @param string $method   HTTP метод * @param null   $guid     ID сущности в 1C * @param array  $params   Фильтры */ public function sendData($method1C, $data, $method = ‘GET’, $guid = null, array $params = [])         throw new RequestException($ex->getResponse->getBody->getContents);     } */ private function getUrl($method, array $params = []) } Минимальные данные для создания акта с услугами в табличной части /odata/standard.odata/Document_ПоступлениеТоваровУслуг?$format=application/json Array [                 ]                 ]         ]     [ВидОперации] => Услуги ]

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

  • 1h 563 ошибка будерус logano
  • 1f4a08 ошибка бмв f10
  • 1f2802 ошибка bmw 7
  • 1f0530 bmw ошибка f30
  • 1f0515 ошибка бмв f20