Описание
Расскажу о некоторых нюансах работы с протоколом Open Data Protocol (OData). --> Самое интересное в конце статьи.
Чтобы начать работать с OData в 1С, нужно:
1) Установить на сервер 1С веб-сервер, любой (Apache, IIS, Ngnix).
2) При установке программы 1С на сервере 1С нужно также установить модули расширения веб-сервера.
3) Опубликовать базу на веб сервере, в Конфигураторе - Администрирование - Публикация на веб сервере
4) Запустить обработку, прикрепил ниже (скачать), и включить объекты Метаданных базы, с какими можно работать через OData, в состав объектов Стандартного Интерфейса OData.
5) в Конфигураторе - создать Роль для настройки Прав Пользователей, если такой нет в базе.
6) Назначить Права Пользователей, в Конфигураторе - Администрирование - Пользователи
5) Далее, выполнять запросы к объектам базы 1С. Это можно делать в строке браузера, а можно из кода 1С (и любых других языков программирования, поддерживающих OData )
Если для работы с HTTP-сервисом программисту 1С нужно придумывать архитектуру REST API, т.е. какие запросы возможны, то при работе с OData эта REST API уже реализована на уровне Платформы 1С.
Нюансы работы с OData
Как выполнять запросы на получение данных рассказано здесь.
Расскажу по обновление и удаление данных в 1С, с помощью OData.
Если сравнивать HTTP-сервис и OData, то код 1С написания HTTP запроса очень похож.
При изменении и удалении для OData нужно указывать заголовки:
ЗаголовокHTTP = Новый Соответствие();
ЗаголовокHTTP.Вставить("Accept-Charset", "utf-8");
ЗаголовокHTTP.Вставить("If-Match", ВерсияДанных);
ЗаголовокHTTP.Вставить("1C_OData-DataLoadMode", Истина);
где для заголовка "If-Match" указывается версия данных DataVersion объекта изменения или удаления.
А далее
HTTPЗапрос = Новый HTTPЗапрос(Адрес, ЗаголовокHTTP);
ОтветHTTP = Соединение.Удалить(HTTPЗапрос); // удаление данных, DELETE
// или
ОтветHTTP = Соединение.Изменить(HTTPЗапрос); // обновление данных PATCH
Зачем нужно указывать залоговок "If-Match"?
Ответ: При чтении данных вы запрашиваете с сервера 1С нужные вам данные и версию данных, DataVersion.
А при записи данных, нужно проверить, что никто другой не изменил данные, пока вы смотрели на результат.
Для этого и используют Версию данных, DataVersion. Если кто-то другой изменит данные, DataVersion изменится.
Поэтому, когда мы напишем запрос на изменение или удаление данных, при его выполнении, происходит сверка DataVersion которое вы передаёте в заголовке, с тем значением, которое в базе 1С.
Если версии совпадают, значит данные (между чтением данных из базы и их записью в базу 1С) никто не менял.
И можно записать изменения или удаление в базу.
Зачем нужно указывать залоговок "1C_OData-DataLoadMode"?
Ответ: Если необходимо эмулировать запись, выполняемую во время работы механизма обмена данными
(свойство ОбменДанными.Загрузка = Истина)
Когда вы работаете в программе 1С Предприятие в режиме: Тонкого, Толстого или Веб-клиента, программа накладывает Объектные блокировки:
Пессимистическая - когда вы начинаете изменять, например Документ или Справочник, вверху формы вы можете заметить появление звёздочки (Модифицированность = Истина)
Оптимистическая - при записи данных в базу, платформой происходит сверка DataVersion данных, которые вы помещаете в базу с версией данных, которые уже есть в базе.
Обратите внимание
При работе с данными через OData никаких объектных блокировок не накладывается, поэтом вам нужно самим делать то, что Платформа для: Тонкого, Толстого или Веб-клиента - делает по-умолчанию, без вашего участия.
Т.е. следить за версией данных, DataVersion, которые вы изменяете или удаляете.
При удалении данных с помощью OData не поддерживается ссылочная целостность.
Например, есть Справочник Номенклатура и для каждой номенклатуры указывается Единица измерения.
При удалении используемой Единицы измерения, в Справочнике Номенклатура появятся битые ссылки (что очень плохо).
Если вы назначили Пользователю права в Роли, где возможно удаление данных. При помощи OData данные удаляются физически из базы, т.е. не ставится Пометка Удаления = Истина у записи. Поэтому не создавайте Ролей с возможностью удаления данных из базы, а давайте возможность изменять данные. Например, чтобы Пользователь с помощью OData выставлял DeletionMark = true, что эквивалентно: ПометкаУдаления = Истина.
DeletionMark = true // это английский синтаксис
ПометкаУдаления = Истина // это русский синтаксис
Тестировал обработку на платформах 1С:Предприятие 8.3 (8.3.12.1685, 8.3.20.1674, 8.3.23.1865).
Проверено на следующих конфигурациях и релизах:
- 1С:ERP Управление предприятием 2, релизы 2.5.18.64