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

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

    Если HTTPОтвет.КодСостояния=200 Тогда
        
        
    Кодировка = "utf-8";    
    Поток = HTTPОтвет.ПолучитьТелоКакСтроку(Кодировка) ;
     // ну допустим мы знаем что там такая кодировка



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



КонецЕслИ;
13 acht
 
09.08.20
14:52
(12) А чем помощь форума от курсов отличается, Андрей Николаевич?
14 Ybr
 
09.08.20
14:53
(13) на курсах нет полной картины . даже подавно
15 Ybr
 
09.08.20
14:54
(13) а здесь такие знатоки сидят вроде вас
16 Salimbek
 
09.08.20
14:54
(12) А что вас в (9) не устроило?
17 Ybr
 
09.08.20
14:56
(16) какое там будет свойство?
18 Ybr
 
09.08.20
15:00
(13) нет не напишу . потому.что не вашего это ума дело
19 Ybr
 
09.08.20
15:05
Кто подскажет .что с соответствием делать дальше?

   СтруктураОтвета = ПрочитатьJSON(ЧтениеJSON, Истина);
20 acht
 
09.08.20
15:13
Так вот же, Андрей Николаевич, вы же сами вчера у себя вконтактике все и написали https://vk.com/id590088932?w=wall590088932_97

Вроде даже код рабочий.
21 Ybr
 
09.08.20
15:15
Забанить противоречит правилам форума   acht
22 Ybr
 
09.08.20
15:19
(20) не весь рабочий . нужно допиливать
23 Ybr
 
09.08.20
15:29
(20) Пидорас
24 ДенисЧ
 
09.08.20
15:50
(19) Значение = СтруктураОтвета.Получить(ИмяСвойства)
25 МихаилМ
 
09.08.20
16:01
(20) я думал юму лет 20 максимум. в 42 года с интеллектом подростка - беда.
26 Ybr
 
09.08.20
16:04
(25) ты себя видел? посмотри  в зеркало
27 Ybr
 
09.08.20
16:30
(24) ИмяСвойства что такое ?
28 ДенисЧ
 
09.08.20
16:36
(27) Имя свойства, которое тебе нужно получить...
Я же не знаю структуры твоего файла и данных, которые тебе нужно получить
29 Ybr
 
09.08.20
16:43
(28) я ж с сайта получаю
30 Ybr
 
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    — краткое наименование без ОПФ
31 Ybr
 
09.08.20
16:45
(28) почему имя свойства .метод же ключ  если получить
32 ДенисЧ
 
09.08.20
16:47
(30) С дадаты качаешь? )))
У меня где-то код был... Счас посмотрю...
33 Ybr
 
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
Токен только свой подставь. Мне мой не жалко, он бесплатный.
36 Ybr
 
09.08.20
16:53
(35) Дай Бог тебе  все.что пожелаешь  добрый человек
37 ДенисЧ
 
09.08.20
16:55
(36) Бога нет...
38 Ybr
 
09.08.20
16:58
(37) есть
39 acht
 
09.08.20
18:00
(37) А пожелай, пожалуйста, Рогачеву знаний и ума. Проверим, как оно работает и что дает.
40 Ybr
 
09.08.20
18:42
(39) ты тролль обыкновенный
41 Ybr
 
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НаСервере( );
КонецПроцедуры
42 Ybr
 
09.08.20
18:44
осталось мне вытянуть каким то образом огрн и вид деятельности
43 Ybr
 
09.08.20
18:45
(39)  а тебе надо пожелать .чтобы ты мониаком не стал на старость лет . со своей слежкой за людьми за их вк  . матерями  и прочим..
44 ДенисЧ
 
09.08.20
19:32
(43) ОГРН = стр.ответ.Получить("ogrn");

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

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