Имя: Пароль:
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.
Разве что в новых типовых и БСП уже есть какие-то более сложные паттерны
Ошибка? Это не ошибка, это системная функция.