Имя: Пароль:
1C
 
query string в данные 1с
0 1c_yeah
 
15.12.20
16:12
Всем привет.
Подскажите как преобразовать данные в формате Query String в данные 1с (массив структур, соответствие и тп).

Пример строки Query String

requestType=apiCallCompleted¶&attemptsCounter=2¶&callDetails[companyID]=18628¶&callDetails[generalCallID]=2295645083¶&callDetails[callID]=2295645083¶&callDetails[startTime]=1607961242¶&callDetails[callType]=1¶&callDetails[internalNumber]=107¶&callDetails[internalAdditionalData]=¶&callDetails[externalNumber]=0958767043¶&callDetails[waitsec]=43&callDetails[billsec]=232¶&callDetails[disposition]=ANSWER&callDetails[recordingStatus]=uploaded¶&callDetails[isNewCall]=0¶&callDetails[customerData][id]=19457215¶&callDetails[customerData][name]=Устинов+Игорь¶&callDetails[employeeData][name]=Богдан+Нагорний¶&callDetails[employeeData][email]=bn%40vencon.ua¶&callDetails[pbxNumberData][number]=0443344047¶&callDetails[historyData][0][waitsec]=43¶&callDetails[historyData][0][billsec]=232¶&callDetails[historyData][0][disposition]=ANSWER¶&callDetails[historyData][0][pbxNumberData][number]=0443344047¶&callDetails[linkToCallRecordOverlayInMyBusiness]=https%3A%2F%2Fmy.binotel.ua%2F%3Fmodule%3Dhistory%26subject%3D0958767043%26sacte%3Dovl-link-pb-2295645083¶&callDetails[linkToCallRecordInMyBusiness]=https%3A%2F%2Fmy.binotel.ua%2F%3Fmodule%3Dcdrs%26action%3DgenerateFile%26fileName%3D2295645083.mp3%26callDate%3D2020-14-12_17%3A54%26customerNumber%3D0958767043%26callType%3Doutgoing
1 mikecool
 
15.12.20
16:14
парсить программно
2 1c_yeah
 
15.12.20
16:16
(1) Это понятно. Может есть готовые способы? Гугли не нашел что бы у кого-то возникала такая необходимость.
3 mikecool
 
15.12.20
16:18
(2) откуда получил результат? может есть другие варианты?
это же строка запроса для сайта?
4 Кирпич
 
15.12.20
16:20
СтрРазделить(,"&")
потом каждую строчку СтрРазделить(,"=")
5 1c_yeah
 
15.12.20
16:20
(3) Не, других нету. На мой урл сервер телефонии шлет только в таком виде информацию о звонке
6 Кирпич
 
15.12.20
16:24
ну и РаскодироватьСтроку( ,СпособКодированияСтроки.КодировкаURL)
для всяких https%3A%2F%2Fmy.binotel.ua
7 oleg-alt
 
15.12.20
16:36
(3) Для GET-запроса данных многовато, там ограничение в 256 символов
8 acht
 
15.12.20
16:37
(7) > ограничение в 256 символов

Это тебе на будущее:
https://stackoverflow.com/questions/812925/what-is-the-maximum-possible-length-of-a-query-string
9 Кирпич
 
15.12.20
16:48
(0) На вот. Копипасть и беги в кассу.

&НаСервере
Функция ЗапросВСоответствие(Данные)
    Список = Новый Соответствие();
    Строки = СтрРазделить(РаскодироватьСтроку(Данные,СпособКодированияСтроки.КодировкаURL),"&");
    Для Каждого Стр Из Строки Цикл
        Парам = СтрРазделить(Стр,"=");    
        Список.Вставить(Парам[0],Парам[1]);
    КонецЦикла;
    Возврат Список;
КонецФункции
10 1c_yeah
 
15.12.20
17:02
(7) Пост запросом присылают
11 1c_yeah
 
15.12.20
17:03
(9) Ну там не настолько простая структура, я бы не спрашивал если бы можно было бы так распарсить
12 1c_yeah
 
15.12.20
17:09
Например вот эта строка
&callDetails[historyData][0][disposition]=ANSWER

в данных 1с (например в структуре) будет выглядеть вот так

callDetails.historyData[0].disposition = ANSWER

