Имя: Пароль:
1C
1С v8
формат JSON в версии 8.3.7
,
0 Zakella86
 
03.03.16
12:17
добрый день.
Хотел попросить помощь у опытных спецов, кои я уверен являются форумчане.
В версии 8.3 появился такой формат как JSON. Мне интересно есть ли какой нибудь стандартный парсер для json формата. Ну к примеру что бы результат запроса автоматически в JSON формат, или же придется как и в xml все ручками писать. Ну к примеру в javascript есть автоматический парсер из json в многомерный массив и наоборот. Есть ли стандартные средства в 8.3?
1 Encode
 
03.03.16
12:24
(0) Сериализуемые объекты 1С можно автоматом сериализовать в JSON через СериализаторXDTO
2 Zakella86
 
03.03.16
12:29
ок , можно пример?
вот простенький запрос, результат выводится в тз. Можно ли сразу тз в json формат перевести?

Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Номенклатура.Ссылка,
        |    Номенклатура.Родитель,
        |    Номенклатура.ЭтоГруппа,
        |    Номенклатура.Код,
        |    Номенклатура.Наименование,
        |    Номенклатура.Сумма,
        |    Номенклатура.ВидНоменклатуры,
        |    Номенклатура.Цена
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура";
    
    РезультатЗапроса = Запрос.Выполнить().Выгрузить();
3 Живой Ископаемый
 
03.03.16
12:30
В таблицу значений и уже потом ее в JSON. результат запроса не сериализуется
4 Живой Ископаемый
 
03.03.16
12:30
а, сорри, ща
5 Encode
 
03.03.16
12:38
(2) Как то так
ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON( ,Символы.Таб);
ЗаписьJSON.ОткрытьФайл("ИмяФайла",,,ПараметрыЗаписиJSON);
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, Результат);
ЗаписьJSON.Закрыть();
6 Zakella86
 
03.03.16
12:45
{HTTPСервис.users.Модуль(84)}: Метод объекта не обнаружен (ЗаписатьJSON)
нет у СериализаторXDTO метода ЗаписьJSON
7 Encode
 
03.03.16
12:47
(6) платформа какая?
8 Zakella86
 
03.03.16
12:48
8.3.6.2390
нужно обновится до 8.3.7?
9 Encode
 
03.03.16
12:50
(8) 8.3.7.1759 и выше
10 bazvan
 
03.03.16
12:50
http://v8.1c.ru/o7/201501json/index.htm

Реализовано в версии 8.3.7.1759
11 Zakella86
 
03.03.16
12:51
ок сейчас обновлю попробую
12 Живой Ископаемый
 
03.03.16
12:52
а еще просвятите - 8.3.8 - это ведь 8.3.7+, или 8.3.6+, минуя фишечки 8.3.7?
13 bazvan
 
03.03.16
12:54
(12) 8.3.8 тоже мертво рожденая,8.3.9 (и уже моячит 8.3.10)
14 Живой Ископаемый
 
03.03.16
12:57
так, то есть качать все-таки 8.3.7... ок
15 bazvan
 
03.03.16
12:59
(14) Да не я вот впродакш 8.3.8 не пускал, но работаю (конфы обновляю, конфигурю) и кое где действительно шустро работает
16 Живой Ископаемый
 
03.03.16
13:01
а JSON в ней и вот это все?
17 Карупян
 
03.03.16
13:01
(12) 8.3 по порядку развивается, а вот 8.4 уже совсем другая история.
Но там пока альфа
18 Живой Ископаемый
 
03.03.16
13:02
2(17) а, все, сенкс... 8.4, точно...
19 Zakella86
 
03.03.16
13:08
обновил
пробую зайти на hhtp сервис вот что пишет
1C:Enterprise 8 application error:

