Перем МаксимальнаяВложенность; Перем ИскомыйПараметр; #Область СлужебныйПрограммныйИнтерфейс // Разложить JSON на параметры // Показывает значения, которые можно получить из переданного JSON и возвращает // конкретное значение при указании имени поля // // Параметры: // JSON - Строка - JSON данные - json // МаксимальныйУровеньВложенности - Строка - Ограничение на уровень вложенности разбора. На всю глубину по умолчанию - nesting // ИмяПараметра - Строка - Имя поля для получения. Выводит список доступных, если не указано - name // // Возвращаемое значение: // Строка - пустая строка Функция РазложитьJSON(Знач JSON, Знач МаксимальныйУровеньВложенности = 0, Знач ИмяПараметра = "") Экспорт МаксимальнаяВложенность = МаксимальныйУровеньВложенности; ИскомыйПараметр = ИмяПараметра; ПолучитьКоллекцию(JSON); Если Не ТипЗнч(JSON) = Тип("Соответствие") Тогда ВызватьИсключение "Ошибка преобразовани данных параметра JSON"; КонецЕсли; Значение = ПолучитьЗначенияРекурсивно(JSON); Если ЗначениеЗаполнено(Значение) Тогда Сообщить(Значение, СтатусСообщения.Информация); КонецЕсли; Возврат ""; КонецФункции #КонецОбласти #Область СлужебныеПроцедурыИФункции Функция ПолучитьЗначенияРекурсивно(Знач JSON, Знач Префикс = "", Знач ТекущаяВложенность = 1) ВозвращаемоеЗначение = ""; Для Каждого Пара Из JSON Цикл Значение = Пара.Значение; Ключ = Префикс + Строка(Пара.Ключ); ЭтоКоллекция = ТипЗнч(Значение) = Тип("Соответствие") Или ТипЗнч(Значение) = Тип("Структура"); СледующаяВложенность = ТекущаяВложенность + 1; СледующаяВложенностьДоступна = МаксимальнаяВложенность = 0 Или СледующаяВложенность <= МаксимальнаяВложенность; Если Не ЭтоКоллекция Или Не СледующаяВложенностьДоступна Тогда ПеременнаяСреды = Ключ; ПолучитьСтроку(Значение); Если Не ЗначениеЗаполнено(ИскомыйПараметр) Тогда Сообщить(ПеременнаяСреды + Символы.ПС, СтатусСообщения.Информация); Сообщить(Значение, СтатусСообщения.Внимание); Иначе Если ПеременнаяСреды = ИскомыйПараметр Тогда ВозвращаемоеЗначение = Значение; Прервать; КонецЕсли; КонецЕсли; Иначе НовыйПрефикс = Ключ + "_"; ВозвращаемоеЗначение = ПолучитьЗначенияРекурсивно(Значение, НовыйПрефикс, СледующаяВложенность); Если ЗначениеЗаполнено(ВозвращаемоеЗначение) Тогда Прервать; КонецЕсли; КонецЕсли; КонецЦикла; Возврат ВозвращаемоеЗначение; КонецФункции Процедура ПолучитьСтроку(Значение) ЭтоКоллекция = ТипЗнч(Значение) = Тип("Соответствие") Или ТипЗнч(Значение) = Тип("Структура") Или ТипЗнч(Значение) = Тип("Массив"); Если ЭтоКоллекция Тогда ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Windows , " " , Истина , Истина , Ложь , Ложь , Ложь , Ложь); ЗаписьJSON = Новый ЗаписьJSON; ЗаписьJSON.УстановитьСтроку(ПараметрыJSON); ЗаписатьJSON(ЗаписьJSON, Значение); Значение = ЗаписьJSON.Закрыть(); Иначе Значение = Строка(Значение); КонецЕсли; КонецПроцедуры Процедура ПолучитьКоллекцию(Значение) Если Значение = Неопределено Тогда Возврат; КонецЕсли; ИсходноеЗначение = Значение; Если ЭтоКоллекция(Значение) Тогда Возврат; Иначе Если ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда Значение = ПолучитьСтрокуИзДвоичныхДанных(Значение); Иначе Значение = Строка(Значение); КонецЕсли; Файл = Новый Файл(Значение); ТекстовыйДокумент = Новый ТекстовыйДокумент(); Если Файл.Существует() Тогда ТекстовыйДокумент.Прочитать(Значение); Значение = ТекстовыйДокумент.ПолучитьТекст(); ИначеЕсли СтрНачинаетсяС(нРег(Значение), "http") Тогда ИВФ = ПолучитьИмяВременногоФайла(); КопироватьФайл(Значение, ИВФ); ТекстовыйДокумент.Прочитать(ИВФ); Значение = ТекстовыйДокумент.ПолучитьТекст(); УдалитьФайлы(ИВФ); Иначе Значение = Строка(Значение); КонецЕсли; КонецЕсли; НормализоватьТекстовыйВвод(Значение); ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(СокрЛП(Значение)); Значение = ПрочитатьJSON(ЧтениеJSON, Истина, Неопределено, ФорматДатыJSON.ISO); ЧтениеJSON.Закрыть(); КонецПроцедуры Процедура НормализоватьТекстовыйВвод(Текст) НачальнаяФигурная = СтрНайти(Текст, "{"); ПоследняяФигурная = СтрНайти(Текст, "}", НаправлениеПоиска.СКонца); Если НачальнаяФигурная = 0 Или ПоследняяФигурная = 0 Тогда Возврат; КонецЕсли; Текст = Сред(Текст, НачальнаяФигурная, ПоследняяФигурная - НачальнаяФигурная + 1); КонецПроцедуры Функция ЭтоКоллекция(Знач Значение) Возврат ТипЗнч(Значение) = Тип("Массив") Или ТипЗнч(Значение) = Тип("Структура") Или ТипЗнч(Значение) = Тип("Соответствие"); КонецФункции #КонецОбласти