Web-Сервис
Black Hole
by Evil Grym
Назначение.
Сервис предназначен для организации взаимодействия с БД 1С посредством SOAP протокола. Позволяет хранить исходный функциональный код на вызывающей стороне.
Описание функций и способы их вызова.
Общие параметры функций:
Usr - Имя пользователя. Используется для дополнительной авторизации пользователя. Хранится в справочнике GTG_BlackHole_Users.
Pwd - Пароль пользователя. Используется для дополнительной авторизации пользователя. В БД не хранится. Сравнивается с отпечатком, хранящимся в справочнике GTG_BlackHole_Users.
Exec(Usr, Pwd, IncomingData) - выполняет произвольный код 1С переданный в параметрах вызова.
Параметры:
IncomingData - Структура в которой передается исполняемый код и дополнительные данные. Структура должна иметь обязательное поле ТекстПрограммы, в значении которого должен содержаться исполняемый код , написанный из расчета , что выполнение происходит в серверном контексте базы сервиса. Так же, структура может содержать произвольный набор полей, через которые можно передать дополнительные данные, требующиеся для выполнения текста программы. В передаваемых данных не должно быть ссылок. В тексте программы переданные дополнительные значения доступны через переменную типа структура ВхСтруктура.<имя_поля_IncomingData>
Возвращаемое значение:
Структура. Содержит обязательное поле СтатусВыполнения. Значения поля СтатусВыполнения - Строка. При успешном выполнении "ОК", при ошибке - описание ошибки.
Если требуется вернуть дополнительные результаты, то в тексте программы можно добавить их в возвращаемую структуру через переменную СтруктураВозврата.
Query_to_TZ(Usr, Pwd, IncomingData) - выполняет запрос с параметрами переданный в параметрах вызова.
Параметры:
Вариант 1, для 1С:
IncomingData - Структура в которой передается запрос и его параметры. Структура должна иметь обязательное поле Запрос, в значении которого должен содержаться текст запроса , написанный из расчета , что выполнение происходит в контексте базы сервиса. Так же, структура может содержать парамметры запроса, передаваемые через поле ПараметрыЗапроса структуры IncomingData. Тип значения поля ПараметрыЗапроса - Структура, ключ которй соответствует имени параметра запроса , а значение - значению параметра запроса. В передаваемых данных не должно быть ссылок.
Также, можно преобразовать ссылочные данные, полученные в результате запроса в ГУИДы. Для этого в структуру IncomingData добавить поле СсылкиКакГУИДы со значением Истина. В этом случае, все ссылки , полученные в результате запроса будут преобразованы в ГУИДы.
IncomingData Запрос Текст запроса ПараметрыЗапроса ИмяПараметра1 Значение параметра 1 ИмяПараметра2 Значение параметра 2 СсылкиКакГУИДы истина/ложь Вариант 2, для PHP:
IncomingData - Аналогично Варианту 1 , но т.к. в PHP наблюдается проблема при передаче вложенных структур при вызове функции веб-сервиса, то параметры нужно передавать следующим образом: параметры должны быть полями структуры IncomingData , а к имени параметра нужно добавить "Парам_".
IncomingData Запрос Текст запроса Парам_ИмяПараметра1 Значение параметра 1 Парам_ИмяПараметра2 Значение параметра 2 СсылкиКакГУИДы истина/ложь Возвращаемое значение:
Таблица значений.
Query_to_ArrayOfTZ(Usr, Pwd, IncomingData) - выполняет пакетный запрос с параметрами переданный в параметрах вызова.
Параметры:
Аналогично функции Query_to_TZ
Возвращаемое значение:
Массив таблиц значений.
Настройки.
Константы:
Логгировать ошибки доступа WS Black Hole - Включает/выключает запись ошибок авторизации в регистр сведений Лог ошибок доступа к WS "Black Hole".
Логгировать вызовы WS Black Hole- Включает/выключает запись параметров, переданных при вызове функций сервиса, в регистр сведений Лог вызовов к WS "Black Hole".
Справочники:
Пользователи WS "Black Hole" - Справочник пользователей сервиса для дополнительной авторизации выполняемых операций. Пароль пользователя не хранится в базе, поэтому не может быть восстановлен. В случае утраты пароля можно сгенерировать новый.
Примеры использования.
Подключение к сервису:
АдресWSDL="http://localhost:8083/InfoBase/ws/gtg_bh.1cws?wsdl";
TargetNamespace="GTG_BH_WS";
DefinitionsName="GTG_BlackHole_WS";
PortName="GTG_BlackHole_WSSoap12";
Таймаут=30;
// Если Web-сервис требует пароля:
ИмяПользователя="BlackHoleUser";
Пароль="123456";
Определение=Новый WSОпределения(СокрЛП(АдресWSDL),ИмяПользователя,Пароль,Таймаут);
Прокси = Новый WSПрокси(Определение,
СокрЛП(TargetNamespace),
СокрЛП(DefinitionsName),
СокрЛП(PortName),
0);
// Если Web-сервис требует пароля:
Прокси.Пользователь=ИмяПользователя;
Прокси.Пароль=Пароль;
Использование функции Query_to_TZ:
ВСЗапрос="ВЫБРАТЬ
| GTG_BlackHole_Users.Ссылка КАК Ссылка,
| GTG_BlackHole_Users.ВерсияДанных КАК ВерсияДанных,
| GTG_BlackHole_Users.ПометкаУдаления КАК ПометкаУдаления,
| GTG_BlackHole_Users.Код КАК Код,
| GTG_BlackHole_Users.ДоступРазрешен КАК ДоступРазрешен,
| GTG_BlackHole_Users.Соль КАК Соль,
| GTG_BlackHole_Users.Предопределенный КАК Предопределенный,
| GTG_BlackHole_Users.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.GTG_BlackHole_Users КАК GTG_BlackHole_Users
|ГДЕ
| GTG_BlackHole_Users.Код ПОДОБНО &Код";
Usr = "РоботЧернодыр";
Pwd = "86e0-362aa800b1b0";
ИнДата = Новый Структура();
ИнДата.Вставить("Запрос",ВСЗапрос);
ПараметрыИнЗапроса = Новый Структура();
ПараметрыИнЗапроса.Вставить("Код","%Черно%");
ИнДата.Вставить("Запрос",ВСЗапрос);
ИнДата.Вставить("ПараметрыЗапроса",ПараметрыИнЗапроса);
ИнДата.Вставить("СсылкиКакГУИДы",Истина);
IncomingData = СериализаторXDTO.ЗаписатьXDTO(ИнДата);
Результат=Прокси.Query_to_TZ(Usr, Pwd, IncomingData); // XDTO-объект, таблица значений
ТЗ = СериализаторXDTO.ПрочитатьXDTO(Результат); // Таблица значений.
Использование функции Exec:
ТекстПрограммы="
|
| А = (10 + ВхСтруктура.Параметр1)*ВхСтруктура.Параметр2;
| СтруктураВозврата.Вставить(""Результат_А"",А);
|
| МассивБ = Новый Массив;
| Для Ы=1 по А Цикл
| МассивБ.Добавить(Ы);
| КонецЦикла;
|
| СтруктураВозврата.Вставить(""Результат_Б"",МассивБ);
|
| Спр = Справочники.GTG_BlackHole_Users.НайтиПоКоду(""РоботЧернодыр"");
| СтруктураВозврата.Вставить(""Результат_Х"",XMLСтрока(Спр.Ссылка));
|";
Usr = "РоботЧернодыр";
Pwd = "86e0-362aa800b1b0";
ИнДата = Новый Структура();
ИнДата.Вставить("ТекстПрограммы",ТекстПрограммы);
ИнДата.Вставить("Параметр1",10);
ИнДата.Вставить("Параметр2",1);
IncomingData = СериализаторXDTO.ЗаписатьXDTO(ИнДата);
Результат=Прокси.Exec(Usr, Pwd, IncomingData); // XDTO-объект, структура
РезСтруктура = СериализаторXDTO.ПрочитатьXDTO(Результат); // структура.
Сообщить("Статус выполнения: "+РезСтруктура.СтатусВыполнения);
Сообщить("А = "+РезСтруктура.Результат_А);
Сообщить("Содержимое массива Б: ");
Для Каждого Элем Из РезСтруктура.Результат_Б Цикл
Сообщить(" "+Элем);
КонецЦикла;
Сообщить("Х = "+РезСтруктура.Результат_Х);