Как описано не работает, немного допилил, соединение с ДО есть, табдок на той стороне тоже заработал. Осталась одна загвоздка - никак не могу вызвать функцию на той стороне.
Метод объекта не обнаружен (get_sheet) при обращении WSПрокси.get_sheet(uid)
Интуитивно догадываюсь, что дело возможно в пространстве имен, но сделать правильно не умею. Прошу помощи.
Вебсервис работает отлично, если правильно создать и правильно заполнить строку подключения. Оптимально использовать там, где необходима авторизация каждого пользователя.
Вот пример функции подключения:
Функция ПолучитьДанныеС1СДокументооборот(uid)
АдресДО = Константы.АдресВебСервиса1СДокументооборот.Получить();
АдресСервиса = "/ws/WSDOCMK.1cws?wsdl";
АдресWDSL = АдресДО + АдресСервиса;
ИмяПользователя = ПараметрыСеанса.ИнтеграцияС1СДокументооборотИмяПользователя;
ПарольПользователя = ПараметрыСеанса.ИнтеграцияС1СДокументооборотПароль;
Попытка
WSПрокси = ОбщегоНазначения.WSПрокси(АдресWDSL,"http://192.168.5.200/DocMK/ws/WSDOCMK","WSDOCMK",,ИмяПользователя,ПарольПользователя);
Исключение
Сообщить ("Не удалось подключиться к 1С Документооборот");
Возврат Неопределено;
КонецПопытки;
ДвоичныеДанные = WSПрокси.GETDATA(UID);
Возврат ДвоичныеДанные;
Показать
HTTP сервер - простая настройка, но проблемы с авторизацией. Мне пришлось сделать авторизацию на вебсервере по умолчанию (в файле vrd), только тогда заработала. Удобно использовать, если нет необходимости разделять пользователей.
Этот вариант мне не подошел, т.к. интеграция работает по сопоставлению пользователей КА2 и ДО, ввод авторизации по умолчанию ломает идентификацию пользователей ДО в КА2.
Если бы не получилось разобраться с WS, то вариантом работы остался бы HTTP, но пришлось бы сделать 2 публикации - одну для интеграции, другую для получения данных
Пример файла соединения для HTTP:
&НаСервере
Функция ПолучитьДанныеС1СДокументооборот(uid)
АдресСервиса = "/DocMK/hs/ObmenKA/";
АдресHTTP = АдресСервиса + uid;
Запрос = Новый HTTPЗапрос;
Запрос.АдресРесурса = АдресHTTP;
Соединение = Новый HTTPСоединение("192.168.5.200");
Ответ = Соединение.Получить(Запрос);
ДД = Ответ.ПолучитьТелоКакДвоичныеДанные();
Возврат ДД;
КонецФункции
(4)WSПрокси вызывается с указанием всех параметров. 3-ий параметр как правило равен 2-ому + постфикс "SOAP", т.е. в вашем случае "approvalsheetSOAP".
Далее, эта функция среди прочего должна быть описана в XML, который вам возвращает WS в браузере.
(7)Файл править руками не нужно, но нужно переопубликовывать базу после добавления/изменения "структуры" функций WS.
Для отладки всего этого добра воспользуйтесь SoapUI.
(9)Базу переопубликовал, строку вызова изменил, все равно не заработала.
Как правильно добавить/изменить "структуру" WS не понял. Вот мой файл xml. По нему можно понять что не так?
(12) в *.XML все так. То что устанавливаете пространство имен - без разницы, главное, чтобы по этому пространству имен не находился другой XDTO пакет.
Влиять может то, что вы тип возвращаемого значения устанавливаете http://v8.1c.ru/8.1/data/core, хотя по факту у вас там либо BASE64 будет, либо вообще строка.
(9)Ест
(13)
(13)Понятно. Т.е. будут проблемы с возвращаемым значением. Ну это можно исправить, т.к. я там тыкал уже подряд все пробовал.
На текущий момент я не могу даже вызвать функцию, хотя соединение есть. Если в XML порядок, то из за чего тогда не вызывается get_sheet(uid)? Что еще можно попробовать?
Пробовал вместо пустого параметра написать approvalsheetSOAP почему то не подключилась, с пустым соединяет.
В документации пишут:
ИмяТочкиПодключения - Строка - (необязательный) если не задано, образуется как <ИмяСервиса>Soap.
(26)Такое ощущение, что у вас публикация базы как-то не полностью что ли.
Вы публикацию выполняете, запуская конфигуратор от администратора? наличие административных прав - не достаточно.
(27)Да конечно, так и делаю. Уже не первый раз вебсервер публикую. Попробую ещё подробнее сравнить с какими нибудь другими WS или попробую сделать новый сервис.
Понять бы что правильно ставить в полях "Пакеты XDTO" и "URI Пространство имен"
(28)пакеты xdto можно вообще ничего не ставить, а в URI - любое уникальное значение, по которому будет определяться wsопределение для подключения к wsпрокси.
(29) Сделал новый web сервис и все заработало. Подозреваю как раз из за пространства имен. В этот раз я поставил туда вебсервер/ws/названиесервиса
Видимо именно там и ищет операции программа.
Большое спасибо за помощь
(5) Возможно, я не работал ранее ни с тем ни с другим, поэтому все методом тыка. Задачу как то нужно решать. Поэтому нашел пример решения и пытаюсь действовать по нему.
Если научите как можно проще, буду благодарен
(8) А какой контекст задачи? Просто в http не нужно описывать все эти переменные и параметры и переопубликовывать сервис(ну в некоторых случаях конечно нужно).
Есть КА2 - Комплексная автоматизация
Есть ДО - документооборот
Между ними интеграция. В КА2 делаются заявки и согласовываются механизмами ДО.
Я из КА2 передаю в ДО текстовый уид документа. ДО ищет этот документ, заполняет ТабДок и в двоичном виде возвращает в КА2. Там я её открываю и печатаю.
Делается все довольно просто.
Потом из базы источника обращаетесь к http сервису базы приемника, получаете там двоичные данные, а в базе источника обрабатываете их. Сейчас попробовал передать ДД из одной базы в другую, все удачно получилось.
База ИСТОЧНИК
Запрос = Новый HTTPЗапрос;
Запрос.АдресРесурса = "/telegram_chanel/hs/tg_webhook";
Соединение = Новый HTTPСоединение("192.168.1.5");
Ответ = Соединение.Получить(Запрос);
ДД = Ответ.ПолучитьТелоКакДвоичныеДанные();
ДД.Записать("C:\Users\Odmin\Desktop\Новая папка (3)\out\ex_http.txt");
База приемник:
Ответ = Новый HTTPСервисОтвет(200);
ДД = Новый ДвоичныеДанные("C:\Users\Odmin\Desktop\Новая папка (3)\in\ex_http.txt");
Ответ.УстановитьТелоИзДвоичныхДанных(ДД);
Ответ.Заголовки.Вставить("Content-Type","text/html; charset=utf-8");
Возврат Ответ;
Вебсервис работает отлично, если правильно создать и правильно заполнить строку подключения. Оптимально использовать там, где необходима авторизация каждого пользователя.
Вот пример функции подключения:
Функция ПолучитьДанныеС1СДокументооборот(uid)
АдресДО = Константы.АдресВебСервиса1СДокументооборот.Получить();
АдресСервиса = "/ws/WSDOCMK.1cws?wsdl";
АдресWDSL = АдресДО + АдресСервиса;
ИмяПользователя = ПараметрыСеанса.ИнтеграцияС1СДокументооборотИмяПользователя;
ПарольПользователя = ПараметрыСеанса.ИнтеграцияС1СДокументооборотПароль;
Попытка
WSПрокси = ОбщегоНазначения.WSПрокси(АдресWDSL,"http://192.168.5.200/DocMK/ws/WSDOCMK","WSDOCMK",,ИмяПользователя,ПарольПользователя);
Исключение
Сообщить ("Не удалось подключиться к 1С Документооборот");
Возврат Неопределено;
КонецПопытки;
ДвоичныеДанные = WSПрокси.GETDATA(UID);
Возврат ДвоичныеДанные;
Показать
HTTP сервер - простая настройка, но проблемы с авторизацией. Мне пришлось сделать авторизацию на вебсервере по умолчанию (в файле vrd), только тогда заработала. Удобно использовать, если нет необходимости разделять пользователей.
Этот вариант мне не подошел, т.к. интеграция работает по сопоставлению пользователей КА2 и ДО, ввод авторизации по умолчанию ломает идентификацию пользователей ДО в КА2.
Если бы не получилось разобраться с WS, то вариантом работы остался бы HTTP, но пришлось бы сделать 2 публикации - одну для интеграции, другую для получения данных
Пример файла соединения для HTTP:
&НаСервере
Функция ПолучитьДанныеС1СДокументооборот(uid)
АдресСервиса = "/DocMK/hs/ObmenKA/";
АдресHTTP = АдресСервиса + uid;
Запрос = Новый HTTPЗапрос;
Запрос.АдресРесурса = АдресHTTP;
Соединение = Новый HTTPСоединение("192.168.5.200");
Ответ = Соединение.Получить(Запрос);
ДД = Ответ.ПолучитьТелоКакДвоичныеДанные();
Возврат ДД;
КонецФункции