callDetails - Ключ, Значение = Структура с ключем historyData
Значение historyData = Массив Структур, Каждый элемент которой содержит Ключ disposition
13 Кирпич
 
15.12.20
17:10
(12) А ну тогда парсер пиши
14 oleg-alt
 
15.12.20
17:46
(8) Вы меня не знаете, а уже на ты :)
У вас так принято?
п.с.
1. про чтение RFC надо было ссылку на источник давать w3c.org (Комитет по стандартизации Интернет)
2. Ни один здравомыслящий web-разработчик не будет рисковать и делать get-запросы в неразумных пределах, т.к. он понятия не имеет тип браузера пользователя. Да и вообще в открытом формате запросы передавать не делают "даже" китайские роутеры ТП-Линк, они их не просто шифруют, а еще и случайно генерируют каждый раз.
15 mistеr
 
15.12.20
17:49
(0) Хз что за формат. Символы "¶" может лишние?
16 acht
 
15.12.20
18:58
(14) Да я с тобой, собственно, и не собираюсь знакомится.
Найди, пожалуйста, слово "браузер" в обсуждаемой проблеме. Потом можешь вспомнить и пофилософствовать еще про https какой-нибудь.
17 acht
 
15.12.20
19:00
(0) Если допустить, что тебе в querystring не будут передавать вложенные массивы, типа a[b[10]], то как-то так:

Функция РазобратьСтрокуЗапроса(Строка)
        
    Результат = Новый Соответствие;
    Чтение = Новый ЧтениеJSON;

    Параметры = СтрРазделить(Строка, "&" + Символы.ПС + Символы.ВК, Ложь);
    Для Каждого Параметр Из Параметры Цикл
        ЧастиПараметра = СтрРазделить(Параметр, "=");
        
        Строка = СтрЗаменить(Параметр, "[", """:{""");
        Строка = СтрЗаменить(Строка, "]", "");
        Строка = СтрЗаменить(Строка, "=", """:""");
        Строка = "{""" + Строка + """}";
        Для Индекс = 1 По СтрЧислоВхождений(Параметр, "]") Цикл
            Строка = Строка + "}";
        КонецЦикла;
        
        Чтение.УстановитьСтроку(Строка);
        РазобраныйПараметр = ПрочитатьJSON(Чтение, Истина);
        
        Для Каждого КлючЗначение Из РазобраныйПараметр Цикл
            Ключ = РаскодироватьЧастьПараметра(КлючЗначение.Ключ);
            ДобавитьВСоответствиеРекурсивно(Результат, Ключ, КлючЗначение.Значение);
        КонецЦикла;
    КонецЦикла;
    
    Возврат Результат;
    
КонецФункции

Процедура ДобавитьВСоответствиеРекурсивно(Приемник, Ключ, Значение)
    
    ТекущееЗначение = Приемник[Ключ];
    
    Если ТипЗнч(ТекущееЗначение) = Тип("Соответствие") Тогда
        Для Каждого КлючЗначение Из Значение Цикл
            ДобавитьВСоответствиеРекурсивно(ТекущееЗначение, КлючЗначение.Ключ, КлючЗначение.Значение);
        КонецЦикла;
        
    ИначеЕсли ТипЗнч(Значение) = Тип("Строка") Тогда
        Приемник[Ключ] = РаскодироватьЧастьПараметра(Значение);
        
    Иначе
        ПриемникКлюча = Новый Соответствие;
        Для Каждого КлючЗначение Из Значение Цикл
            ДобавитьВСоответствиеРекурсивно(ПриемникКлюча, КлючЗначение.Ключ, КлючЗначение.Значение);
        КонецЦикла;
        Приемник[Ключ] = ПриемникКлюча;
        
    КонецЕсли;
    
КонецПроцедуры

Функция РаскодироватьЧастьПараметра(Значение)
    
    Результат = СтрЗаменить(Значение, "+", " ");
    Результат = РаскодироватьСтроку(Результат, СпособКодированияСтроки.КодировкаURL);
    
    Возврат Результат;
    
КонецФункции
18 acht
 
15.12.20
19:02
Строку

ЧастиПараметра = СтрРазделить(Параметр, "=");

можно выбросить
Ошибка? Это не ошибка, это системная функция.