Ошибка при разборе дескриптора виртуальных ресурсов
by reason:
Ошибка преобразования данных XDTO: НачалоСвойства: protocol    Форма: Атрибут    Тип: {http://www.w3.org/2001/XMLSchema}anySimpleT
20 elCust
 
03.03.16
13:08
(0) А для каких целей вы используете JSON? У вас стороннее приложение на вход принимает JSON от 1С?

Или используйте - ЗначениеВФайл();
21 Zakella86
 
03.03.16
13:10
да, есть веб интерфейс написанный на webix, должен принимать данные в формате json
22 zva
 
03.03.16
13:15
(21) Тогда нужно использовать обычную функцию ЗаписатьJson() без всяких серилизаторов
В формате JSON допускается записывать только значения следующих типов:
Строка,
Число,
Булево,
Дата (преобразованная в строку),
Массив,
ФиксированныйМассив,
Структура,
ФиксированнаяСтруктура,
Соответствие,
ФиксированноеСоответствие.
23 Zakella86
 
03.03.16
13:15
а что за строчка ?
ЗаписьJSON.ОткрытьФайл("ИмяФайла",,,ПараметрыЗаписиJSON);
я же не со стороннего файла считываю json а с Тз
24 Zakella86
 
03.03.16
13:20
в общем для ясности цель такая
выгружать результаты запросов (естественно в ТЗ) через post запрос ,так что бы не приходилось парсить каждый запрос, а просто выгрузить его и передать стандартными средствами в формате json
25 zva
 
03.03.16
13:29
(24) Ты это ТЗ с сервера 1С на клиент передать не можешь, при этом хочешь чтоб сторонний сервис их понимал. ТЗ не сериализуется - передавай массив структур в Json.
26 Живой Ископаемый
 
03.03.16
13:31
+(24) Да, заведи себе процедурку в общем серверном модуле, которая будет из ТЗ делать массив структур. То есть запросы выгружаешь в ТЗ, ТЗ - в массив структур и уже последний сериализуешь в джейсон.
2(25) Ну, в объет ХДТО ТЗ все-таки серализуется
27 Zakella86
 
03.03.16
13:32
так цель в том что бы стандартными средствами перевести тз в json и далее передать данные по hhtp запросу.

вот что я написал
        Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Номенклатура.Ссылка,
        |    Номенклатура.Родитель,
        |    Номенклатура.ЭтоГруппа,
        |    Номенклатура.Код,
        |    Номенклатура.Наименование,
        |    Номенклатура.Сумма,
        |    Номенклатура.ВидНоменклатуры,
        |    Номенклатура.Цена
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура";
    
    РезультатЗапроса = Запрос.Выполнить().Выгрузить();
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON( ,Символы.Таб);
    ЗаписьJSON.ОткрытьФайл("ИмяФайла",,,ПараметрыЗаписиJSON);
    СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, РезультатЗапроса);
    ЗаписьJSON.Закрыть();


выдает ошибку

    ЗаписьJSON.ОткрытьФайл("ИмяФайла",,,ПараметрыЗаписиJSON);
по причине:
Ошибка доступа к файлу 'ИмяФайла'
28 Живой Ископаемый
 
03.03.16
13:37
2(27) Чувак, тебе в (22) посте все буквы видны?
29 Zakella86
 
03.03.16
13:39
да, но выходит тз нельзя записать в json?
30 Живой Ископаемый
 
03.03.16
13:42
2(29) а в (26)-м посте какие буквы не видны?
31 Zakella86
 
03.03.16
13:44
ок, буду передавать массив, тз отпадает
другой вопрос, выдает ошибку

{Форма.Форма.Форма(24)}: Ошибка при вызове метода контекста (ОткрытьФайл)
    ЗаписьJSON.ОткрытьФайл("ИмяФайла",,,ПараметрыЗаписиJSON);
по причине:
Ошибка доступа к файлу 'ИмяФайла'
32 Живой Ископаемый
 
03.03.16
13:45
воот... погоди пока...
33 arsik
 
гуру
03.03.16
13:45
(30) Да с ним бесполезно. Он даже название протокола (hhtp) нормально написать не может.
34 Zakella86
 
03.03.16
13:49
arsik во первых я пишу быстро, а во вторых не старайся зайти за умного. Я поднял интересный вопрос на который мало инфомации в интернете.Хочешь показаться крутым программером, напиши по делу а потом макай в какашки
35 arsik
 
гуру
03.03.16
13:53
(34) "интересный вопрос на который мало инфомации в интернете"
Это вдвойне смешнее.
http://bfy.tw/4Yum
36 Zakella86
 
03.03.16
13:55
я тебе сокращю время
http://v8.1c.ru/o7/201501json/index.htm
изыди в общем.Не понимаю к чему эти понты? Не хочешь помочь пройди мимо
37 Zakella86
 
03.03.16
14:00
Американский форум. Задаёшь вопрос, потом тебе отвечают.
Израильский форум. Задаёшь вопрос, потом тебе задают вопрос.
Русский форум. Задаёшь вопрос, потом тебе долго рассказывают,
какой ты дурак.
38 arsik
 
гуру
03.03.16
14:05
(37) Тебе выше уже все объяснили. Если бы внимательно смотрел в свой код, давно бы уже ошибку нашел.
40 Живой Ископаемый
 
03.03.16
14:07
ой.. простите...
41 Zakella86
 
03.03.16
14:08
arsik я уже понял что тз нельзя передавать в json.У меня сейчас другая ошибка
42 Zakella86
 
03.03.16
14:09
в общем переделал так


&НаСервере
Процедура ПеревестивВJsonНаСервере()
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Номенклатура.Ссылка,
        |    Номенклатура.Родитель,
        |    Номенклатура.ЭтоГруппа,
        |    Номенклатура.Код,
        |    Номенклатура.Наименование,
        |    Номенклатура.Сумма,
        |    Номенклатура.ВидНоменклатуры,
        |    Номенклатура.Цена
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура";
    
    РезультатЗапроса = Запрос.Выполнить().Выгрузить();
    
    мРезЗапроса=ТабЗначВМассив(РезультатЗапроса);
    
    ЗаписьJSON = Новый ЗаписьJSON;

    ЗаписьJSON.ОткрытьФайл("ИмяФайла",,,Новый ПараметрыЗаписиJSON( ,Символы.Таб));
    ЗаписатьJSON(ЗаписьJSON, мРезЗапроса);
    ЗаписьJSON.Закрыть();

