|
1С & SOAP: Ошибка при получении данных | ☑ | ||
---|---|---|---|---|
0
kolesnikov
28.11.16
✎
12:56
|
Добрый день.
В связи с тем что 1с-программистов, работающих с веб-сервисами, нет, пришлось самому попробовать взяться за некую авантюру (с 1с, к сожалению, дел имел мало) Дело в том, что у нас на предприятии есть информационная система(бд MSSQL),с поднятым на той стороне веб-сервисом, принимающим и отдающим штатную структуру, приказы по кадрам,список сотрудников и т.п. Есть потребность эти данные из 1С туда перегружать. Для начала хотел попробовать авторизоваться на сервере методом Login(String UserName, String Password), потом получить штатную структуру GetStaffTree(AuthHeader authHeader) и перенести ее в форму 1С. Токен authHeader получается при авторизации Сложность возникла после авторизации на сервисе Описание метода Login POST /ImportStaff.asmx HTTP/1.1 Host: ip Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "http://.../Login" <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <Login xmlns="http:/.../"> <Username>string</Username> <Password>string</Password> </Login> </soap:Body> </soap:Envelope> HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <LoginResponse xmlns="http://.../"> <LoginResult>string</LoginResult> </LoginResponse> </soap:Body> </soap:Envelope> метод GetStaffTree: POST /ImportStaff.asmx HTTP/1.1 Host: ip Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "http://.../GetStaffTree" <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <GetStaffTree xmlns="http://..."> <authHeader> <AuthenticatedToken>string</AuthenticatedToken> </authHeader> </GetStaffTree> </soap:Body> </soap:Envelope> HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <GetStaffTreeResponse xmlns="http://.../"> <GetStaffTreeResult> <StaffTree> <StaffTreeID>int</StaffTreeID> <Name>string</Name> <ShortName>string</ShortName> <Code>string</Code> <IsDirectory>short</IsDirectory> <ParentName>string</ParentName> <ParentCode>string</ParentCode> <ParentShortName>string</ParentShortName> </StaffTree> <StaffTree> <StaffTreeID>int</StaffTreeID> <Name>string</Name> <ShortName>string</ShortName> <Code>string</Code> <IsDirectory>short</IsDirectory> <ParentName>string</ParentName> <ParentCode>string</ParentCode> <ParentShortName>string</ParentShortName> </StaffTree> </GetStaffTreeResult> </GetStaffTreeResponse> </soap:Body> </soap:Envelope> В 1С авторизовался: Прокси = WSСсылки.WSCсылка1.СоздатьWSПрокси("http://...", "ImportStaff", "ImportStaffSoap"); Авторизация = Прокси.Login("Username","Password"); На форму выносил Поле, отображал там результат авторизации - успешно отображает токен. далее использовал метод GetStaffTree Данные = Прокси.GetStaffTree(Авторизация); Результат - ошибка несоответствия типов: Ошибка при вызове метода контекста (GetStaffTree) Данные = Прокси.GetStaffTree(Авторизация); по причине: Несоответствие типов (параметр номер '1') Судя по всему проблема в том, что токен получился строковый, а тип, который ждет метод GetSTaffTree, должен быть authHeader http://clip2net.com/clip/m247726/6cc52-clip-37kb.png http://clip2net.com/clip/m247726/dc49d-clip-33kb.png Подскажите пожалуйста можно ли как-то выпутаться из этой ситуации и отобразить полученные данные в размещенной таблице на форме? Как корректно оперировать токеном? версия: 8.2.15.319 |
|||
1
Fragster
гуру
28.11.16
✎
12:58
|
ты передаешь строку, а надо передавать что-то с типом, похожим на authHeader
|
|||
2
Fragster
гуру
28.11.16
✎
12:58
|
смотри синтакс помощник Фабрика.Создать()
|
|||
3
impulse9
28.11.16
✎
12:58
|
Вы должны в XDTO пакетах в 1С описать все используемые типы
|
|||
4
impulse9
28.11.16
✎
12:59
|
В гугле много информации про настройку веб-сервисов в 1С, как со стороны сервера, так и со стороны клиента
|
|||
5
Serginio1
28.11.16
✎
13:37
|
Скорее всего тебе нужно создать AuthHeader
и в поле AuthenticatedToken Передать Авторизация.LoginResult |
|||
6
kolesnikov
28.11.16
✎
14:04
|
>Скорее всего тебе нужно создать AuthHeader
>и в поле >AuthenticatedToken >Передать >Авторизация.LoginResult Если несложно подскажите пожалуйста примерно как бы это выглядело? |
|||
7
Serginio1
28.11.16
✎
14:13
|
Фабрика=Прокси.ФабрикаXDTO;
AuthHeaderТип =Фабрика.Тип(ПространствоИмен, "AuthHeader"); AuthHeader= Фабрика.Создать(AuthHeaderТип); AuthHeader.AuthenticatedToken = Авторизация.LoginResult; А вообще почитай для начала http://catalog.mista.ru/public/171019/ с первой серии |
|||
8
kolesnikov
28.11.16
✎
14:14
|
отчасти проблема еще и в том что не совсем получается правильно задать гуглу вопрос чтобы получить правильный ответ.
+где-то видел частичные примеры работы 1с и веб-сервисов через xmlhttp и вследствие отсутствия опыта не пойму каким способом легче реализовать задачу в данном случае |
|||
9
kolesnikov
28.11.16
✎
14:14
|
>http://catalog.mista.ru/public/171019/
благодарю, гляну |
|||
10
Serginio1
28.11.16
✎
14:22
|
Можно упростить себе проблему. Я так понимаю у вас там сайт написан на .Net то тебе могут помочь тамошние C# ники
v8: v8: Использование сборок .NET в 1С 7.x и 8.x Использование классов .Net в 1С для новичков http://ru.stackoverflow.com/questions/527763/%d0%9a%d0%b0%d0%ba-%d0%b2%d1%8b%d0%b7%d0%b2%d0%b0%d1%82%d1%8c-%d0%bc%d0%b5%d1%82%d0%be%d0%b4-%d0%b8%d0%b7-c-%d0%b2-1%d0%a1/527802#527802 |
|||
11
kolesnikov
29.11.16
✎
09:22
|
>Вы должны в XDTO пакетах в 1С описать все используемые типы
Должен ли я описывать эти типы, если они в WSСсылке из подтянутой wsdl в Типах объектах лежат? пардон,понимаю что вопросы глупые, но ни разу со всем этим добром дел не имел. |
|||
12
Dotoshin
29.11.16
✎
09:48
|
(11) Если с xdto совсем дел не имел, то лучше начать с теории:
http://catalog.mista.ru/public/98019/ https://www.youtube.com/watch?v=WkTsBycP57Y |
|||
13
h-sp
29.11.16
✎
09:50
|
(11) поставьте хотя бы 8.2.19. С какой целью на такой старой платформе работаете?
|
|||
14
kolesnikov
29.11.16
✎
09:56
|
промежуточно пока попробовал сделать так
Прокси = WSСсылки.Aviabit.СоздатьWSПрокси("http://.../", "ImportStaff", "ImportStaffSoap"); Фабрика = Прокси.ФабрикаXDTO; Тип_AuthHeader = Фабрика.Создать(Фабрика.Тип("http://.../","AuthHeader")); Тип_AuthHeader.AuthenticatedToken = Прокси.Login("_username_","_pwd_"); AuthHeader1 = Тип_AuthHeader.AuthenticatedToken; //пробное поле на форме. делал чтобы увидеть получается ли токен ШС = Прокси.GetStaffTree(Тип_AuthHeader); |
|||
15
kolesnikov
29.11.16
✎
09:57
|
ошибки не выдало, будем дальше ковырять.
|
|||
16
kolesnikov
30.11.16
✎
04:03
|
после некоторых более осознанных махинаций получилось выгрузить штатку
всем спасибо. |
|||
17
kolesnikov
30.11.16
✎
04:41
|
возник небольшой нюанс.
в передаваемой структуре <StaffTree> <StaffTreeID>int</StaffTreeID> <Name>string</Name> <ShortName>string</ShortName> <Code>string</Code> <IsDirectory>short</IsDirectory> <ParentName>string</ParentName> <ParentCode>string</ParentCode> <ParentShortName>string</ParentShortName> </StaffTree> Есть параметр IsDirectory типа short. http://clip2net.com/s/3EWSXxm В базе,с которой дергаются данные, имеет значения 0-1-2 В реквизите столбца таблицы я выставил тип данных "Число". В итоге числа 1-2 отображаются, 0 нет. Из описания к методу: IsDirectory Тип данных: Целое число Описание: Тип записи 0 – должность 1 – подразделение 2 – вид должности со строчными данными проблем нет. short нужно отдельно прописывать через ФабриXDTO.Тип? заполнение таблицы сейчас происходит следующим образом: Для Каждого Элемент из Тип_ArrayOfStaffTree.StaffTree Цикл НоваяСтрока = ШтатнаяСтруктура.Добавить(); НоваяСтрока.Код = Элемент.Code; НоваяСтрока.Название = Элемент.Name; НоваяСтрока.НазваниеКоротко = Элемент.ShortName; НоваяСтрока.Тип = Элемент.IsDirectory; НоваяСтрока.КодРодителя = Элемент.ParentCode; НоваяСтрока.НазваниеРодителя = Элемент.ParentName; НоваяСтрока.НазваниеРодителяКоротко = Элемент.ParentShortName; КонецЦикла; |
|||
18
mehfk
30.11.16
✎
04:48
|
>>В итоге числа 1-2 отображаются, 0 нет.
У поля формы выбери формат представления нуля. |
|||
19
kolesnikov
30.11.16
✎
04:54
|
благодарю
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |