Автоматический REST-сервис в «1С:Предприятии». OData. Пример работы из Jscript/AJAX



Небольшой обзор REST-сервиса в «1С:Предприятии». Рассмотрен механизм работы c REST-сервером 1С:Предприятия из внешнего приложения — веб-страницы с использованием языка JavaScript и технологии AJAX.

 

Общая информация 

REST (сокр. от англ. Representational State Transfer — «передача  репрезентативного состояния») — метод взаимодействия компонентов распределённого приложения в сети Интернет, при котором вызов удаленной процедуры представляет собой обычный HTTP-запрос (обычно GET или POST; такой запрос называют REST-запрос), а необходимые данные передаются в качестве параметров запроса. Этот способ является альтернативой более сложным методам, таким как SOAP, CORBA и RPC.

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

Ajax (от англ. Asynchronous Javascript and XML — «асинхронный JavaScript и XML») — подход к построению интерактивных пользовательских интерфейсов веб-приложений, заключающийся в «фоновом» обмене данными браузера с веб-сервером. В результате, при обновлении данных веб-страница не перезагружается полностью, и веб-приложения становятся быстрее и удобнее.

В 1С Предприятие 8.3 появилась поддержка автоматического REST-сервиса. Для доступа к данным используется протокол OData версии 3. Поддерживается единственный формат представления данных: atom-xml. Для доступа к данным, при публикации, автоматически генерируется REST-сервис, который позволяет читать данные «1С:Предприятия», изменять их, создавать новые объекты данных и удалять существующие. Прикладное решение на базе «1С:Предприятия» может выступать как клиентом, так и сервером при работе с REST-сервисами. Для работы сервером практически никаких дополнительных действий осуществлять не надо (эта возможность предоставляется автоматически), для того, чтобы стать клиентом REST-сервиса, необходимо в прикладном решении реализовать программный слой, который будет использовать данные сервера REST с использованием стандартных интерфейсов «1С:Предприятия», например объекта HTTPСоединение.

В публикации рассмотрен механизм работы c REST-сервером 1С:Предприятия из внешнего приложения — веб-страницы с использованием языка JavaScript и технологии AJAX.

Теория и подробное описание — по ссылкам ниже.

 

REST-сервер

В качестве сервера будет выступать опубликованная на веб-сервере БД (Демо-база "Управление торговлей 11")

В режиме "Конфигуратор" переходим по меню "Администрирование" — "Публикация на веб-сервере…"

Теперь прикладное решение выступает как REST-сервер и мы можем получать и изменять данные, отправляя http-запросы, сформированные соответствующим образом.

Проверим работу сервиса. Для обращения REST-сервису используется последовательность
http://{АдресВебСервера}/{ИмяПубликации}/odata/standard.odata/{Ресурс}?{Параметры},где

АдресВебСервера — адрес веб-сервера, на котором опубликован сервис

ИмяПубликации — имя, указанное при публикации решения

Ресурс — идентификатор ресурса или предопределенные ресурсы. Например, $metadata — метаданные решения,

Catalog_Организации — справочник Организации.

Параметры — параметры ресурса. Используются, например, для отбора, в принятом для HTTP-запросов: ?ключ=значение&ключ2=значение2

В зависимости от того, какая операция выполняется, используется соответствующий HTTP-метод:

  •  Получение данных – метод GET;
  •  Создание объекта – метод POST;
  •  Обновление данных:
  •  метод PATCH – в этом случае можно указывать только те свойств, которые необходимо обновить;
  •  метод PUT – в этом случае необходимо указывать все свойства сущности;
  •  Удаление данных – метод DELETE.

Итак, получим список организаций
http://localhost/DemoTrd/odata/standard.odata/Catalog_Организации

$filter — описание отбора

Получим список накладных с отбором по организации

http://localhost/DemoTrd/odata/standard.odata/Document_РеализацияТоваровУслуг?$filter=Организация_Key eq guid’87ec13fb-f611-11df-aeca-0015e9b8c48d

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

Логические операции отбора

  • Равно eq
  • Не равно ne
  • Больше gt
  • Больше или равно ge
  • Меньше lt
  • Меньше или равно le
  • Логическое ИЛИ or
  • Логическое И and
  • Отрицание not

 

Чтение объекта

Для чтения объекта необходимо отправить сформированный определенным способом запрос к сервису(URL сущности), используя метод GET
http://mysite/DemoTrd/odata/standard.odata/Document_РеализацияТоваровУслуг(guid’c019c02d-5462-11e0-af18-0015e9b8c48d’)

Гет можем отправить и из браузера — посмотрим на XML-документ из Chrome, введя соответствующий URL в адресной строке:

 

 