КонецПроцедуры

&НаКлиенте
Процедура ПеревестивВJson(Команда)
    ПеревестивВJsonНаСервере();
КонецПроцедуры

Функция ТабЗначВМассив(ТаблицаЗначений) Экспорт
    НашМассив = Новый Массив;
    Для Каждого СтрокаТаблицы из ТаблицаЗначений Цикл
        НашаСтруктура = Новый Структура;
        Счетчик = 0;
        Для Каждого СтрокаСтруктуры из СтрокаТаблицы Цикл
            Если НЕ ТипЗнч(СтрокаСтруктуры) = Тип(ТаблицаЗначений) тогда
                НашаСтруктура.Вставить(ТаблицаЗначений.Колонки[Счетчик].Имя,СтрокаТаблицы[Счетчик]);
            Иначе
                НашаСтруктура.Вставить(ТаблицаЗначений.Колонки[Счетчик].Имя,ТабЗначВМассив(СтрокаСтруктуры));
            КонецЕсли;
            Счетчик = Счетчик + 1;
        КонецЦикла;
        НашМассив.Добавить(НашаСтруктура);
    КонецЦикла;
    Возврат(НашМассив);
КонецФункции


но выдает ту же ошибку

{Форма.Форма.Форма(24)}: Ошибка при вызове метода контекста (ОткрытьФайл)
    ЗаписьJSON.ОткрытьФайл("ИмяФайла",,,Новый ПараметрыЗаписиJSON( ,Символы.Таб));
по причине:
Ошибка доступа к файлу 'ИмяФайла'
43 zva
 
03.03.16
14:09
ЗаписьJSON = Новый ЗаписьJSON();
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураДанных);
Json = ЗаписьJSON.Закрыть();
44 arsik
 
гуру
03.03.16
14:10
(41) ищи. Я ошибку вижу. :)
45 Живой Ископаемый
 
03.03.16
14:11
2(42) ну неужели непонятно, что нет такого файла? Или ты надеешься на то, что примерный код данный тебе на форуме, заработает после копипасты?
46 Zakella86
 
03.03.16
14:15
Живой Ископаемый получается мне нужно создать какой то промежуточный файл что бы сначала туда записался json ?
47 Zakella86
 
03.03.16
14:16
zva пишет
Передано значение недопустимого типа
хотя передал массив в второй параметр
48 Живой Ископаемый
 
03.03.16
14:16
2(46) то есть (44) не станешь пробовать потому что очень просто?
я просто не успеваю прямо сейчас тебе помочь...
49 Живой Ископаемый
 
03.03.16
14:17
2(47) попробуй сначала на массиве, в котором будет будет строка и число например...
50 Zakella86
 
03.03.16
14:19
Живой Ископаемый спасибо тебе, я понял. Вот нахера такие сложности делать, мне нафиг не нужен промежуточный файл. Нужен запрос -ответ. А получается что то вроде лога. Нафига
51 Zakella86
 
03.03.16
14:22
к сожалению 1с все таки громоздкий язык, при всех его преимущетствах жутко громоздкий синтаксис с кучей не нужных конструкций.
52 Живой Ископаемый
 
03.03.16
14:24
Ты так думаешь, потому что на Objective-C не писал... или даже не читал
53 Zakella86
 
03.03.16
14:26
ну при всей противоречивости жабыскрипта, хотя бы не чешешь левой рукой правое ухо
54 zva
 
03.03.16
14:27
(50) "мне нафиг не нужен промежуточный файл. Нужен запрос -ответ. А получается что то вроде лога. Нафига"
Получается ровно то, что написал... Не нужен промежуточный файл - не используй...

ЗаписьJSON = Новый ЗаписьJSON();
    ЗаписьJSON.УстановитьСтроку();
    СтруктураДанных = Новый Структура("Строка, Дата", "АДПДпжпсжоывсм", ТекущаяДата());
    ЗаписатьJSON(ЗаписьJSON, СтруктураДанных);
    Json = ЗаписьJSON.Закрыть();
55 Zakella86
 
03.03.16
14:29
zva спасибо, то что нужно
вообще спасибо всем кто помогает
56 luter-89
 
03.03.16
14:30
Есть метод ПрочитатьJSON(), и не нужно читать в цикле. Про запись не в курсе, вроде нет такого
57 Живой Ископаемый
 
03.03.16
14:36
2(53) тут тоже не чешешь. в 1C наоборот все strightforward.
Разве что в новых типовых и БСП уже есть какие-то более сложные паттерны