@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(); ... }
В этой статье рассказывается об использовании стандартного интерфейса 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-сервиса, позволяющая:
- Создать служебного пользователя, от имени которого может вызываться интерфейс OData.
- Настроить состав объектов приложения, которые будут доступны через интерфейс 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. В нем мы будем использовать демонстрационное приложение Управление нашей фирмой. В нем нужно:
- Включить валютный учет (Настройки — Еще больше возможностей —Деньги —установить флажок Несколько валют.
- Добавить валюту Доллар США (Деньги —Валюты), включив для нее режим установки курса загружается из Интернета.
-
В обработке Настройка автоматического 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.
См. также:
Kudryashka
26.01.19
✎
15:18
Доброго времени суток
База 8 на обычных формах самописка, написала http-сервис, настроила апач 2.4 на своем компе, затем внедрила клиенту, все это работает уже несколько месяцев. Другой клиент на такой же базе тоже захотел себе такую функцию. Я загрузила себе его базу, скопировала наработки, которые работают на первой, только поменяла код в сервисе, все точно так же настроила, но сервис возвращает ошибку:
HTTP/1.1 500 Internal server error
Ошибка инициализации библиотеки модулей
Я подумала что ошибка в коде сервиса, включила отладку, но отладка в сервис не заходит. Тогда я убрала весь код из сервиса, оставила только две строки:
Ответ = Новый HTTPСервисОтвет(200);
Возврат Ответ;
Все. Ошибки в коде отсутствуют как класс. Должно возвращать 200, но отладка опять не заходит и возвращает 500. Проверила все пути, шаблоны, инициализацию. И апач и база на одном компе, я обращаюсь через 127.0.0.1 или localhost. Порт правильный. Авторизация проходит, идет дальше, отправляет обычний жсончик, я вижу его во временных файлах, но сервер отпуливает и все тут. Ошибка инициализации библиотеки модулей наводит на мысль что не хватает каких-то длл. Я проверила каталог C:\Program Files (x86)\1cv8\8.3.10.2667\bin, там имеются файлы wsap24.dll и wsisapi.dll. Параллельно запустила ту базу, которую настраивала ранее, такую же, она работает. на этом же самом компе, на этой же платформе и с этим же апачем.
Помогите пожалуйста, у меня уже кончились идеи, я не знаю что уже проверить, пните меня в нужном направлении, скажите что еще можно проверить, третий день бьюсь с этим…
После каждой манипуляции перепубликовывала базу и перезапускала апач.
Задавайте вопросы, может не все описала, я на все отвечу.
Anarki
26.01.19
✎
15:29
Если Postmanом послать запрос что возвращает?
Kudryashka
26.01.19
✎
15:36
Я для проверки сервиса использую обработку, которая отправляет запрос. ранее всегда использовала ее, в ней не сомневаюсь, вот через нее я и получаю 500. я проверяла Telerik-ом запрос-ответ, и то, что я там увидела — сюда скопировала.
вот подробнее его «расшифровка»
POST http://127.0.0.1:2018/StatusVagSever/hs/StatusVag/PostDepozit HTTP/1.1
Host: 127.0.0.1:2018
Proxy-Authorization: NTLM TlRMTVNTUAABAAAAB7IIogkACQAuAAAABgAGACgAAAAGAbEdAAAAD09MR0FOQldPUktHUk9VUA==
Authorization: Basic MTExOjExMQ==
User-Agent: 1C+Enterprise/8.3
Accept: */*
Connection: Keep-Alive
Content-Type: application/json; charset=utf-8
Content-Length: 32
{
«bin»: «120140000000»
}
HTTP/1.1 500 Internal server error
Date: Fri, 25 Jan 2019 15:36:45 GMT
Server: Apache/2.4.34 (Win32) OpenSSL/1.1.0i PHP/7.2.10
Content-Length: 78
Connection: close
Content-Type: text/plain; charset=UTF-8
Ошибка инициализации библиотеки модулей
Kudryashka
26.01.19
✎
15:38
Если я открываю ссылку, то у меня в браузере открывается пустая 1с, запрашивает логин пароль, то есть в браузере открывается пустая управляемая форма, что нормально, т.к. формы обычные. Это лишь говорит о том, что публикация прошла нормально и работает.
Anarki
26.01.19
✎
15:48
Антивирусы, файрволы? На одной машине клиент и сервер тестирование проводится?
Kudryashka
26.01.19
✎
15:51
(4) антивирус уже поставили другой. второй вопрос не очень поняла. все происходит на одной машине. причем другая база работает, это больше всего убивает, если она работает, значит ни причем ни антивирусы, ни платформа, ни апач… дело в самой второй базе, но что именно, я не могу понять.
Kudryashka
26.01.19
✎
15:56
Причем она не работает ни у меня ни у клиента. Ладно у клиента, там все с нуля поднималось, апач, веб-сервисы у платформы, обращение к другой машине и все такое… там не работало, я забрала к себе разбираться. И у меня не работает! Но у меня-то все давно настроено, поднято уже, машина одна, локальная, только базу загрузила еще одну и она не работает.
Kudryashka
26.01.19
✎
15:58
вот этот код в сервисе только правильный? его точно достаточно? что-то я уже начала сомневаться. Уже не знаю что и думать.
Посмотрите
Ответ = Новый HTTPСервисОтвет(200);
Возврат Ответ;
По идее должно быть достаточно…
Kudryashka
26.01.19
✎
16:04
а как сюда скриншоты отправить? как-то ни разу не приходилось именно сюда отправлять картинки. я хотела показать настройки.
palsergeich
26.01.19
✎
16:22
(8) ссылкой на любой хостнг картинок
Kudryashka
26.01.19
✎
16:36
Kudryashka
26.01.19
✎
16:40
Ну вроде всю информацию предоставила. Что может быть не так? Чего ему не нравится? Помогите пожалуйста…..
Kudryashka
26.01.19
✎
16:49
Обработкой обращаюсь так:
HTTP = Новый HTTPСоединение(«127.0.0.1″,2018,»111″,»111»,,,,Ложь);
……..
ЗаголовокЗапросаHTTP.Вставить(«Content-Length», РазмерФайлаНаОтправку);
ЗаголовокЗапросаHTTP.Вставить(«Content-Type», «application/json; charset=utf-8»);
ЗапросHTTP = Новый HTTPЗапрос(«/StatusVagSever/hs/StatusVag/PostDepozit», ЗаголовокЗапросаHTTP);
Kudryashka
26.01.19
✎
16:50
уже пользователя создала такого чтобы исключить неправильное написание. права у пользователя есть, это точно. все права стоят.
Юрий Лазаренко
26.01.19
✎
16:59
(0) «настроила апач 2.4»
«проверила каталог C:\Program Files (x86)»
Апач 64 бита, платформа 32 бита?
Kudryashka
26.01.19
✎
17:01
(14) платформа 32 и апач 32
Kudryashka
26.01.19
✎
17:02
с другой базой на этой же платформе апач работает. Я это повторяю потому что возможно это наведет на какие-то мысли, либо отбросит какие-то вопросы. Может проще будет найти ошибку, имея эту информацию…
Юрий Лазаренко
26.01.19
✎
17:05
(16) Надо проверить общие модули конфигурации на ошибки (Ctrl+F7). Чаще всего http-сервисы не стартуют именно по этой причине.
В журнале регистрации есть ошибки после попытки подключиться к сервису?
Мимохожий Однако
26.01.19
✎
17:07
В порядки эксперимента залей новую базу взамен рабочей, если это возможно. Может быть, у тебя апач только с одной базой настроен.
Kudryashka
26.01.19
✎
17:13
(17) в журнале регистрации ошибки не пишет. пишет две строки: аутентификация и начало. в общих модулях были ошибки, просто эти модули не использовались, я это все убрала, но один фиг 500 возвращает.
Kudryashka
26.01.19
✎
17:15
(18) а как он может быть настроен с одной базой? Это возможно? каталоги в htdocs разные у них. Причем что я и ранее делала различные сервисы на других базах (а не только в этих двух), и для них тоже есть свои каталоги в htdocs. И сейчас рабочая база вообще закрыта.
Kudryashka
26.01.19
✎
21:45
нет идей?(
palsergeich
26.01.19
✎
21:47
Проверь еще права на папки у апача, на всякий
palsergeich
26.01.19
✎
21:47
И зайди глянь лог аппача
palsergeich
26.01.19
✎
21:51
И самое важное — Когда получаете ответ с кодом 500 сделайте ПолучитьТелоКакСтроку() — очень часто там диагностика по ошибке приходит
Kudryashka
26.01.19
✎
21:59
(23) логи смотрела я.. и эррор и акцесс. в момент посылания зароса в эррор ничего не пишет.
зато в акцессах он радостно сообщает как меня пнул
127.0.0.1 — — [26/Jan/2019:23:58:20 +0500] «POST /StatusVagSever/hs/StatusVagSever/PostDepozit HTTP/1.1» 500 78 «-» «1C+Enterprise/8.3»
Kudryashka
26.01.19
✎
22:01
(24) где сделать? в каком месте и в какой момент? можно поподробнее? ну диагностика скорее всего будет гласить ошибка инициализации библиотеки модулей. или он что-то еще мне скажет интересного?
Kudryashka
26.01.19
✎
22:04
(22) даже не знаю как сказать, как будто бы стоит только чтение, снимаю галку, сохраняю, открываю опять стоит. НО другая база работает, вот в чем дело…
Kudryashka
26.01.19
✎
22:05
может чего-то где-то зарегистрировать надо? какую-нить длл-ку… для разнообразия так сказать…
palsergeich
26.01.19
✎
22:05
(2) Сорри — тут вы уже все сделали. Отбой. (27) Там же на каждую публикацию отдельная папка
palsergeich
26.01.19
✎
22:06
(28) Не, апач 2.4 ничего не требует кроме переменной среды, а она у Вас стоит, иначе не работало бы вообще
palsergeich
26.01.19
✎
22:07
Я даже не знаю. (17) делали?
etc
26.01.19
✎
22:07
покажи строку конфига LoadModule.
Kudryashka
26.01.19
✎
22:08
(29) Там же на каждую публикацию отдельная папка — ааа. вы про это. ну стоит вроде как галка только чтение, но она также стоит и у той рабочей базы. я опять же снимаю, а она ставится. не знаю, чето мне кажется не в этом дело…
Я уже задолбала со второй базой, которая работает, но что я могу поделать….
Kudryashka
26.01.19
✎
22:08
(31) да, делала
etc
26.01.19
✎
22:08
имею ввиду конфига апача.
ну и блок где указывается vrd файл
Kudryashka
26.01.19
✎
22:10
(35) я извиняюсь… а где все это искать? блин раньше не приходилось там где-то копаться глубоко….
etc
26.01.19
✎
22:11
или давай с другого конца. под каким пользователем запускается апач?
Kudryashka
26.01.19
✎
22:12
(37) подо мной. у меня админские права. это мой домашний комп, я уж себя не обделяю в правах)
etc
26.01.19
✎
22:12
Тоесть на закладке «Вход в систему» у сервиса указана ты, верно?
Kudryashka
26.01.19
✎
22:13
(39) я посмотрела в диспетчере задач под кем он работает…
etc
26.01.19
✎
22:17
В папке C:\xampp\apache\conf есть файлик httpd.conf
В нем должна быть строка LoadModule _1cvs_module <путь к dll> что в ней?
Kudryashka
26.01.19
✎
22:18
почему он говорит «Ошибка инициализации библиотеки модулей» ?
обычно такое на нехватку длл? или я ошибаюсь?
Kudryashka
26.01.19
✎
22:18
(41) а, это я уже смотрела, щас еще раз открою и скопирую.
Kudryashka
26.01.19
✎
22:19
(41) LoadModule _1cws_module «C:/Program Files (x86)/1cv8/8.3.10.2667/bin/wsap24.dll»
база открыта именно на этой платформе.
Kudryashka
26.01.19
✎
22:20
1С:Предприятие 8.3 (8.3.10.2667) — скопировала на всякий случай.
Kudryashka
26.01.19
✎
22:21
а вот блок публикации, как просили
# 1c publication
Alias «/StatusVagSever» «C:/xampp/htdocs/StatusVagSever/»
<Directory «C:/xampp/htdocs/StatusVagSever/»>
AllowOverride All
Options None
Require all granted
SetHandler 1c-application
ManagedApplicationDescriptor «C:/xampp/htdocs/StatusVagSever/default.vrd»
</Directory>
etc
26.01.19
✎
22:22
Странно всё это. Судя по тому что ошибка на русском то выдает её именно платформа 1С. Тоесть 1C-ка не может какието свои библиотеки подтянуть.
Kudryashka
26.01.19
✎
22:23
я тут в начале топика в запросе указываю в ссылке корневой каталог StatusVag, а далее идет корневой каталог StatusVagSever (ну, вдруг кто-то заметит и подумает что ошибка тут), это я просто уже чисто поржать поменяла корневой каталог, это не ошибка….
Kudryashka
26.01.19
✎
22:23
(47) а что делать теперь?
palsergeich
26.01.19
✎
22:25
Самый тупой вопрос.
Сервер приложений ребутала?
Службу апача?
Kudryashka
26.01.19
✎
22:26
(50) после каждой манипуляции. там в (0) я писала это…
Kudryashka
26.01.19
✎
22:28
ну блин тут какая-то тупая ошибка на поверхности лежит, как обычно. а я ее не вижу….
Kudryashka
26.01.19
✎
22:30
посмотрите (7)
etc
26.01.19
✎
22:38
отладчик говоришь не работает?
Kudryashka
26.01.19
✎
22:39
(54) неа. не заходит туда… ну там код правильный в сервисе?
Kudryashka
26.01.19
✎
22:41
посмотрела щас настройки отладки, почему-то слетели, будто и не выставляла. снова выставила, один фиг не заходит.
Kudryashka
26.01.19
✎
22:42
может потому что я корневой каталог поменяла? могли они из-за этого сброситься?
etc
26.01.19
✎
22:42
Имя базы в vrd файлике должно с точностью до регистра совпадать с именем базы при запуске конфигуратора.
etc
26.01.19
✎
22:42
иногда из за этого отладчик не работает
etc
26.01.19
✎
22:43
А ошибка может быть и в модуле сеанса. Он первым отрабатывает.
Kudryashka
26.01.19
✎
22:44
<service name=»StatusVagSever» (58) это?
Kudryashka
26.01.19
✎
22:46
(60) модуль сеанса отлаживается, там все нормально.
что еще можно посмотреть?
etc
26.01.19
✎
22:46
нет, тут смотри:
<Point ….. base=»/crm» ib=»Srvr="srv";Ref="crm";» enable=»false»>
Kudryashka
26.01.19
✎
22:48
хе!
etc
26.01.19
✎
22:49
Если модуль сеанса отлаживается значит вероятно ошибка при компиляции одного из общих модулей (или самого модуля веб-сервиса). Поэтому отладчик в функции ничего не ловит а модуль сеанса проскакивает.
palsergeich
26.01.19
✎
22:50
(65) Кстати да. Модуль сеанса — управление перешлов 1с.
Попробуй отладчиком идки пока не выкинет.
На одном из формуов видел — у модуля не было нужной директивы компиляции
Kudryashka
26.01.19
✎
22:54
(63) короче тут такое дело… база лежить в папке 1С, С там русская. а в врд-шке вместо буквы С указана какая-то кракозябла. я залезда в врд рабочей базы, там нормальная стоит 1С. ну я перенесла свою проблемную базу в другой каталог (да прям в корень) и сама база называется латиницей, перепубликовала, перезапустила, один фиг 500 блин…..
Kudryashka
26.01.19
✎
22:58
(65) модуль веб-сервиса я написала в (7), посмотрите, там все нормально? я убрала тот модуль что мне нужен с целью отладки вообще системы
Kudryashka
26.01.19
✎
23:00
а проверку общих модулей я сделала как сказали в (17)
etc
26.01.19
✎
23:01
Надо техжурнал включать. Может в нем чтото увидим.
palsergeich
26.01.19
✎
23:01
(68) Да все норм, стандартный ответ.
etc
26.01.19
✎
23:03
Знаешь как техжурнал включать?
palsergeich
26.01.19
✎
23:03
Kudryashka
26.01.19
✎
23:32
Знаете, сидела сравнивала щас две врд-шки, в «нерабочей» есть такой тег: <standardOdata enable=»true»
reuseSessions=»autouse»
sessionMaxAge=»20″
poolSize=»10″
poolTimeout=»5″/>
а в «рабочей» его нет
etc
26.01.19
✎
23:35
(74) ну так убрать публикацию OData пять секунд. Проверь и посмотри.
Kudryashka
26.01.19
✎
23:39
(74) да нет, это не то….
а насчет техжурнала.. это мне время нужно чтобы разобраться, это уже завтра. а то у нас почти 2 ночи. лежит блин курс Гилева «оптимизация» и все никак руки не дойдут, как всегда. щас бы пригодилось….
и еще что примечательно.. в «рабочей» врд-шке путь на русском и даже название базы, и все работает блин!
а тут…
etc
26.01.19
✎
23:44
(76) С техжурналом просто, положить один файлик в папку conf на сервере приложений (я так понимаю он у тебя на компе локально), обратиться к веб-сервису и посмотреть что в нем записалось.
Kudryashka
26.01.19
✎
23:45
(77) а какой файлик?
etc
26.01.19
✎
23:46
5 сек.
etc
26.01.19
✎
23:46
выбери папку в которую логи будут складываться
Kudryashka
26.01.19
✎
23:47
ага
etc
26.01.19
✎
23:49
<?xml version=»1.0″ encoding=»UTF-8″?>
<config xmlns=»http://v8.1c.ru/v8/tech-log»>;
<dump create=»false» type=»3″/>
<log history=»72″ location=»C:\logs»>
<event>
<ne property=»name» value=»EXCP»/>
</event>
<property name=»all»/>
</log>
</config>
назвать logcfg.xml
etc
26.01.19
✎
23:50
в теге location поменяй путь на свой
etc
26.01.19
✎
23:51
стоп, файлик с ошибкой
Kudryashka
26.01.19
✎
23:51
(82) и куда положить? конкретно.
etc
26.01.19
✎
23:53
В C:\Program Files (x86)\1cv8\8.3.10.2667\bin\conf
правильный файл:
<?xml version=»1.0″ encoding=»UTF-8″?>
<config xmlns=»http://v8.1c.ru/v8/tech-log»>;;
<dump create=»false» type=»3″/>
<log history=»72″ location=»C:\logs»>
<event>
<ne property=»name» value=»»/>
</event>
<property name=»all»/>
</log>
</config>
Kudryashka
26.01.19
✎
23:55
должно что-то в логи упасть? ничего не упало.. я что-то не так сделала? путь поменяла…
etc
26.01.19
✎
23:56
Это полный лог всего. Он подхватится примерно через 60 секунд без рестарта сервера
Kudryashka
26.01.19
✎
23:56
в 1с перезашла на всякий случай
etc
26.01.19
✎
23:56
ну и попробуй обратись к веб-сервису.
etc
26.01.19
✎
23:57
всмысле к http сервису
Kudryashka
26.01.19
✎
23:57
так я обратилась…. сразу же. сейчас снова попробую.
etc
26.01.19
✎
23:58
там папки должны появиться, по одной на каждый запущеный rphost
Kudryashka
26.01.19
✎
23:59
появилось но чето пустой файл там. щас перезайду опять и обращусь.
Kudryashka
27.01.19
✎
00:00
уууу… какой большой лог…
etc
27.01.19
✎
00:00
папка с каким названием создалась?
Kudryashka
27.01.19
✎
00:01
httpd_5728 ну там еще другие, но я так поняла мне эта нужна
etc
27.01.19
✎
00:03
rphost_xxxx еще смотри
ищи строчку с EXCP
Kudryashka
27.01.19
✎
00:04
все остальные папки с префиксом 1cv8_
Kudryashka
27.01.19
✎
00:06
тут в этом файле нашла строчки с эррорами
04:46.995026-0,CONN,1,process=httpd,ClientID=232,Protected=0,Txt=’Connected, client=(2)127.0.0.1:55377, server=(2)127.0.0.1:1560′
04:46.995029-0,CONN,1,process=httpd,Txt=QueryCredentialsAttributes: Error 80090304!
04:46.995035-0,CONN,1,process=httpd,ClientID=233,Protected=0,Txt=’Connected, client=(2)127.0.0.1:55378, server=(2)127.0.0.1:1561′
04:46.995036-0,CONN,1,process=httpd,Txt=QueryCredentialsAttributes: Error 80090304!
Kudryashka
27.01.19
✎
00:07
и еще одну пониже
04:46.963000-0,CONN,1,process=httpd,Usr=111,ClientID=230,Protected=0,Txt=’Connected, client=(2)127.0.0.1:55375, server=(2)127.0.0.1:1560′
04:46.963001-0,CONN,1,process=httpd,Usr=111,Txt=QueryCredentialsAttributes: Error 80090304!
Kudryashka
27.01.19
✎
00:07
это вам ни о чем не говорит?
Kudryashka
27.01.19
✎
00:09
etc
27.01.19
✎
00:14
судя по IB=D:\AZHDHSever база файловая?
etc
27.01.19
✎
00:19
короче хрень какаято
sergeyspb13
27.01.19
✎
00:28
у клиента (у которого все работает) таже платформа ?
права у апача на папку с модулями… базами
Kudryashka
27.01.19
✎
11:59
(106) да, та же платформа.
права у апача — это где конкретно посмотреть?
palsergeich
27.01.19
✎
13:01
Kudryashka
27.01.19
✎
14:16
все, разобралась. мешали другие процедуры в этом модуле. говорю же какая-то тупая ошибка блин….. спасибо всем за участие!
Сергиус
27.01.19
✎
15:02
(0)Может не хватать прав на запуск этих dll. Не нашел в теме — база 1с файловая или клиент/сервер? Вообщем проверь, что с правами доступа к этим файлам(а лучше ко всей папке bin).
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
Комментарии доступны только авторизированным пользователям
Но сразу расскажу один секрет, который в подобных обработках не обрабатывается ни как :
Сейчас по протоколу 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>