В 1С нет встроенной функции для разбора application/x-www-form-urlencoded строки параметров, которая обычно передается из HTML форм и выглядит вот так:
login=smith&password=12345678
Казалось бы, все просто, но некоторые сервисы умудряются отправлять в такой строке большое количество разнообразных данных, в том числе и массивы объектов. Например, вот так:
custom_fields[0][name]=а0&custom_fields[0][value]=b0&custom_fields[1][name]=а1&custom_fields[1][value]=b1
Прилагаю функцию декодирования application/x-www-form-urlencoded строки параметров в соответствие. Поддерживается декодирование массивов простых значений, массивов свойств вида custom_fields[0][name]=а и вложенных массивов.
Функция ПолучитьСоответствиеИзFormUrlEncoded(ТелоЗапроса)
Результат = Новый Соответствие;
ТекстЗапроса = РаскодироватьСтроку(ТелоЗапроса, СпособКодированияСтроки.КодировкаURL, "UTF-8");
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "+", " ");
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "u'", "'");
ПараметрыИЗначения = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ТекстЗапроса, "&");
Для Каждого ПараметрИЗначение Из ПараметрыИЗначения Цикл
ПозицияРавно = Найти(ПараметрИЗначение, "=");
Если ПозицияРавно > 0 Тогда
Параметр = Лев(ПараметрИЗначение, ПозицияРавно - 1);
Значение = Прав(ПараметрИЗначение, СтрДлина(ПараметрИЗначение) - ПозицияРавно);
//Например: custom_fields[0][name]
Если Найти(Параметр, "[") > 0 Тогда
ДанныеСоставногоПараметра = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(
СтрЗаменить(Параметр, "]", ""), "[");
СоставнойПараметр = ДанныеСоставногоПараметра[0];
СоответствиеСтрокПараметра = Результат.Получить(СоставнойПараметр);
Если СоответствиеСтрокПараметра = Неопределено Тогда
СоответствиеСтрокПараметра = Новый Соответствие;
Результат.Вставить(СоставнойПараметр, СоответствиеСтрокПараметра);
КонецЕсли;
Если ДанныеСоставногоПараметра.Количество() > 2 Тогда
СоответсвиеСвойствПараметра = СоответствиеСтрокПараметра.Получить(ДанныеСоставногоПараметра[1]);
Если СоответсвиеСвойствПараметра = Неопределено Тогда
СоответсвиеСвойствПараметра = Новый Соответствие();
СоответствиеСтрокПараметра.Вставить(ДанныеСоставногоПараметра[1], СоответсвиеСвойствПараметра);
КонецЕсли;
Параметр = ДанныеСоставногоПараметра[2];
СоответствиеПараметрЗначение = СоответсвиеСвойствПараметра;
Иначе
Параметр = ДанныеСоставногоПараметра[1];
СоответствиеПараметрЗначение = СоответствиеСтрокПараметра;
КонецЕсли;
Иначе
СоответствиеПараметрЗначение = Результат;
КонецЕсли;
ПредыдущееЗначение = СоответствиеПараметрЗначение.Получить(Параметр);
Если ПредыдущееЗначение = Неопределено Тогда
СоответствиеПараметрЗначение.Вставить(Параметр, Значение);
Иначе
Если ДанныеСоставногоПараметра = Неопределено Тогда
Если ТипЗнч(ПредыдущееЗначение) = Тип("Массив") Тогда
Если ПредыдущееЗначение.Найти(Значение) = Неопределено Тогда
ПредыдущееЗначение.Добавить(Значение);
КонецЕсли;
Иначе
//Если это второе значение параметра, то добавляем уже существующее и текущее
//значение в массив, если они отличаются.
Если ПредыдущееЗначение <> Значение Тогда
МассивЗначений = Новый Массив();
МассивЗначений.Добавить(ПредыдущееЗначение);
МассивЗначений.Добавить(Значение);
СоответствиеПараметрЗначение.Вставить(Параметр, МассивЗначений);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Иначе
Результат.Вставить(ПараметрИЗначение, Неопределено);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
См. другие публикации автора:
Дебиторская задолженность по срокам долга
Кредиторская задолженность по срокам долга
Контактная информация на мобильном телефоне
Когда много сканов: Автоматическое прикрепление сканированных документов
Когда много строк в документе: Удобный редактор табличных частей