Обновление объекта

Для обновления объекта необходимо выполнить PUT-/PATCH-запрос с использованием канонического URL сущности (аналогично запросу GET для получения сущности), передав в теле запроса XML-документ (в формате atom), который содержит значения свойств сущности.

В случае PATCH-запроса пропущенные свойства сущности будут проигнорированы, т. е. будут изменены только те свойства, которые переданы в запросе на изменение. Для PUT-запроса необходимо указывать значения всех свойств обновляемой сущности. 

PUT-/PATCH-запрос просто так из строки браузера отправить не получиться, поэтому приступим к написанию мини-клиента для REST-сервиса

 

REST-Клиент

Клиент будет представлять собой обычную html-страницу, с подключенными к ней js-скриптами. Это в первую очередь библиотека JQuery, также пригодятся скрипты для удобной работы с форматами дат и календарем

На странице реализуем следующие функции:

  • получение списка организаций
  • отбор РТиУ по выбранной организации за заданный период
  • изменение реквизита "Комментарий" у выбранного документа

Листинг js-процедур.

 

В результате наш мини-клиент выглядит так:

Изменим несколько документов и проверим результат в УТ:

 

Объекты конфигурации

В нашем простом примере рассмотрено чтение коллекций справочников и документов, запись реквизита документа.
На самом деле список объектов, к котором можно получить доступ через REST-сервис, намного шире:

  • Справочник
  • Документ
  • Журнал документов
  • Константа
  • План обмена
  • План счетов
  • План видов расчета
  • План видов характеристик
  • Регистр сведений
  • Регистр накопления
  • Регистр расчета
  • Регистр бухгалтерии
  • Бизнес-процесс
  • Задача

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

 

Ссылки

http://its.1c.ru/  — в первую очередь изучаем руководство разработчика на ИТС

http://www.odata.org/ — страничка протокола OData, там же есть ссылки на готовые библиотеки, для работы с одата на разных языках

 

Что в архиве

В архиве сам REST-клиент: html страница, js-скрипты, файл стилей css

 

Как настроить

  1. Опубликовать демо-базу УТ 11 (как на первом скрине)
  2. Настроить доступ – запустить web-сервер под пользователем ОС, настроить в конфигураторе ОС-аутентификацию пользователя(админа) 
  3. Разместить в корневом каталоге веб-сервера файлы из архива (ajax в дефолте не поддерживает кроссдоменные запросы, поэтому скрипты должны быть в одном домене с REST-сервисом)
  4. Открыть главную страницу сайта в браузере.

PS

Как работает клиент? При открытии страницы загружается список организаций в список выбора.

После загрузки выбираем для отбора организацию, интервал дат, жмем кнопку "Обновить". На страницу выводится список документов, одновременно заполняется список выбора внизу страницы.
Выбираем документ из списка, заполняем поле "Комментарий", жмем кнопку "Сохранить". После сохранения список документов обновится и изменения документа станут видны в нем:)
Подгрузка данных в страницу бывает работает не очень быстро (особенно в файловой версии, и/или при первом запуске 🙂 )
Поэтому  список организаций при открытии страницы в браузере заплняется спустя некоторое время. По хорошему, можно сделать, чтобы отображались картинка ожидания во время подгрузки ajax (часики или крутился кружок). Этот прием даёт пользователю понять, что страница не просто висит, а нужно немного подождать. Он используется на многих сайтах, в т.ч. на Инфостарте 🙂


UPD 

 

Из Заметок из зазеркалья стало ясно, что автоматический REST скоро будет доступен также в формате JSON.

 

 

