Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

вопрос по Json

вопрос по Json
Я
   Ybr
 
07.08.20 - 09:32
Коллеги добрый день !

Как получить Значения

ранее с Json не работал .что я упустил?


&НаСервере
Процедура Команда1НаСервере()

ИНН=".....";


HTTPСоединение=Новый HTTPСоединение("suggestions.dadata.ru",,,,,,Новый ЗащищенноеСоединениеOpenSSL);
Заголовки=Новый Соответствие();
Заголовки.Вставить("Content-Type","application/json");
Заголовки.Вставить("Accept","application/json");
Заголовки.Вставить("Authorization","Token .....");
HTTPЗапрос=Новый HTTPЗапрос("/suggestions/api/4_1/rs/suggest/party",Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки("{ ""query"": "" " + ИНН + """, ""status"": ""ACTIVE"", ""type"": ""INDIVIDUAL"" }");
HTTPОтвет=HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
ОтветDaData = HTTPОтвет.ПолучитьТелоКакСтроку();
Если HTTPОтвет.КодСостояния=200 Тогда
      тЧтение = Новый ЧтениеJSON;
   тЧтение.УстановитьСтроку(ОтветDaData);
   Пока тЧтение.Прочитать() Цикл
      Сообщить("Тип текущего элемента " + тЧтение.ТипТекущегоЗначения);
      Если тЧтение.ТипТекущегоЗначения = ТипЗначенияJSON.ИмяСвойства Тогда
         Сообщить("Имя = " + тЧтение.ТекущееЗначение);
      КонецЕсли;
      Если тЧтение.ТипТекущегоЗначения = ТипЗначенияJSON.Булево ИЛИ
       тЧтение.ТипТекущегоЗначения = ТипЗначенияJSON.Строка ИЛИ
       тЧтение.ТипТекущегоЗначения = ТипЗначенияJSON.Число ИЛИ
       тЧтение.ТипТекущегоЗначения = ТипЗначенияJSON.Комментарий Тогда
         Сообщить("Значение = " + тЧтение.ТекущееЗначение);
      КонецЕсли;
  КонецЦикла;
    тЧтение.Закрыть();
КонецЕслИ;
                    
  
КонецПроцедуры

&НаСервере
Функция СформироватьСтрокуJSON(СтруктураЗапроса)
    
    СтрокаJSON = "{";
    

    
    Для каждого Элемент Из СтруктураЗапроса Цикл
        
        СтрокаJSON = СтрокаJSON + """" + Элемент.Ключ + """" + ":";
        
        Если ТипЗнч(Элемент.Значение) = Тип("Строка") Тогда
            СтрокаJSON = СтрокаJSON + """" + Элемент.Значение + """";
        ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("Число") Тогда
            СтрокаJSON = СтрокаJSON + СтрЗаменить(Строка(Элемент.Значение), Символы.НПП, "");
        Иначе
            СтрокаJSON = СтрокаJSON + """" + КодироватьСтроку(Строка(Элемент.Значение), СпособКодированияСтроки.КодировкаURL) + """";
        КонецЕсли;
        
        СтрокаJSON = СтрокаJSON + ",";
        
    КонецЦикла;
    
    Если Прав(СтрокаJSON, 1) = "," Тогда
        СтрокаJSON = Лев(СтрокаJSON, СтрДлина(СтрокаJSON)-1);
    КонецЕсли;
    
    Возврат СтрокаJSON + "}";
    
    
    
КонецФункции

&НаКлиенте
Процедура Команда1(Команда)
    Команда1НаСервере();
КонецПроцедуры
   ДенисЧ
 
1 - 07.08.20 - 09:34
А зачем его руками собирать/разбирать? Есть же готовые процедуры...
   polosov
 
2 - 07.08.20 - 09:36
(0) Ты хоть гуглил перед реализацией своего монстра?
   bootini
 
3 - 07.08.20 - 09:37
ЧтениеJSON = Новый ЧтениеJSON();
        ЧтениеJSON.ОткрытьПоток(HTTPОтвет.ПолучитьТелоКакПоток());
        Попытка
            СтруктураОтвета = ПрочитатьJSON(ЧтениеJSON, Ложь);
        Исключение
  
        КонецПопытки;
   Ybr
 
4 - 07.08.20 - 09:40
(3) я первый раз пишу .откуда мне знать .что не так
   Ybr
 
5 - 07.08.20 - 09:41
(1) выборочно надо значения получить
   ДенисЧ
 
6 - 07.08.20 - 09:47
(5) Прочитай в соответствие, оттуда и получай данные
   Сияющий в темноте
 
7 - 07.08.20 - 09:49
выборочно без прочитать?
можно найти в файле ключ и прочитать значение после него,но это костыльный подход.
если структура ответа сложная,то можно получить совсем не то,что записано.
   Ybr
 
8 - 07.08.20 - 09:50
(6) Спасибо за подсказку
   bootini
 
9 - 07.08.20 - 09:50
(5)

Если СтруктураОтвета.Свойство("ВыборочноНадоЗначения") Тогда
      ВыборочноНадоЗначения = СтруктураОтвета["ВыборочноНадоЗначения"];     
КонецЕсли;
   Ybr
 
10 - 07.08.20 - 09:51
(9) все понял . тема закрыта .всем вери сеньк ю
   Ybr
 
11 - 09.08.20 - 14:46
(6) как данные получить ?
   Ybr
 
12 - 09.08.20 - 14:48
Прочитал я в соответствие  .что дальше ? как значение вытащить?
    Если HTTPОтвет.КодСостояния=200 Тогда
        
        
    Кодировка = "utf-8";     
    Поток = HTTPОтвет.ПолучитьТелоКакСтроку(Кодировка) ;
    // ну допустим мы знаем что там такая кодировка




ЧтениеJSON = Новый ЧтениеJSON();
        ЧтениеJSON.ОткрытьПоток(HTTPОтвет.ПолучитьТелоКакПоток());
        Попытка
            СтруктураОтвета = ПрочитатьJSON(ЧтениеJSON, Истина);
        Исключение
  
        КонецПопытки;
 
 

КонецЕслИ;
   acht
 
13 - 09.08.20 - 14:52
(12) А чем помощь форума от курсов отличается, Андрей Николаевич?
   Ybr
 
14 - 09.08.20 - 14:53
(13) на курсах нет полной картины . даже подавно
   Ybr
 
15 - 09.08.20 - 14:54
(13) а здесь такие знатоки сидят вроде вас
   Salimbek
 
16 - 09.08.20 - 14:54
(12) А что вас в (9) не устроило?
   Ybr
 
17 - 09.08.20 - 14:56
(16) какое там будет свойство?
   Ybr
 
18 - 09.08.20 - 15:00
(13) нет не напишу . потому.что не вашего это ума дело
   Ybr
 
19 - 09.08.20 - 15:05
Кто подскажет .что с соответствием делать дальше?
   СтруктураОтвета = ПрочитатьJSON(ЧтениеJSON, Истина);
   acht
 
20 - 09.08.20 - 15:13
Так вот же, Андрей Николаевич, вы же сами вчера у себя вконтактике все и написали https://vk.com/id590088932?w=wall590088932_97

Вроде даже код рабочий.
   Ybr
 
21 - 09.08.20 - 15:15
Забанить противоречит правилам форума   acht
   Ybr
 
22 - 09.08.20 - 15:19
(20) не весь рабочий . нужно допиливать
   Ybr
 
23 - 09.08.20 - 15:29
(20) Пидорас
   ДенисЧ
 
24 - 09.08.20 - 15:50
(19) Значение = СтруктураОтвета.Получить(ИмяСвойства)
   МихаилМ
 
25 - 09.08.20 - 16:01
(20) я думал юму лет 20 максимум. в 42 года с интеллектом подростка - беда.
   Ybr
 
26 - 09.08.20 - 16:04
(25) ты себя видел? посмотри  в зеркало
   Ybr
 
27 - 09.08.20 - 16:30
(24) ИмяСвойства что такое ?
   ДенисЧ
 
28 - 09.08.20 - 16:36
(27) Имя свойства, которое тебе нужно получить...
Я же не знаю структуры твоего файла и данных, которые тебе нужно получить
   Ybr
 
29 - 09.08.20 - 16:43
(28) я ж с сайта получаю
   Ybr
 
30 - 09.08.20 - 16:44
Название    Описание
Базовые поля, заполняются для всех тарифов
value    Наименование компании
unrestricted_value    = value
data.inn    ИНН
data.kpp    КПП
data.ogrn    ОГРН
data.ogrn_date    Дата выдачи ОГРН
data.hid    Уникальный идентификатор в Дадате
data.type    Тип организации
  LEGAL      — юридическое лицо
  INDIVIDUAL — индивидуальный предприниматель
data.name    Наименование
└ full_with_opf    — полное наименование
└ short_with_opf    — краткое наименование
└ latin    — не заполняется
└ full    — полное наименование без ОПФ
└ short    — краткое наименование без ОПФ
 
 Рекламное место пустует
   Ybr
 
31 - 09.08.20 - 16:45
(28) почему имя свойства .метод же ключ  если получить
   ДенисЧ
 
32 - 09.08.20 - 16:47
(30) С дадаты качаешь? )))
У меня где-то код был... Счас посмотрю...
   Ybr
 
33 - 09.08.20 - 16:48
(32) буду рад  спасибо
   ДенисЧ
 
34 - 09.08.20 - 16:48
Функция ПолучитьДанныеПоИНН(инн) экспорт
    соединение = Новый HTTPСоединение("suggestions.dadata.ru",,,,,,Новый ЗащищенноеСоединениеOpenSSL);
    
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Content-Type", "application/json");
    Заголовки.Вставить("Accept", "application/json");
    Заголовки.Вставить("Authorization", "Token 96217b3aed2bf59cd9d9f9966fbd24d186541c9c");  // токен из личного кабинета dadata.ru

    
    запрос = Новый HTTPЗапрос("/suggestions/api/4_1/rs/findById/party", Заголовки);
    
    текстЗапроса = "{""query"": """ + инн + """}";
    
    запрос.УстановитьТелоИзСтроки(текстЗапроса);
    рез = соединение.ОтправитьДляОбработки(запрос);
    
    Если рез.КодСостояния <> 200 Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    ответ = рез.ПолучитьТелоКакСтроку();
    
    чт = Новый ЧтениеJSON;
    чт.УстановитьСтроку(ответ);
    рез = ПрочитатьJSON(чт, Истина);
    
    Возврат рез;
КонецФункции


    Если ПустаяСтрока(ИНН) Тогда
        Сообщить("Не указан ИНН");
        Возврат;
    КонецЕсли;
    
    данные = Справочники.Контрагенты.ПолучитьДанныеПоИНН(ИНН);
    Если данные = Неопределено ИЛИ ТипЗнч(данные) <> Тип("Соответствие") тогда
        Сообщить("Не смогли получить данные по ИНН");
        Возврат;
    КонецЕсли;
    
    массивОтветов = данные.Получить("suggestions");
    Если ТипЗнч(массивОтветов) <> Тип("Массив") ИЛИ массивОтветов.Количество() = 0 Тогда
        Сообщить("Не смогли получить данные по ИНН");
        Возврат;
    КонецЕсли;
    
    таблицаОтветов = Новый ТаблицаЗначений;
    таблицаОтветов.Колонки.Добавить("Наименование");
    таблицаОтветов.Колонки.Добавить("Ответ");
    Для Каждого ответ из массивОтветов Цикл
        стр = таблицаОтветов.Добавить();
        стр.Наименование = ответ.Получить("value");
        стр.ответ = ответ.Получить("data");
    КонецЦикла;
    
    Если таблицаОтветов.Количество() > 1 Тогда
        стр = таблицаОтветов.ВыбратьСтроку("Выберите вариант");
        Если стр = Неопределено Тогда
            Возврат;
        КонецЕсли;
    ИНаче
        стр = таблицаОтветов[0];
    КонецЕсли;
    
    Наименование = стр.ответ.Получить("name").Получить("short");
    НаименованиеПолное = стр.ответ.Получить("name").Получить("full_with_opf");
    КПП = стр.ответ.Получить("kpp");
    РасписаниеРаботыСтрокой = стр.ответ.Получить("ogrn");
    
    Если СокрЛП(стр.ответ.Получить("type")) = "LEGAL" Тогда
        ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо;
    ИначеЕсли СокрЛП(стр.ответ.Получить("type")) = "INDIVIDUAL" Тогда
        ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо;
    КонецЕсли;


Ну и так далее. Это всё вызывалось из формы справочника контрагентов. Сам подпили под себя.
   ДенисЧ
 
35 - 09.08.20 - 16:49
Токен только свой подставь. Мне мой не жалко, он бесплатный.
   Ybr
 
36 - 09.08.20 - 16:53
(35) Дай Бог тебе  все.что пожелаешь  добрый человек
   ДенисЧ
 
37 - 09.08.20 - 16:55
(36) Бога нет...
   Ybr
 
38 - 09.08.20 - 16:58
(37) есть
   acht
 
39 - 09.08.20 - 18:00
(37) А пожелай, пожалуйста, Рогачеву знаний и ума. Проверим, как оно работает и что дает.
   Ybr
 
40 - 09.08.20 - 18:42
(39) ты тролль обыкновенный
   Ybr
 
41 - 09.08.20 - 18:43
вот так я переделал  код . ДенисТч 


половина в нем не работало 




&НаСервере
Процедура Команда1НаСервере( )
    
    
    Данные= ПолучитьДанныеПоИНН(инн) ;
    массивОтветов = данные.Получить("suggestions");
    
    таблицаОтветов = Новый ТаблицаЗначений;
    таблицаОтветов.Колонки.Добавить("Наименование");
    таблицаОтветов.Колонки.Добавить("Ответ");
    Для Каждого ответ из массивОтветов Цикл
        стр = таблицаОтветов.Добавить();
        стр.Наименование = ответ.Получить("value");
        
        Сообщить(стр.Наименование);
    КонецЦикла;
    
    
    
    
КонецПроцедуры


Функция ПолучитьДанныеПоИНН(инн) экспорт
    соединение = Новый HTTPСоединение("suggestions.dadata.ru",,,,,,Новый ЗащищенноеСоединениеOpenSSL);
    
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Content-Type", "application/json");
    Заголовки.Вставить("Accept", "application/json");
    //Заголовки.Вставить("Authorization", "Token 96217b3aed2bf59cd9d9f9966fbd24d186541c9c");  // токен из личного кабинета dadata.ru

    Заголовки.Вставить("Authorization","Token 893634d15567d4a476f40613c5d59175b6467ef0");
    
    
    запрос = Новый HTTPЗапрос("/suggestions/api/4_1/rs/findById/party", Заголовки);
    
    текстЗапроса = "{""query"": """ + ИНН + """}";
    
    запрос.УстановитьТелоИзСтроки(текстЗапроса);
    рез = соединение.ОтправитьДляОбработки(запрос);
    
    Если рез.КодСостояния <> 200 Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    ответ = рез.ПолучитьТелоКакСтроку();
    
    чт = Новый ЧтениеJSON;
    чт.УстановитьСтроку(ответ);
    рез = ПрочитатьJSON(чт, Истина);
    
    Возврат рез;
КонецФункции




&НаКлиенте
Процедура Команда1(Команда)
    Команда1НаСервере( );
КонецПроцедуры
   Ybr
 
42 - 09.08.20 - 18:44
осталось мне вытянуть каким то образом огрн и вид деятельности
   Ybr
 
43 - 09.08.20 - 18:45
(39)  а тебе надо пожелать .чтобы ты мониаком не стал на старость лет . со своей слежкой за людьми за их вк  . матерями  и прочим..
   ДенисЧ
 
44 - 09.08.20 - 19:32
(43) ОГРН = стр.ответ.Получить("ogrn");

Из моего кода.

У меня код - в ОФ. У тебя в УФ. Надо же было подумать, прежде чем копипастить....
   Ybr
 
45 - 09.08.20 - 19:39
(44) да работает . осталось поле получить


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.