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

Хранилище

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

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




>  API, передача параметров FormData в теле запроса
Makcim1981
Отправлено: 02.03.23, 15:43


Общительный
**

Группа: Пользователи
Сообщений: 12
Регистрация: 14.08.13
Пользователь №: 29179


Цитата(Makcim1981 @ 02.03.23, 12:10) *
глПересохранениеОтветаiFurn("order.json");


Извините, тут правильное название процедуры глПересохранениеОтветаurn("order.json");

Немного поясню, что в моем примере делается:

Имеем:

Заголовки:
URL: СокрЛП(Конт.Фирма.АдресAPIiFurn)
key: Конт.Фирма.KeyAPIiFurn
action: order_list_get

FormData: параметры передаются в теле (я передаю 1, но вы по аналогии можете кидать сколько угодно, главное добавить в строке формирования)

id=Параметр1 (Пусть вас не смущает id, это название параметра у меня(у вас оно может быть любым другим))

КаталогИБ() + "urn\order.json" - Сюда сохраняю ответ, который в последствии конвертирую в понятную для 1с 7.7 кодировку.
  Форум: Программирование в 1С Предприятие 7.7 · Просмотр сообщения: #176877 · Ответов: 4 · Просмотров: 1437
 

>  API, передача параметров FormData в теле запроса
Makcim1981
Отправлено: 02.03.23, 12:10


Общительный
**

Группа: Пользователи
Сообщений: 12
Регистрация: 14.08.13
Пользователь №: 29179


В общем ... я решил не заморачиваться и реализовал через 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 по КолСтр Цикл
        ТекСтр = Данные.ПолучитьСтроку(н);
        //Обработка полученной строки
    КонецЦикла;
    
КонецПроцедуры


  Форум: Программирование в 1С Предприятие 7.7 · Просмотр сообщения: #176873 · Ответов: 4 · Просмотров: 1437
 

>  API, передача параметров FormData в теле запроса
Makcim1981
Отправлено: 01.03.23, 10:28


Общительный
**

Группа: Пользователи
Сообщений: 12
Регистрация: 14.08.13
Пользователь №: 29179


Vofka @ Сегодня, 9:08 * ,
Цитата(Vofka @ 01.03.23, 9:08) *
Запросы выглядят странно. Запрос FormData должен содержать в теле строку с именами и значениями параметров.

вот такой он дикий синтаксис 1С 7.7 ... в 8-ке єто делается легко и просто, а тут геморой. Пока нашел как "правильно" передать перечитал кучу всего.

      //1 параметр
      |Content-disposition: form-data; name=""id""" + РазделительСтрок +
    РазделительСтрок + "
      |64309" + РазделительСтрок + "
      |--" + Boundary + "--"
;


id - имя; 64309 - значение

тут 2-ва варианта ... .Net использовать или Curl. Я через курл сейчас все получаю, решил не заморачиваться, но разобраться было бы интересно
  Форум: Программирование в 1С Предприятие 7.7 · Просмотр сообщения: #176869 · Ответов: 4 · Просмотров: 1437
 

>  API, передача параметров FormData в теле запроса
Makcim1981
Отправлено: 28.02.23, 16:44


Общительный
**

Группа: Пользователи
Сообщений: 12
Регистрация: 14.08.13
Пользователь №: 29179


Добрый день.

1С 7.7

Стоит задача организовать обмен и получение данных через API. Проблема с передачей параметров FromData. При этом совершенно для меня непонятно почему так.
1. В первом случае передается 1 параметр и отрабатывается все нормально. (ТекстЗапроса_article_by_code_firm)
2. Во втором случаи тоже один параметр, запрос отрабатывается но пишет - "error": "Set right format [id] - put techId pro!" ... что пишет я понимаю, но как подать параметр другого типа данных не знаю. (ТекстЗапроса_order_list_get)
3. Передаю 2-ва параметра. Вообще запрос не отрабатывается, постоянно ошибка. (ТекстЗапроса_articles_firm)

Процедура test()
    URL = "https://api2.ifur.pro/api/";
    Токен = "хххххххххххххххххххххххххххххххххх";
    boundary = "7MA4YWxkTrZu0gW";  
    
    ТекстЗапроса_article_by_code_firm="--"+boundary+"
      //1 параметр
      |Content-disposition: form-data; name=""code1c""" + РазделительСтрок +
    РазделительСтрок + "
      |125" + РазделительСтрок + "
      |--" + Boundary + "--"
