Имя: Пароль:
1C
1С v8
Зазеркалье: Улучшение работы с JSON
0 Asmody
 
30.05.22
13:03
https://wonderland.v8.1c.ru/blog/uluchshenie-raboty-s-json/

Планируется в версии 8.3.23
Всё большее количество веб-сервисов переходит на обмен сообщениями в формате JSON. Чтобы облегчить труд прикладных разработчиков мы решили сделать работу с JSON максимально простой и удобной.

Сейчас в глобальном контексте есть 4 метода чтения и записи JSON: ЗаписатьJSON, ЗаписатьДатуJSON, ПрочитатьJSON, ПрочитатьДатуJSON. Функциональность этих методов очень богатая и, по имеющейся у нас информации, она избыточна для большинства задач прикладных разработчиков. А ещё – вышеупомянутые методы недоступны в веб-клиенте. При этом многие задачи интеграции требуется решать именно из веб-клиента.

В версии 8.3.23 мы добавим в глобальный контекст два новых метода: ЗаписатьЗначениеJSON (WriteJSONValue) и ПрочитатьЗначениеJSON (ReadJSONValue). Функциональность новых методов более «легкая» по сравнению с существующими и её должно хватить для большинства задач интеграции. Так, если старые методы ПрочитатьJSON и ЗаписатьJSON работают через объекты ЧтениеJSON и ЗаписьJSON соответственно, то синтаксис новых методов гораздо проще:

ЗаписатьЗначениеJSON(<Значение>) возвращает строку.

ПрочитатьЗначениеJSON(<Строка>) возвращает Структура, Массив, Число, Строка, Булево, Неопределено.

Оба методы будут доступны везде: тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер. Мы не объявляем предыдущие 4 метода устаревшими, но рекомендуем использовать новые методы везде, где это возможно; это, в частности, позволит писать универсальный код, исполняемый на всех компонентах системы.
1 Конструктор1С
 
30.05.22
13:04
Круть
2 Asmody
 
30.05.22
13:04
Вот, просто, прям, ваще!
Дождались-дождалсь, повезло-повезло!

Всего-то каких-то 10 лет прошло с появления https://infostart.ru/public/119601/ и вот оно!
3 PLUT
 
30.05.22
13:05
Joseph Stalin Otets Narodov
4 Ryzeman
 
30.05.22
13:09
Оно, конечно, хорошо, хоть и не необходимо, на выглядит как-то запоздало.
З.Ы. свои обработки интеграций рефакторить не буду всё равно.
5 Кир Пластелинин
 
30.05.22
13:14
а если при чтении ключ будет содержать недопустимые символы для структуры? просто будет валиться в ошибку?)
6 Гений 1С
 
гуру
30.05.22
13:15
(0) вот ксатти да, недавно сдуру выбрал JSON вместо XML для обмена УТ-УТ, так плевался именно из-за того, что дата не сериализируется штатно, приходится костыли писать.
7 Ryzeman
 
30.05.22
13:17
(5) думаю, возможность десереализовать в соответствие никуда не денется. ИМХО тут ключевое что объект ЧтениеJSON можно не создавать.
8 Ryzeman
 
30.05.22
13:20
(6) В JSON нет тип значений дат, о чём ты? Что Формат() и Дата() это "костыли" потому, что ты поленился про формат на википедии почитать 2 минутки?)
9 Кир Пластелинин
 
30.05.22
13:20
(7) да мало ли. мб не дописали конечно в "ПрочитатьЗначениеJSON(<Строка>) возвращает Структура, Массив, Число, Строка, Булево, Неопределено", но будет забавно, если будет возвращаться неопределено в таких случаях.
10 Кир Пластелинин
 
30.05.22
13:21
+(9) в текущий схеме хотя б флаг был для чтения в соответствие, что более предсказуемо имхо.
11 rudnitskij
 
30.05.22
18:06
"ЗаписатьЗначениеJSON(<Значение>) возвращает строку. " - а куда его записывать будет?
12 pavig
 
30.05.22
18:11
(0)
У каждого одинэсника, сталкивавшегося с обработкой и передачей JSON, уже есть такая функция где-то в собственном общем модуле)

Но для новых интеграций, конечно, будем использовать новую.
Работать, возможно, будет быстрее. Хотя и старый вроде не грешил.

Однако ж, на старых платформах код поддерживаться не будет.
13 alarm2020
 
30.05.22
18:35
(11) Никуда. Чисто 1С-овское название функции. Я удивляюсь, почему они их не называют ЛяЛяЛя или Ромашка3
14 Камчадал
 
naïve
30.05.22
18:57
Ну это если 1с с 1с , а если с другими системами, неопределено или null, как будет отрабатывать
15 Камчадал
 
naïve
30.05.22
19:00
А по дате там же вроде можно указать при чтении формат даты и всё будет автоматом
16 Ненавижу 1С
 
гуру
30.05.22
19:39
(14) неопределено вроде в JSON нет, а null есть
17 dmt
 
30.05.22
19:44
Так то уже к своим "оберткам" привыкли, но тоже неплохо.
Ждем когда добавят возможность сохранять/убирать форматирование при записи
18 Камчадал
 
naïve
30.05.22
20:24
А ссылки тоже автоматом в Уид будут?
19 Камчадал
 
