Имя: Пароль:
1C
1С v8
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
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
благодарю
AdBlock убивает бесплатный контент. 1Сергей