Общая информация
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
Как настроить
- Опубликовать демо-базу УТ 11 (как на первом скрине)
- Настроить доступ – запустить web-сервер под пользователем ОС, настроить в конфигураторе ОС-аутентификацию пользователя(админа)
- Разместить в корневом каталоге веб-сервера файлы из архива (ajax в дефолте не поддерживает кроссдоменные запросы, поэтому скрипты должны быть в одном домене с REST-сервисом)
- Открыть главную страницу сайта в браузере.
PS
Как работает клиент? При открытии страницы загружается список организаций в список выбора.
После загрузки выбираем для отбора организацию, интервал дат, жмем кнопку "Обновить". На страницу выводится список документов, одновременно заполняется список выбора внизу страницы.
Выбираем документ из списка, заполняем поле "Комментарий", жмем кнопку "Сохранить". После сохранения список документов обновится и изменения документа станут видны в нем:)
Подгрузка данных в страницу бывает работает не очень быстро (особенно в файловой версии, и/или при первом запуске 🙂 )
Поэтому список организаций при открытии страницы в браузере заплняется спустя некоторое время. По хорошему, можно сделать, чтобы отображались картинка ожидания во время подгрузки ajax (часики или крутился кружок). Этот прием даёт пользователю понять, что страница не просто висит, а нужно немного подождать. Он используется на многих сайтах, в т.ч. на Инфостарте 🙂
Из Заметок из зазеркалья стало ясно, что автоматический REST скоро будет доступен также в формате JSON.
Отлично! Веб-расширение — давай, до свидания!
Отлично. сейчас начинаю читать по ЖаваСкрипту и думал уходить из 1с. Но если можно бизнес-логику рисовать в «родной» эСке, а на клинет дергать только оттуда данные то видимо мои отношения с 1с еще не кончены совсем=)
(1) Необходимость в веб-расширении давно отпала с появлением веб-сервисов.
Я совсем не разбираюсь в вебе, но страдаю паранойе. Пожалуйста объясните для таких как я как происходит безопасность. Судя по примеру любой желающий может уничтожить базу на корню послав правильный rest запрос.
(4) курите метод глобального контекста УстановитьСоставСтандартногоИнтерфейсаOData
где-то на ИС попадалась обработка, которая как раз в режиме предприятия задает перечень доступных объектов конфигурации
+ думаю также можно ролями разрулить, хотя не пробовал.
ну и если таки не хотите давать доступ с клиента, можно этот же REST использовать только в серверных приложениях и тогда ни один враг не пройдёт 🙂
публикация не о том, чтобы всему миру открыть полный доступ к записи ИБ, а о новых возможностях платформы 🙂
Отлично.
я вот тоже ни разу не Веб программист.
А как эту страничку с нуля создать? и куда там эти функции писать?
Как их вообще строить, функции эти?
Это надо чуток мат часть почитать?
есть ссылко?
(7) я делал в текстовом редакторе,если хочется поковырять пример — почитать можно что то вроде JavaScript для чайников 🙂
Пока совершенно не нужная мне фича, да и недоступная (ввиду отсутствия работы на 8.3), но плюс ставлю. За UPD с цитатой из «Сектора». Потому что это исчерпывающе описывает концепт нынешних действий 1С — в каждом релизе что-то такое, что надо до половины кода/интерфейса переписывать, а то и больше.
(5) УстановитьСоставСтандартногоИнтерфейсаOData покурил мельком, разграничений прав доступа не нашёл, разговор идёт о разрешения доступа к определённым объектам конфигурации, в случае если доступ к объекту разрешен, то с ним можно делать что угодно, в вашем примере можно изменить или удалить справочник организации и документы РТиУ.
Если инструмент заложенный в платформу даёт право удалённо испортить бузу данных, то приводя пример использования данного инструмента нужно как минимум писать об этом большими красными буквами в самом начале. Одно дело когда вы сами работая с 1С исковеркали базу, а совсем другое, когда дали доступ из вне и кто-то другой её грохнул.
Если использовать данный сервис только со стороны веб сервера, то нужно распределять права доступа на самом веб сервере, на доступ к приложению с которым будет общаться это веб сервер и прописывать различные правила на стороне сервера 1С чтобы никто кроме веб сервера не смог обратиться к нему из вне или по локальной сети, в общем ещё больше гемороя.
Лично я считаю что инструмент REST запросов в 1С не доделан со стороны безопасности базы данных и пользоваться им вредно для психологического и материального здоровья, о чём хотел бы предупредить читателей.
(10) вопросы безопасности решаемы, а убить базу пользователь может и без rest-сервиса 🙂
А разве авторизацию клиента на входе нельзя прикрутить?
(12) можно, причем больше вопросов задают как её убрать 😀
убираешь — вопрос как её вернуть 😀
Ну я то просто спросил, для общего развития.
Как на счет лицензий? Есть ли возможность разработать альтернативный веб-интерфейс не используя лицензий 1с?
(10) Dragonim, аутентификация по логин/пароль, в тч и по доменной аутентификации. Сеанс при обращении целиком и полностью в рамках Внешнего соединения. Полномочия — какие дадите, такие и будут.
(15) uzhelas, соединение через REST = внешнее соединение. 1 REST запрос = 1 пользовательский сеанс в ИБ.
(12) oleg_km, при публикации сервисов на стороне Веб сервера мы можем:
1. явно задать Логин/Пароль, тогда все обращения к сервису(ам) ИБ будут из под одного пользователя 1С.
2. использовать аутентификацию 1С по логин/пароль
3. использовать доменную аутентификацию
Не работает обращение к REST-сервису, если параметр с длинными GUID (например, «041df8ef-8871-11e1-b201-20cf30c8da97041df8ef-8871-11e1-b201-20cf30c8da97041df8ef-8871-11e1-b201-20cf30c8da97041df8ef-8871-11e1-b201-20cf30c8da97041df8ef-8871-11e1-b201-20cf30c8da97»). Кто-нибудь сталкивался? Как решить?
(19) это какой такой объект с таким guid’ом в базе? может сам запрос некорректно сформирован? весь запрос напишите
(13) и каковы ваши рекомендации?
(21) я бы вообще не стал давать клиентским приложениям (каким является эта разработка на Jscript/AJAX) доступ без авторизации.
Если все же есть потребность работы с 1С внешних пользователей, то всю логику работы с REST я бы утащил в серверное приложение (например, в скрипты php), где доступ к REST был бы полным, но обработка данных выполнялась со всевозможными проверками и фильтрами.
(20)
%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
/UTworkWeb/odata/standard.odata/Document_%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1
(20)
С отбором по организациям с коротким GUID выводится список реализаций. С длинным GUID — нет.
(23) у гуидов длина 36
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()));
Если в списке накладных вывести наименование объекта по ссылке (например, контрагентов), то формирование списка осуществляется крайне медленно.
эм..я что-то туплю. Но на 1м шаге затык.
http://localhost/ — Результат: It works! )
http://localhost/bp_test/odata/standard.odata/Catalog_Contakts
1. установил апач — работает(
2. Далее создал конфу новую, создал справочник Contakts. Создал пару реквизитов и пару элементов в базе.
3. Далее Администрирование — публикация — все галки выкл. кроме:
-публиковать стандартный интерфейс OData
-Каталог C:wwwp\r
-база: bp_test
4 рестарт Апач
5. Открываю браузер и пишу:
Ошибка
HTTP: Not found Ошибка при работе с ресурсом /bp_test/odata/standard.odata/Catalog_Contakts
Что не так то?
платформа 1С:Предприятие 8.3 (8.3.5.1186)
режим совместимости пробывал и ничего и Версия 8.3.4.
(18) xzorkiix, есть пример как явно указать логин и пароль?
Как тот же функционал можно реализовать с использованием php вместо jQuery?
Ещё бы к этому примеру добавить вывод картинки (фотографию сотрудника или номенклатуры), было бы очень замечательно. Хочу как-нибудь сделать справочник сотрудников с фотографиями, по виду напоминающий MS Outlook. Вроде в аутлуке есть ограничение в 255 пользователей, с которыми можно поделиться контактами.
при сохранении документа реализации сервер отвечает (см. картинку), путь к БД 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();
}
Документ: Не выбрано (см скрин)
(33) to (32)
(33) на картинке результат после нажатия кнопки «Сохранить»! До нажатия там все выбрано, яж не дурак чтоб отправлять XML без данных ))
(35) ну тогда request в студию, раз он bad
(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>
(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>
(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, как то можно вообще узнать где проблема в модуле счета? ну соответственно это не УФ, или
возможна работа только с УФ?
черт его знает, тестил на демобазе ут 11(не помню релиз) , платформа 8.3.5.1186, может режим совместимости мешает?
(40) на ИТС написано что отличий в том что включен режим совместимости или выключен — НЕТ, разница только в ограничении состава данных, с режимом совместимости он через REST весь передается, а без — можно ограничить, лан если не получится подружится, то буду юзать HTTT-сервис, там хуть отладку можно включить из 1С
как по дате запрос написать?
(2) tindir, жаль только по лицензионному соглашению на каждое соединение вам нужна будет 1-а лицензия.
И если взять такое решение для коммерческого продукта — то конкуренту достаточно дернуть 100 соединений, все новые по таймауту будут падать. Такой себе ДДОС для 1С )
При добавлении (изменении) документов как и в какой момент отрабатывает функционал проведения? Нужно как-то намекать документу о необходимости перепроведения?
Надоумьте пожалуйста. Как мне получить номенклатуру + остатки по ней при помощи Rest. В начале получаем Guid номенклатуры потом читаем остаток. Регистры накопления тоже уже достпны в REST интерфейсе?
Как к ним обращаться? Где описание? Хочу быть в теме
как понять эту запись ?? где закрытие кавычек ?
У меня почему то по такой схеме не фильтрует где id вот такие как тут, как булевы значения фильтровать как все скудно расписано
(46) eugenelo, кавычек?? это разве кавычка? вроде как апостроф, и что он должен закрывать? это не строка а guid
http://its.1c.ru/db/v837doc#bookmark:dev:TI000001363 вот тут и про логические и про арифметические операции (18.2.1.5. Правила формирования условия отбора)
А как получить данные измененные или добавленные за период??