naïve
30.05.22
20:25
Ещё бы тз в массив структур сразу)
20 novichok79
 
30.05.22
21:12
(19) никогда! native методы - это слишком жирно для разработчиков платформы :)
21 Asmody
 
30.05.22
21:17
(11) все уже давно привыкли к тому, что одинесовцы вдоль и поперек нарушают свои же стандарты. Юпитеру позволено
22 novichok79
 
30.05.22
21:28
помню в 2018м очень удивился тому, что сериализация json не поддерживается на веб-клиенте.
рукалицо x 100500.
23 Камчадал
 
naïve
30.05.22
21:33
Да уж стандарты, 1с++ вспомнился. Индексируемая таблица значений и много че еще
24 Asmody
 
31.05.22
09:45
(23) к 2040му году в 1С обещают сделать классы
25 VitaliyTokarev
 
31.05.22
10:26
Кстати, в тему JSON. Подскажите, решил потыкать ВБ.

[code]

    Заголовки= Новый Соответствие();
    Заголовки.Вставить("Content-Type", "application/json");
    Заголовки.Вставить("Authorization", Токен);
    Заголовки.Вставить("skip", "0");
    Заголовки.Вставить("take", "1000");
    Сервис = "/api/v2/stocks";
    HTTPСоединение = Новый HTTPСоединение("suppliers-api.wildberries.ru", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
    HTTPЗапрос = Новый HTTPЗапрос(Сервис, Заголовки);
    HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
    Результат = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(Результат);
    СтруктураJSON = ПрочитатьJSON(ЧтениеJSON);

[/code]

И вот там возвращается параметр errorText = "Некорректный параметр skip".
В описании API:

skip *
string
(query)    
Задает сколько записей пропустить (для пагинации)

Что я делаю не так?
26 arsik
 
гуру
31.05.22
10:28
(0) Плюс, что добавили вебклиент, а все остальное синтетический сахар. Это можно было и средствами 1С сделать.
РаботаСJSON.ЗаписатьЗначениеJSON(<Значение>);
27 Asmody
 
31.05.22
10:53
(25) Заголовки и параметры  http-запроса - это немножко разные вещи. Точнее, совсем разные.
28 Кир Пластелинин
 
31.05.22
10:53
(25) дык а зачем в заголовки то пихать skip?
29 VitaliyTokarev
 
31.05.22
12:17
(28) Упсь, а куда их пихать? Что-то я тогда потерялся)
30 VitaliyTokarev
 
31.05.22
12:20
В строку "Сервис", что ли?

    Сервис = "/api/v2/stocks?skip=0&take=1000";
31 Asmody
 
31.05.22
13:05
(30) для get-запросов параметры передаются в URL, для post-запросов - в теле запроса
32 VitaliyTokarev
 
31.05.22
13:10
(31) Спасибо
33 Гений 1С
 
гуру
31.05.22
21:57
(8) а в XML есть сериализация в дату. хотя в XML тоже все якобы в строках. НЕ гони ересь
34 Гений 1С
 
гуру
31.05.22
21:57
(24) Обещать - не значит дать.ггг
35 Ryzeman
 
01.06.22
06:54
(33) как то, что в XML есть сериализация в дату отменяет то, что в JSON её нет?) Повторюсь, тебе лень было 2 минуты потратить на чтение описания, но виноват в этом JSON?)
36 Ненавижу 1С
 
гуру
01.06.22
08:04
(6) все штатно:

Структура = Новый Структура("Key, Date",
    Пользователи.ТекущийПользователь().КлючБитрикс,
    НачалоДня(ТекущаяДата()));
    
JSONЗапись = Новый ЗаписьJSON();
JSONЗапись.УстановитьСтроку();
ЗаписатьJSON(JSONЗапись, Структура);
СтрокаJSON = JSONЗапись.Закрыть();

Сообщить(СтрокаJSON);
37 Гений 1С
 
гуру
01.06.22
09:59
(36) ггг... ты реально не просек, о чем вопрос, или не сталкивался. Замечательно, а теперь десериализируй эту дату.
38 Выпрь
 
01.06.22
10:09
(37) xmlзначение не работает?
39 Kassern
 
01.06.22
10:17
(37) нормально же десериализуется через ПрочитатьJSON() Там даже параметр специальный есть для даты
40 Ненавижу 1С
 
гуру
01.06.22
10:22
(37) лови:

Структура = Новый Структура("Key, Date",
    Пользователи.ТекущийПользователь().КлючБитрикс,
    НачалоДня(ТекущаяДата()));
    
JSONЗапись = Новый ЗаписьJSON();
JSONЗапись.УстановитьСтроку();
ЗаписатьJSON(JSONЗапись, Структура);
СтрокаJSON = JSONЗапись.Закрыть();

Сообщить(СтрокаJSON);

JSONЧтение = Новый ЧтениеJSON();
JSONЧтение.УстановитьСтроку(СтрокаJSON);
МассивПолейДата = СтрРазделить("Date",",");
Результат = ПрочитатьJSON(JSONЧтение,,МассивПолейДата);

Сообщить("Результат.Date = " + Результат.Date);
Сообщить("ТипЗнч(Результат.Date) = " + ТипЗнч(Результат.Date));
41 Kassern
 
01.06.22
10:24
(40) ну вот, скоро будет новая статья гени, о том как он джисон победил)