;      
      
    ТекстЗапроса_articles_firm="--"+boundary+"
      //1 параметр    
      |Content-disposition: form-data; name=""lang""" + РазделительСтрок +
    РазделительСтрок + "
      |ru" + РазделительСтрок + "
      |--" + Boundary + "
      //2 параметр  
      |Content-disposition: form-data; name=""zip""" + РазделительСтрок +
    РазделительСтрок + "
      |1" + РазделительСтрок + "
      |--" + Boundary + "--"
;  
      
      ТекстЗапроса_order_list_get="--"+boundary+"
      //1 параметр
      |Content-disposition: form-data; name=""id""" + РазделительСтрок +
    РазделительСтрок + "
      |64309" + РазделительСтрок + "
      |--" + Boundary + "--"
;
      
      Запрос = СоздатьОбъект("winhttp.winhttprequest.5.1");    
    Запрос.open("POST", url, 0);
    Запрос.SetRequestHeader("key", Токен);  
    Запрос.SetRequestHeader("action", "article_by_code_firm"); // ТекстЗапроса_article_by_code_firm
    //Запрос.SetRequestHeader("action", "articles_firm");  // ТекстЗапроса_articles_firm
    //Запрос.SetRequestHeader("action", "order_list_get");  // ТекстЗапроса_order_list_get
    
    Запрос.setRequestHeader("Content-Type","multipart/form-data;boundary=" + Boundary);
    Запрос.setRequestHeader("Content-Length", СтрДлина(ТекстЗапроса_article_by_code_firm));
    
    Запрос.send(ТекстЗапроса_article_by_code_firm);
    Если (Запрос.Status = 200) тогда
        Ответ = Запрос.ResponseText;  
        
        тк=СоздатьОбъект("Текст");  
        тк.ДобавитьСтроку(Ответ);        
        тк.Записать("D:\temp\answer.json");
        
    Иначе
        ТекстОшибки = "Ошибка: " + Запрос.status + " : " + Запрос.statusText;
        Сообщить(ТекстОшибки);
    КонецЕсли;
                  
КонецПроцедуры


Буду признателен если поможете. Для 7.7 либо тут уже домучать как то, либо прийдется что-то внешнее подключать. Задача примитивная, но в стандартной 7-ке с инструментами для ее решения не очень.

Спасибо.
  Форум: Программирование в 1С Предприятие 7.7 · Просмотр сообщения: #176862 · Ответов: 4 · Просмотров: 1437
 

>  Кодировка ответа в 1С по запросу API
Makcim1981
Отправлено: 22.06.22, 13:30


Общительный
**

Группа: Пользователи
Сообщений: 12
Регистрация: 14.08.13
Пользователь №: 29179



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


    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;



так отработало нормально. нет проблем с кодировками
  Форум: Программирование в 1С Предприятие 7.7 · Просмотр сообщения: #175880 · Ответов: 9 · Просмотров: 2227
 

>  Кодировка ответа в 1С по запросу API
Makcim1981
Отправлено: 22.06.22, 12:06


Общительный
**

Группа: Пользователи
Сообщений: 12
Регистрация: 14.08.13
Пользователь №: 29179


popenko @ Сегодня, 11:52 * ,
Не помогло ... мне кажется, что проблема в самом объекте WinHttp = СоздатьОбъект("WinHttp.WinHttpRequest.5.1") ... точнее в правильной передаче параметров в него.

уже на этом этапе возвращается СтрокаОтветаНаЗапрос = WinHttp.ResponseText(); строка с краказябрами которые нельзя конвертировать. То есть мне кажется, что в самом объекте уже перекодируется на нечитаемую фигню.

После примененного выше совета разница не велика )

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

Просто убрало один символ функцией


Прийдется либо curl либо другой объект пробовать (((
  Форум: Программирование в 1С Предприятие 7.7 · Просмотр сообщения: #175879 · Ответов: 9 · Просмотров: 2227
 

>  Кодировка ответа в 1С по запросу API
Makcim1981
Отправлено: 22.06.22, 9:14


Общительный
**

Группа: Пользователи
Сообщений: 12
Регистрация: 14.08.13
Пользователь №: 29179


Цитата(Vofka @ 22.06.22, 9:59) *
что-то из этого не работает?

WinHttp.setRequestHeader("Content-type", "text/json;Charset=ISO-8859-1");


WinHttp.setRequestHeader("Content-type", "text/json;Charset=UTF-8");


WinHttp.setRequestHeader("Content-type", "text/json;Charset=Windows-1251");


Тоже ничего не меняет. Меня смущает само представление в котором я получаю ответ "name":"???»N?N???N? 1" (там должно быть "name": "Клієнт 1"), представление какое то, как будто уже, что то перекодировываться пыталось.

Цитата(Vofka @ 22.06.22, 9:59) *
Что за Монитор?


ну в отладчике я имел ввиду ... при отладке кода глянул
  Форум: Программирование в 1С Предприятие 7.7 · Просмотр сообщения: #175875 · Ответов: 9 · Просмотров: 2227
 

>  Кодировка ответа в 1С по запросу API
Makcim1981
Отправлено: 21.06.22, 20:17


Общительный
**

Группа: Пользователи
Сообщений: 12
Регистрация: 14.08.13
Пользователь №: 29179


Vofka @ Сегодня, 15:43 * ,

Указать кодировку для Объекта типа текст можно (ну и только, что попробовал на всякий случай), по Монитору четко видно, что сама функция WinHttp.ResponseText() возвращает уже в кракозябрах. Я так понимаю как то надо указать напрямую до запроса, но не могу понять как
  Форум: Программирование в 1С Предприятие 7.7 · Просмотр сообщения: #175872 · Ответов: 9 · Просмотров: 2227
 

>  Кодировка ответа в 1С по запросу API
Makcim1981
Отправлено: 21.06.22, 14:24


Общительный
**

Группа: Пользователи
Сообщений: 12
Регистрация: 14.08.13
Пользователь №: 29179


Vofka @ Сегодня, 14:48 * ,
Цитата
А так?
WinHttp.SetRequestHeader("Accept-Charset", "windows-1251");
WinHttp.SetRequestHeader("Content-Charset", "windows-1251");


WinHttp.Option(2,"windows-1251");


ответ тот же ... поражает то, что не важно, что я ставлю windows-1251 или utf-8 ответ один и тот же, прокозябры ("???»N?N???N? 1") не меняются

при этом разработчик пишет, что кодировка utf-8
  Форум: Программирование в 1С Предприятие 7.7 · Просмотр сообщения: #175858 · Ответов: 9 · Просмотров: 2227
 

>  Кодировка ответа в 1С по запросу API
Makcim1981
Отправлено: 21.06.22, 10:38


Общительный
**

Группа: Пользователи
Сообщений: 12
Регистрация: 14.08.13
Пользователь №: 29179


Добрый день. Есть задача соединить 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 по разному разбирается, нет каких то статичных якорей и т.д. В общем посоветуйте как лучше разбирать

Спасибо.
  Форум: Программирование в 1С Предприятие 7.7 · Просмотр сообщения: #175852 · Ответов: 9 · Просмотров: 2227
 

>  Универсальная свертка базы данных
Makcim1981
Отправлено: 23.09.17, 17:31


Общительный
**

Группа: Пользователи
Сообщений: 12
Регистрация: 14.08.13
Пользователь №: 29179


Обработка отличная но в ТиСе при запуске просто вылетает 1с
  Форум: Отчеты / Обработки · Просмотр сообщения: #132508 · Ответов: 57 · Просмотров: 71729
 

>  1С: Бухгалтерия для Украины 2.0
Makcim1981
Отправлено: 04.11.16, 14:25


Общительный
**

Группа: Пользователи
Сообщений: 12
Регистрация: 14.08.13
Пользователь №: 29179


Обновил с редакции 1.2 до 2.0. Поработали 1 день, нашел кучу недоработок и откатил назад. Конфигурация пока не готова для нормального использования, ставить не советую бухгалтерия вас задолбет.
  Форум: Бухгалтерия 8, редакция 2 для Украины · Просмотр сообщения: #118666 · Ответов: 22 · Просмотров: 15216
 


Новые сообщения  Открытая тема (есть новые ответы)
Опрос  Опрос (есть новые голоса)
Нет новых сообщений  Открытая тема (нет новых ответов)
Нет новых голосов  Опрос (нет новых голосов)
Популярная тема  Горячая тема (есть новые ответы)
Закрыта  Закрытая тема
Нет новых  Горячая тема (нет новых ответов) Перемещена  Тема перемещена
 

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