Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 3
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Войти | Зарегистрироваться )



История благодарностей участнику Makcim1981 ::: Спасибо сказали: 4 раз
Дата поста: В теме: За сообщение: Спасибо сказали:
02.03.23, 12:10 API, передача параметров FormData в теле запроса
В общем ... я решил не заморачиваться и реализовал через Curl ... тоже возникло ряд ньюансов. если кому интересно, ниже поделюсь своей реализацией:

В глобальный модуль я добавил следующее:

// ===============================  
//Пересохраняем файл ответа полученый через Curl в формат понятный 1С 7.7 (русские буквы)
Процедура глПересохранениеОтветаurn(Файл) Экспорт
    
    Байт = 255;
    СтримВход = СоздатьОбъект("ADODB.Stream");
    СтримВход.Type        = 2;
    СтримВход.charset    = "utf-8";
    СтримВход.Open();
    СтримВход.LoadFromFile(КаталогИБ() + "urn\" + Файл);
    СтримВыход = СоздатьОбъект("ADODB.Stream");
    СтримВыход.Type                = 2;
    СтримВыход.charset            = "utf-8";  
    СтримВыход.charset            = "windows-1251";
    СтримВыход.LineSeparator    = -1;
    СтримВыход.Open();
    Всего = СтримВход.size;
    Пока СтримВход.EOS = 0 Цикл
        СтримВыход.WriteText(СтримВход.ReadText(Байт), ?(Байт = -2, 1, 0));
    КонецЦикла;
    СтримВыход.SaveToFile(КаталогИБ() + "urn\" + Файл, 2);
    
КонецПроцедуры  

// ===============================    
//Добавляем задержку в секундах, что бы Curl сохранил файл и следующие операции не использовали старые или несуществующие данные
Процедура глЗадержка(КоличествоСекунд) Экспорт

    Shell = СоздатьОбъект("WScript.Shell");
    Shell.Run("ping 127.0.0.1 -n "+КоличествоСекунд, 0, 1);
    
КонецПроцедуры          

// ===============================
//Формируем строку запроса по API для выполнения в Curl
Функция глСформироватьКурлСтроку(Конт,Метод,Параметр1 = "",Параметр2 = "") Экспорт  
        
    Если Метод = "order_list_get" Тогда
        СтрокаКурл = "curl -X POST """ + СокрЛП(Конт.Фирма.АдресAPIiFurn) + """ -H ""Content-Type: multipart/form-data"" -H ""key: " + СокрЛП(Конт.Фирма.KeyAPIiFurn) + """ -H ""action: " + СокрЛП(Метод) +  """ -F ""id=" + СокрЛП(Параметр1) + """ -o " + КаталогИБ() + "urn\order.json";
    
    КонецЕсли;
              
    
    Возврат СтрокаКурл;
КонецФункции


Ну и модуле формы документа

Процедура ЗагрузитьИзurn()
    
    Если ПустоеЗначение(urni) = 1 Тогда
        Сообщить("Поле Номер замовлення в urn не заповнене !","!");
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;
    
    ЗапуститьПриложение(глСформироватьКурлСтроку(Контекст,"order_list_get",СокрЛП(urni))); // Отправляем номер заказа - urni
    //если на сделать задержку на выолнение скрипта Curl (а именно его мы и запускаем),
    //то выполнение кода опередит сохранение ответа в файл, что в свою очередь приведет либо к ошибке (если файла ещё нет),
    //либо прочитаются старые данные файла
    глЗадержка(3);
    глПересохранениеОтветаiFurn("order.json");
    
    Данные = СоздатьОбъект("Текст");
    Данные.КодоваяСтраница(0);
    Данные.Открыть( КаталогИБ() + "urn\order.json");
    КолСтр  = Данные.КоличествоСтрок();
    
    Для н=1 по КолСтр Цикл
        ТекСтр = Данные.ПолучитьСтроку(н);
        //Обработка полученной строки
    КонецЦикла;
    
КонецПроцедуры


Vofka,
22.06.22, 13:30 Кодировка ответа в 1С по запросу API

попробовал по другому


    httpRequest = СоздатьОбъект("MSXML2.xmlhttp");
    httpRequest.open("POST", "https://api.ifur.net/api",0);
    httpRequest.setRequestHeader("Content-Type", "text/xml");
    httpRequest.setRequestHeader("key", "MasterKey");
    httpRequest.setRequestHeader("action", "client_get");
      
    httpRequest.send();
    
    ОтветСервера = httpRequest.responseText;



так отработало нормально. нет проблем с кодировками
Tunaxx,
21.06.22, 10:38 Кодировка ответа в 1С по запросу API
Добрый день. Есть задача соединить 1С 7.7 и сайт посредством API. Ранее API в 1С никогда не использовал. Воспользовался гуглом, нашел, как ни странно, не много информации, но все же. Накидал в 1С небольшую процедурку:

Процедура Сформировать()    

    ИмяФайлаBody = "d:\Temp\test.json";
    
    ТочкаВхода="https://api.ifurni.net/api/";

    oADOStream = СоздатьОбъект("ADODB.Stream");
    oADOStream.Type = 1; //Binary
    oADOStream.Open();
    oADOStream.LoadFromFile(ИмяФайлаBody);

    WinHttp = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");

    //Отключаем проверку сертификата
    Скрипт= СоздатьОбъект("MSScriptControl.ScriptControl");
    Скрипт.language="javascript";
    Скрипт.AddObject("WinHttp",WinHttp);
    Скрипт.Eval("WinHttp.Option(4)=13056");//intSslErrorIgnoreFlags
    Скрипт.Eval("WinHttp.Option(6)=true");//blnEnableRedirects
    Скрипт.Eval("WinHttp.Option(12)=true");//blnEnableHttpsToHttpRedirects
    //Сам запрос
    WinHttp.Open("POST", ТочкаВхода, 0);
    //WinHttp.setRequestHeader("Accept", "text/json");
    WinHttp.setRequestHeader("Content-type", "text/json");    
    WinHttp.SetRequestHeader("Content-length", "" + oADOStream.Size);     
    WinHttp.SetRequestHeader("key", "MasterKey");  
    WinHttp.SetRequestHeader("action", "get_worker_list");    
    
    Попытка
        WinHttp.Send(oADOStream);
                
        СтрокаОтветаНаЗапрос = WinHttp.ResponseText();  

       тк=СоздатьОбъект("Текст");
        тк.ДобавитьСтроку(СтрокаОтветаНаЗапрос);
        тк.Записать("D:\temp\test_return.json");

        Статус = СокрЛП(WinHttp.Status);
        Описание = СокрЛП(WinHttp.StatusText);    
        Сообщить(СтрокаОтветаНаЗапрос);  
    Исключение
        Сообщить("Ошибка: "+ОписаниеОшибки(),"!");
    КонецПопытки;
КонецПроцедуры


Тело запроса грузится из переменной - ИмяФайлаBody. Ответ получаем в строке Сообщения (если ответ не будет слишком велик и не выдаст ошибку, это не проблема) ну и записывваем в файл test_return.json.

Все полностью отрабатывается и получаем ответ:

{"status":"ok","error":"","data":{"client_1":{"phone":"+38 (097) 875-26-44","name":"???»N?N???N? 1","ifp_id":"125","code":null}}}


И Вот сам вопрос ... как мне получить Кирилические символы в нормальном виде. (в данном примере вот они - "name":"???»N?N???N? 1")

Пробовал добавлять в заголовки:

WinHttp.SetRequestHeader("Accept-Language", "ru");
WinHttp.SetRequestHeader("Accept-Charset", "utf-8");
WinHttp.SetRequestHeader("Content-Language", "ru");
WinHttp.SetRequestHeader("Content-Charset", "utf-8");


Также перед отправкой метода POST:

WinHttp.Option(2,"utf-8");


Результат один и тот же.

Ещё хотел поинтересоватся, кто уже работал с API. Есть какие то готовые парсеры для строки или каждый API по разному разбирается, нет каких то статичных якорей и т.д. В общем посоветуйте как лучше разбирать

Спасибо.
kuzemchak,
23.09.17, 17:31 Универсальная свертка базы данных
Обработка отличная но в ТиСе при запуске просто вылетает 1с
MaxST,

RSS Текстовая версия Сейчас: 21.08.25, 21:29
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!