48 Comments

  1. baloo

    Отлично! Веб-расширение — давай, до свидания!

    Reply
  2. tindir

    Отлично. сейчас начинаю читать по ЖаваСкрипту и думал уходить из 1с. Но если можно бизнес-логику рисовать в «родной» эСке, а на клинет дергать только оттуда данные то видимо мои отношения с 1с еще не кончены совсем=)

    Reply
  3. gimalaj

    (1) Необходимость в веб-расширении давно отпала с появлением веб-сервисов.

    Reply
  4. Dragonim

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

    Reply
  5. vano-ekt

    (4) курите метод глобального контекста УстановитьСоставСтандартногоИнтерфейсаOData

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

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

    Reply
  6. vano-ekt

    ну и если таки не хотите давать доступ с клиента, можно этот же REST использовать только в серверных приложениях и тогда ни один враг не пройдёт 🙂

    публикация не о том, чтобы всему миру открыть полный доступ к записи ИБ, а о новых возможностях платформы 🙂

    Reply
  7. Makushimo

    Отлично.

    я вот тоже ни разу не Веб программист.

    А как эту страничку с нуля создать? и куда там эти функции писать?

    Как их вообще строить, функции эти?

    Это надо чуток мат часть почитать?

    есть ссылко?

    Reply
  8. vano-ekt

    (7) я делал в текстовом редакторе,если хочется поковырять пример — почитать можно что то вроде JavaScript для чайников 🙂

    Reply
  9. Yashazz

    Пока совершенно не нужная мне фича, да и недоступная (ввиду отсутствия работы на 8.3), но плюс ставлю. За UPD с цитатой из «Сектора». Потому что это исчерпывающе описывает концепт нынешних действий 1С — в каждом релизе что-то такое, что надо до половины кода/интерфейса переписывать, а то и больше.

    Reply
  10. Dragonim

    (5) УстановитьСоставСтандартногоИнтерфейсаOData покурил мельком, разграничений прав доступа не нашёл, разговор идёт о разрешения доступа к определённым объектам конфигурации, в случае если доступ к объекту разрешен, то с ним можно делать что угодно, в вашем примере можно изменить или удалить справочник организации и документы РТиУ.

    Если инструмент заложенный в платформу даёт право удалённо испортить бузу данных, то приводя пример использования данного инструмента нужно как минимум писать об этом большими красными буквами в самом начале. Одно дело когда вы сами работая с 1С исковеркали базу, а совсем другое, когда дали доступ из вне и кто-то другой её грохнул.

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

    Лично я считаю что инструмент REST запросов в 1С не доделан со стороны безопасности базы данных и пользоваться им вредно для психологического и материального здоровья, о чём хотел бы предупредить читателей.

    Reply
  11. vano-ekt

    (10) вопросы безопасности решаемы, а убить базу пользователь может и без rest-сервиса 🙂

    Reply
  12. oleg_km

    А разве авторизацию клиента на входе нельзя прикрутить?

    Reply
  13. vano-ekt

    (12) можно, причем больше вопросов задают как её убрать 😀

    убираешь — вопрос как её вернуть 😀

    Reply
  14. oleg_km

    Ну я то просто спросил, для общего развития.

    Reply
  15. uzhelas

    Как на счет лицензий? Есть ли возможность разработать альтернативный веб-интерфейс не используя лицензий 1с?

    Reply
  16. xzorkiix

    (10) Dragonim, аутентификация по логин/пароль, в тч и по доменной аутентификации. Сеанс при обращении целиком и полностью в рамках Внешнего соединения. Полномочия — какие дадите, такие и будут.

    Reply
  17. xzorkiix

    (15) uzhelas, соединение через REST = внешнее соединение. 1 REST запрос = 1 пользовательский сеанс в ИБ.

    Reply
  18. xzorkiix

    (12) oleg_km, при публикации сервисов на стороне Веб сервера мы можем:

    1. явно задать Логин/Пароль, тогда все обращения к сервису(ам) ИБ будут из под одного пользователя 1С.

    2. использовать аутентификацию 1С по логин/пароль

    3. использовать доменную аутентификацию

    Reply
  19. AllaSN

    Не работает обращение к REST-сервису, если параметр с длинными GUID (например, «041df8ef-8871-11e1-b201-20cf30c8da97041df8ef-8871-11e1-b201-20cf30c8da97041df8ef-8871-11e1-b201-20cf30c8da97041df8ef-8871-11e1-b201-20cf30c8da97041df8ef-8871-11e1-b201-20cf30c8da97»). Кто-нибудь сталкивался? Как решить?

    Reply
  20. vano-ekt

    (19) это какой такой объект с таким guid’ом в базе? может сам запрос некорректно сформирован? весь запрос напишите

    Reply
  21. shoy

    (13) и каковы ваши рекомендации?

    Reply
  22. vano-ekt

    (21) я бы вообще не стал давать клиентским приложениям (каким является эта разработка на Jscript/AJAX) доступ без авторизации.

    Если все же есть потребность работы с 1С внешних пользователей, то всю логику работы с REST я бы утащил в серверное приложение (например, в скрипты php), где доступ к REST был бы полным, но обработка данных выполнялась со всевозможными проверками и фильтрами.

    Reply
  23. AllaSN

    (20)

    /UTworkWeb/odata/standard.odata/Document_%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1­%86%D0%B8%D1%8F%D0%A2%D0%BE%D0%B2%D0%B0%D1%80%D0%BE%D0%B2%D0­%A3%D1%81%D0%BB%D1%83%D0%B3?$filter=%D0%9E%D1%80%D0%B3%D0%B0%D0%BD%D0%B8%D0%B7%D0%B0%D1%­86%D0%B8%D1%8F_Key%20eq%20guid%27041df8ef-8871-11e1-b201-20cf30c8da97041df8ef-8871-11e1-b201-20cf30c8da97041df8ef-8871-11e1-b201-20cf30c8da97041df8ef-8871-11e1-b201-20cf30c8da97041df8ef-8871-11e1-b201-20cf30c8da97%27

    Reply
  24. AllaSN

    (20)

    С отбором по организациям с коротким GUID выводится список реализаций. С длинным GUID — нет.

    Reply
  25. vano-ekt

    (23) у гуидов длина 36

    Reply
  26. AllaSN

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

    <option value=»041df8ef-8871-11e1-b201-20cf30c8da97041df8ef-8871-11e1-b201-20cf30c8da97041df8ef-8871-11e1-b201-20cf30c8da97041df8ef-8871-11e1-b201-20cf30c8da97041df8ef-8871-11e1-b201-20cf30c8da97″>ООО «Организация»</option>

    вместо

    <option value=»041df8ef-8871-11e1-b201-20cf30c8da97″>ООО «Организация»</option>

    Исправление:

    $(‘#firm_list’).append($(‘<option value=»‘ + $(this).find(‘Ref_Key:first’).text() + ‘»></option>’).html($(this).find(‘Description’).text()));

    Reply
  27. AllaSN

    Если в списке накладных вывести наименование объекта по ссылке (например, контрагентов), то формирование списка осуществляется крайне медленно.

    Reply
  28. Программулькин

    эм..я что-то туплю. Но на 1м шаге затык.

    1. установил апач — работает( http://localhost/ — Результат: It works! )

    2. Далее создал конфу новую, создал справочник Contakts. Создал пару реквизитов и пару элементов в базе.

    3. Далее Администрирование — публикация — все галки выкл. кроме:

    -публиковать стандартный интерфейс OData

    -Каталог C:wwwp\r

    -база: bp_test

    4 рестарт Апач

    5. Открываю браузер и пишу:

    http://localhost/bp_test/odata/standard.odata/Catalog_Contakts

    Ошибка

    HTTP: Not found Ошибка при работе с ресурсом /bp_test/odata/standard.odata/Catalog_Contakts

    Что не так то?

    платформа 1С:Предприятие 8.3 (8.3.5.1186)

    режим совместимости пробывал и ничего и Версия 8.3.4.

    Reply
  29. Программулькин

    (18) xzorkiix, есть пример как явно указать логин и пароль?

    Reply
  30. AllaSN

    Как тот же функционал можно реализовать с использованием php вместо jQuery?

    Reply
  31. Puk2

    Ещё бы к этому примеру добавить вывод картинки (фотографию сотрудника или номенклатуры), было бы очень замечательно. Хочу как-нибудь сделать справочник сотрудников с фотографиями, по виду напоминающий MS Outlook. Вроде в аутлуке есть ограничение в 255 пользователей, с которыми можно поделиться контактами.

    Reply
  32. IfYouWant_YouCan

    при сохранении документа реализации сервер отвечает (см. картинку), путь к БД 100% верный, т.к. все остальное работает, ваш код не менялся кроме пути, авторизация через домен, у юзера 1С все права, но при подключении через REST почему то в активных пользователях не видно что за пользователь, что может быть в данном случае?

    вот функция ваша с моим путем к БД:

    function patch_doc()

    {

    xmldata1 = ‘<?xml version=»1.0″ encoding=»UTF-8″?><entry xmlns=»http://www.w3.org/2005/Atom» xmlns:d=»http://schemas.microsoft.com/ado/2007/08/dataservices» xmlns:m=»http://schemas.microsoft.com/ado/2007/08/dataservices/metadata» xml:base=»http://localhost/83_TEST/odata/standard.odata/»> <content type=»application/xml»><m:properties xmlns:d=»http://schemas.microsoft.com/ado/2007/08/dataservices» xmlns:m=»http://schemas.microsoft.com/ado/2007/08/dataservices/metadata»><d:Комментарий>’+document.form_save.doc_comm.value+'</d:Комментарий></m:properties></content></entry>’;

    $.ajax({

    data:xmldata1,

    dataType: ‘text’,

    url : «/83_TEST/odata/standard.odata/Document_РеализацияТоваровУслуг(guid»+document.form_save.doc_id.value+»)»,

    type : ‘PATCH’,

    success : function (xmldata) {

    })

    load_doc();

    }

    Reply
  33. vano-ekt

    Документ: Не выбрано (см скрин)

    Reply
  34. vano-ekt

    (33) to (32)

    Reply
  35. IfYouWant_YouCan

    (33) на картинке результат после нажатия кнопки «Сохранить»! До нажатия там все выбрано, яж не дурак чтоб отправлять XML без данных ))

    Reply
  36. vano-ekt

    (35) ну тогда request в студию, раз он bad

    Reply
  37. IfYouWant_YouCan

    (36) глянул через инструменты разработчика в Chrome вот что отвечает 1С:

    <m:error xmlns:m=»http://schemas.microsoft.com/ado/2007/08/dataservices/metadata»>

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

    <m:message>Ошибка инициализации библиотеки модулей</m:message>

    </m:error>

    Reply
  38. IfYouWant_YouCan

    (36) вот запрос:

    Request URL:http://localhost/83_TEST/odata/standard.odata/Document_%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1­%86%D0%B8%D1%8F%D0%A2%D0%BE%D0%B2%D0%B0%D1%80%D0%BE%D0%B2%D0­%A3%D1%81%D0%BB%D1%83%D0%B3(guid’02bef111-7070-11e4-b922-bcee7b9a5809′)

    Request Method:PATCH

    сам XML:

    <?xml version:»1.0″ encoding=»UTF-8″?>

    <entry xmlns=»http://www.w3.org/2005/Atom» xmlns:d=»http://schemas.microsoft.com/ado/2007/08/dataservices»

    xmlns:m=»http://schemas.microsoft.com/ado/2007/08/dataservices/metadata» xml:base=»http://localhost/83_TEST/odata/standard.odata/»>

    <content type=»application/xml»>

    <m:properties xmlns:d=»http://schemas.microsoft.com/ado/2007/08/dataservices» xmlns:m=»http://schemas.microsoft.com/ado/2007/08/dataservices/metadata»>

    <d:Комментарий>

    123

    </d:Комментарий>

    </m:properties>

    </content>

    </entry>

    Reply
  39. IfYouWant_YouCan

    (36) вообщем для теста сменил тип документа на СчетНаОплату, сейчас другая ошибка :

    <m:error xmlns:m=»http://schemas.microsoft.com/ado/2007/08/dataservices/metadata»>

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

    <m:message>Ошибка инициализации модуля: Документ.СчетНаОплатуПокупателю.МодульОбъекта</m:message>

    </m:error>

    платформа 8.3.5.1248, режим совместимости Версия 8.2.13, конфа доработанная УТ 10.3, как то можно вообще узнать где проблема в модуле счета? ну соответственно это не УФ, или

    возможна работа только с УФ?

    Reply
  40. vano-ekt

    черт его знает, тестил на демобазе ут 11(не помню релиз) , платформа 8.3.5.1186, может режим совместимости мешает?

    Reply
  41. IfYouWant_YouCan

    (40) на ИТС написано что отличий в том что включен режим совместимости или выключен — НЕТ, разница только в ограничении состава данных, с режимом совместимости он через REST весь передается, а без — можно ограничить, лан если не получится подружится, то буду юзать HTTT-сервис, там хуть отладку можно включить из 1С

    Reply
  42. mxs89

    как по дате запрос написать?

    Reply
  43. ineshyk

    (2) tindir, жаль только по лицензионному соглашению на каждое соединение вам нужна будет 1-а лицензия.

    И если взять такое решение для коммерческого продукта — то конкуренту достаточно дернуть 100 соединений, все новые по таймауту будут падать. Такой себе ДДОС для 1С )

    Reply
  44. ktu

    При добавлении (изменении) документов как и в какой момент отрабатывает функционал проведения? Нужно как-то намекать документу о необходимости перепроведения?

    Reply
  45. baracuda

    Надоумьте пожалуйста. Как мне получить номенклатуру + остатки по ней при помощи Rest. В начале получаем Guid номенклатуры потом читаем остаток. Регистры накопления тоже уже достпны в REST интерфейсе?

    Как к ним обращаться? Где описание? Хочу быть в теме

    Reply
  46. eugenelo

    http://localhost/DemoTrd/odata/standard.odata/Document_РеализацияТоваровУслуг?$filter=Организация_Key eq guid’87ec13fb-f611-11df-aeca-0015e9b8c48d

    как понять эту запись ?? где закрытие кавычек ?

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

    Reply
  47. vano-ekt

    (46) eugenelo, кавычек?? это разве кавычка? вроде как апостроф, и что он должен закрывать? это не строка а guid

    http://its.1c.ru/db/v837doc#bookmark:dev:TI000001363 вот тут и про логические и про арифметические операции (18.2.1.5. Правила формирования условия отбора)

    Reply
  48. maksyandra

    А как получить данные измененные или добавленные за период??

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *