TWS API: Примеры исходных кодов для самостоятельной интеграции 1C

Опубликовано 17.09.2019 - 10:26 пользователем admin

Предлагаемые исходные коды были протестированы в версии 1С 8.3 на управляемых формах.

Для интеграции с TWS предполагается использование двух функций: TWSСтарт и TWSЗапрос.

Перед началом обмена данными необходимо вызывать функцию TWSСтарт. Она вернёт объект ХттпСоединение,который будет использоваться во всех последующих вызовах функции TWSЗапрос. Функция TWSСтарт выполняет процедуру авторизации (запросы R0 и R1), а также устанавливает текущего пользователя (запрос R10) и заполняет параметр сеанса "TWSSessionKey", который необходим для будущих запросов.

Для работы функции необходимо создать:

  • Константы:
    • СерверTWS - URL сервера TWS для соединения ("tws.by").
    • TWSApiKey - ключ API (отображается в виртуальном офисе).
    • TWSVirtualOfficeID - ID виртуального офиса (отображается в виртуальном офисе).
    • TWSIDПользователя - ID пользователя в виртуальном офисе (отображается в виртуальном офисе).
    • TWSПарольПользователя - пароль пользователя.
  • Параметр сеанса:
    • TWSSessionKey - заполняется программно при начале работы с TWS

На стадии разработки можно использовать ключ API, ID и т.п. из Демо-Офиса. Для "боевого" использования эти данные потом просто заменятся в константах на реальные данные из вашего Виртуального офиса.

После авторизации бизнес-логика приложения реализуется вызовами функции TWSЗапрос. Она принимает соединение, номер запроса, список параметров запроса, а также флаг, определяющий, надо ли показывать пользователю сообщение об ошибке.

Функция TWSСтарт

Функция TWSСтарт ()
    ПараметрыСеанса.TWSSessionKey = "";
    
    ХттпСоединение = Новый HTTPСоединение(
        Константы.СерверTWS.Получить(), // Адрес сервера
        443, // Номер порта
        ,
        ,
        ,
        50, // Таймаут соединения в секундах
        Новый ЗащищенноеСоединениеOpenSSL); // ЗащищенноеСоединение
        
    Ответ = TWSЗапрос(ХттпСоединение,"r0");  
    
    Хэш = Новый ХешированиеДанных(ХешФункция.SHA256);
    Хэш.Добавить(СокрЛП(Ответ.Token)+СокрЛП(Константы.TWSApiKey.Получить()));
    
    Параметр = Новый СписокЗначений;
    Параметр.Добавить(СокрЛП(Константы.TWSVirtualOfficeID.Получить()),"VirtualOfficeID");
    Параметр.Добавить(Ответ.Token,"Token");
    Параметр.Добавить(Нрег(СтрЗаменить(Строка(Хэш.ХешСумма)," ","")),"Hash");                
 
    Ответ = TWSЗапрос(ХттпСоединение,"r1",Параметр);
    
    ПараметрыСеанса.TWSSessionKey = Ответ.SessionKey;
    
    // R10 - установка текущего пользователя, при необходимости
    Параметр = Новый СписокЗначений;
    Параметр.Добавить(СокрЛП(Константы.TWSIDПользователя.Получить()),"UserID");
    Параметр.Добавить(СокрЛП(Константы.TWSПарольПользователя.Получить()),"Password");
 
    Ответ = TWSЗапрос(ХттпСоединение,"r10",Параметр);
    
    Возврат  ХттпСоединение;
КонецФункции

Функция TWSЗапрос

Функция TWSЗапрос (Соединение, Запрос, Параметр=Неопределено, ВыводитьФлаг=Истина)
        Если не ПустаяСтрока(ПараметрыСеанса.TWSSessionKey) Тогда 
                Если Параметр = Неопределено Тогда
                        Параметр = Новый СписокЗначений;
                КонецЕсли;
                Параметр.Добавить(ПараметрыСеанса.TWSSessionKey,"SessionKey");
        КонецЕсли;

        СтрокаЗапроса = "";
        АдресЗапроса = "/tws/api/" + Запрос;

        Если Параметр <> Неопределено  Тогда
                Первый = 1;
                Для каждого Элемент Из Параметр Цикл
                        Если Первый Тогда
                                Амп = "";
                                Первый = 0;
                        Иначе
                                Амп = "&";
                        КонецЕсли;

                        СтрокаЗапроса = СтрокаЗапроса + Амп 
                                        + Элемент.Представление +"="+ Элемент.Значение;
                КонецЦикла;
        КонецЕсли;

        Заголовки = Новый Соответствие;    
        Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded;");

        HttpЗапрос1 = Новый  HttpЗапрос(АдресЗапроса,Заголовки) ;
        HttpЗапрос1.УстановитьТелоИзСтроки(СтрокаЗапроса);

        Ответ = Соединение.ОтправитьДляОбработки(HttpЗапрос1);  
        Чтение = Новый ЧтениеJSON;
        Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку("utf-8"));
        Попытка
                От = ПрочитатьJSON(Чтение);
        Исключение
                Сообщить(Ответ.ПолучитьТелоКакСтроку("utf-8")) ;
                ВызватьИсключение;
        КонецПопытки;
        Чтение.Закрыть();

        // Обработка ошибок
        Если От.error_code <> 0 Тогда
                Если ВыводитьФлаг Тогда
                        Сообщить("Код ошибки " + От.error_code + ": "+ От.error_message);
                КонецЕсли;
        КонецЕсли;

        Возврат От;
КонецФункции