Имя: Пароль:
1C
1С v8
Сериализация и десериализация JSON нескольких документов
0 KemerovIvan
 
25.09.20
14:56
Вопрос вот в чем.
В интернете нашел статью как делать сериализацию одного документа. Но когда пытаюсь сделать на несколько документов, выдает ошибку. Каким образом сделать это?!

//Сериализация
Процедура ЗаписьJSON()
    
    ЗаписьJSON = Новый ЗаписьJSON;
    //Или в строку
    ЗаписьJSON.УстановитьСтроку();
    //Или в файл
    ЗаписьJSON.ОткрытьФайл("C:\test.txt");
    
    Номенклатура = Справочники.Номенклатура.НайтиПоКоду("00000000001").ПолучитьОбъект();
    СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, Номенклатура, НазначениеТипаXML.Явное);
    
    СериализованнаяСтрока = ЗаписьJSON.Закрыть();
    
КонецПроцедуры


//Десериализация
Процедура ЧтениеJSON()
    
    ЧтениеJSON = Новый ЧтениеJSON;
    //Или из строки
    ЧтениеJSON.УстановитьСтроку("");
    //Или из файла    
    ЧтениеJSON.ОткрытьФайл("C:\test.txt");
        
    Номенклатура = СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON);    
    
    ЧтениеJSON.Закрыть();
        
КонецПроцедуры
1 KemerovIvan
 
25.09.20
14:57
Хоть справочники, хоть документы. Везде выдает ошибку
2 Ёпрст
 
25.09.20
14:58
(0) в этом коде нет записи документа в жсон.
3 KemerovIvan
 
25.09.20
14:59
(2) разве?
4 Ёпрст
 
25.09.20
15:00
(3) железобетонно
5 KemerovIvan
 
25.09.20
15:00
Вот создание: ЗаписьJSON = Новый ЗаписьJSON;

Вот в какой файл: ЗаписьJSON.ОткрытьФайл("C:\test.txt");

Вот запись: СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, Номенклатура, НазначениеТипаXML.Явное);

Вот закрытие: СериализованнаяСтрока = ЗаписьJSON.Закрыть();
6 KemerovIvan
 
25.09.20
15:01
(4) каким образом тогда должен быть создан JSON?
7 Ёпрст
 
25.09.20
15:01
(5) Где в этом коде ДОКУМЕНТ ?
8 Ёпрст
 
25.09.20
15:02
И где в этом коде твои НЕСКОЛЬКО документов, которые не работают ?
9 KemerovIvan
 
25.09.20
15:02
(7) Так ясно
Придиры приперли
10 KemerovIvan
 
25.09.20
15:02
это код из статьи
11 tan76
 
25.09.20
15:03
(0) Документы в массив, массив в JSON, и получать объект не нужно
12 KemerovIvan
 
25.09.20
15:03
ЗаписьJSON = Новый ЗаписьJSON;
    ПараметрыЗаписиJSON = новый ПараметрыЗаписиJSON(, Символы.Таб);
    ЗаписьJSON.ОткрытьФайл("c:\1\1.json",,,ПараметрыЗаписиJSON);
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Обмен.Ссылка КАК Ссылка
        |ИЗ
        |    Документ.Обмен КАК Обмен";
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект(),НазначениеТипаXML.Явное);
        ЗаписьJSON.УстановитьСтроку();
    КонецЦикла;
    
    ЗаписьJSON.Закрыть();
13 KemerovIvan
 
25.09.20
15:04
Из массива он потом не читает (11)
14 KemerovIvan
 
25.09.20
15:04
пробовал через массив
15 Ёпрст
 
25.09.20
15:08
(12) выкинь ПолучитьОбъект() из кода, для начала
16 Ёпрст
 
25.09.20
15:08
и установитьСтроку после записи
17 Ёпрст
 
25.09.20
15:10

  Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, ВыборкаДетальныеЗаписи.Ссылка,НазначениеТипаXML.Явное);
    КонецЦикла;
сообщить(ЗаписатьJSON.Закрыть());
18 KemerovIvan
 
25.09.20
15:14
Ошибка при вызове метода контекста (ЗаписатьJSON) (17)
19 KemerovIvan
 
25.09.20
15:14
Такую ошибку выдает
20 KemerovIvan
 
25.09.20
15:22
Больше вариантов ни у кого нет?
21 Ёпрст
 
25.09.20
15:32
Точное описание ошибки какое?
22 Ёпрст
 
25.09.20
15:32
Этот код выполняется где?
23 KemerovIvan
 
25.09.20
15:35
в http Сервисе (22)
24 Ёпрст
 
25.09.20
15:39
(23) ну пробуй заменить строку отурытия файла на просто установитьстроку(), для начала
25 KemerovIvan
 
25.09.20
15:45
(24) Ничего не поменялось, все так же висит ошибка
26 Ёпрст
 
25.09.20
15:59
Если подсунуть простой тип, строку "вася", например, работает? Заместо ссылки дока
27 KemerovIvan
 
25.09.20
16:01
(26) Если отправить только один документ, все работает. Но как только начинаю отправлять несколько документов то все ломается
28 zuza
 
25.09.20
16:35
(18) очепятка в (17), поэтому и ошибка
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, ВыборкаДетальныеЗаписи.Ссылка,НазначениеТипаXML.Явное);
    КонецЦикла;
сообщить(ЗаписьJSON.Закрыть());
29 KemerovIvan
 
25.09.20
17:08
(28) Какая опечатка? Я вписал то что вы отправили, все равно такая же ошибка.
30 Ёпрст
 
25.09.20
18:22
(27) так, не работает ?


    ВыборкаДетальныеЗаписи = мРезультатЗапроса.Выбрать();
    МассивJSON = Новый Массив;
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        МассивJSON.Добавить(ВыборкаДетальныеЗаписи.ССылка);
    КонецЦикла;
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, МассивJSON,НазначениеТипаXML.Явное);
    Сообщить(ЗаписьJSON.Закрыть());
31 KemerovIvan
 
28.09.20
09:11
(30) Ооо работает.
Но возникла новая проблема. Когда внутри одной базы я Сериализую, а потом считываю, он все показывает. Но когда передаю в другую базу через HTTP сервис то там не пишется ссылка не найдена

    Соединение = Новый HTTPСоединение("localhost/test/hs/js/json");
    Запрос = Новый HTTPЗапрос("/");
    Ответ = Соединение.Получить(Запрос);
    Данные = Ответ.ПолучитьТелоКакСтроку();
    
    
    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(Данные);
    ДанныеJSON = СериализаторXDTO.ПрочитатьJSON(Чтение);

    Чтение.Закрыть();
32 KemerovIvan
 
28.09.20
09:11
Вот такой код что бы прочитать
33 KemerovIvan
 
28.09.20
09:12
Может я что то не так делаю?
34 KemerovIvan
 
28.09.20
09:15
Пишет на каждой строке объект не найден
35 Garykom
 
гуру
28.09.20
09:22
(33) Угу задачку слишком сложную взял пока не по силам.
36 Garykom
 
гуру
28.09.20
09:23
(34) Дык объекта (в другой базе) нет по ссылке которая в JSON фуй ли шотишь?
37 KemerovIvan
 
28.09.20
09:34
ну а как мне передать тогда через json все на другую базу?
38 KemerovIvan
 
28.09.20
09:35
я сделал это через структуры, но мне сказали что можно и делать сериализацию и так сразу документы передавать целиком
39 KemerovIvan
 
28.09.20
09:36
Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ОбменВопросы.Ссылка КАК Ссылка,
        |    ОбменВопросы.НомерСтроки КАК НомерСтроки,
        |    ОбменВопросы.Товар КАК Товар,
        |    ОбменВопросы.Цена КАК Цена,
        |    Обмен.Номер КАК Номер
        |ИЗ
        |    Документ.Обмен.Вопросы КАК ОбменВопросы
        |        ПОЛНОЕ СОЕДИНЕНИЕ Документ.Обмен КАК Обмен
        |        ПО ОбменВопросы.Ссылка = Обмен.Ссылка
        |ГДЕ
        |    Обмен.Номер = &Номер";
    
    //Формируем массив оборудования    
    Обмен = Документы.Обмен.Выбрать();
    
    Колл = Документы.Обмен.Выбрать();
    Количество = 0;
        
    Пока Колл.Следующий() Цикл
        Количество = Количество + 1;
    КонецЦикла;

    МассивОбмен = Новый Массив;
    
    Пока Обмен.Следующий() Цикл
        НомерДокумента = Обмен.Номер;
        
        Запрос.УстановитьПараметр("Номер", НомерДокумента);    
        РезультатЗапроса = Запрос.Выполнить();     
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
        СуммаТаб = 0;
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            СуммаТаб = СуммаТаб + 1;
        КонецЦикла;

        
        НазваниеДокумента = Документы.Обмен.НайтиПоНомеру(НомерДокумента).Название;
        
        ДанныеОбмен = Новый Структура;
        ДанныеОбмен.Вставить("Название", НазваниеДокумента);
        ДанныеОбмен.Вставить("Дата", Дата(Обмен.Дата));
        
        тНастройкиСериализации = Новый НастройкиСериализацииJSON;
         тНастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.ISO;
        тНастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.УниверсальнаяДата;
        
        ДанныеОбменТЧ = Новый Массив;

        Для Индекс = 0 по СуммаТаб - 1 Цикл
            НазваниеТовара = Документы.Обмен.НайтиПоНомеру(НомерДокумента).Вопросы[Индекс].Товар;
            ЦенаТовара = Документы.Обмен.НайтиПоНомеру(НомерДокумента).Вопросы[Индекс].Цена;
            
            ДанныеОбменТЧСтрока = Новый Структура;
            ДанныеОбменТЧСтрока.Вставить("Товар", НазваниеТовара);
            ДанныеОбменТЧСтрока.Вставить("Цена", ЦенаТовара);
            НомерСтроки = Индекс + 1;
            ДанныеОбменТЧ.Добавить(ДанныеОбменТЧСтрока);
        КонецЦикла;    
        
        ДанныеОбмен.Вставить("ТабЧасть", ДанныеОбменТЧ);
        
        МассивОбмен.Добавить(ДанныеОбмен);          
    КонецЦикла;
    
    //Сериализуем массив в JSON
    ЗаписьJOIN = Новый ЗаписьJSON;
    ЗаписьJOIN.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJOIN, МассивОбмен, тНастройкиСериализации);
    СтрокаДляОтвета = ЗаписьJOIN.Закрыть();
    
    //Сообщить (СтрокаДляОтвета);
    
    //Формируем ответ веб-клиенту
    
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-type","application/JOIN; charset=utf-8");
    Ответ.УстановитьТелоИзСтроки(СтрокаДляОтвета,КодировкаТекста.UTF8,
    ИспользованиеByteOrderMark.НеИспользовать);
    Возврат Ответ;
40 KemerovIvan
 
28.09.20
09:36
Вот как передаю с помощью структур
41 KemerovIvan
 
28.09.20
09:37
возможно есть вариант передать все таки по проще?!
42 KemerovIvan
 
28.09.20
09:38
(36) Может подскажете как сделать вместо сарказма?
43 hhhh
 
28.09.20
10:48
(42) вот тут у тебя невероятная хрень

Документы.Обмен.НайтиПоНомеру(НомерДокумента)

у метода НайтиПоНомеру должно быть 2 парметра.
44 hhhh
 
28.09.20
10:53
(42) и вообще, откуда эти номера какие-то? Пиши нормально

       |ГДЕ
        |    Обмен.Ссылка = &Ссылка";
45 hhhh
 
28.09.20
10:57
(42) и вот это

Документы.Обмен.НайтиПоНомеру(НомерДокумента).Название

дебилизм какой-то

Пиши в запросе

       |    Обмен.Название КАК Название,

и

НазваниеДокумента = Обмен.Название;
46 KemerovIvan
 
28.09.20
11:53
(45) Друг, спасибо конечно, но мне не это нужно, а нужно то что бы все документы из одной базы отправить в другую базу. И надо сделать это через http сервис. Спасибо за исправления, учту.
47 KemerovIvan
 
28.09.20
11:56
Или если есть варианты, как проще это реализовать
48 KemerovIvan
 
28.09.20
11:57
Но желательно именно через HTTP сервисы
49 KemerovIvan
 
28.09.20
11:57
Буду очень признателен
50 DexterMorgan
 
28.09.20
12:46
конфигурации баз одинковые или разные?
51 KemerovIvan
 
28.09.20
14:10
(50) одинаковые
52 MadJhey
 
28.09.20
14:40
Документы.Обмен.НайтиПоНомеру(НомерДокумента).Название - это конечно сильно.
Разбить json на блоки по видам документов, для каждого вида документа отдельно написать разбор. Отдельно выгружать ключевые справочники. Передавать примитивные типы (число, строка).
Недавно делал тоже самое (согласовывал номенклатуру, цены, приходы), но через xml. За все документы я бы не взялся, там куча работы по согласованию данных.
53 MadJhey
 
28.09.20
14:43
Для Индекс = 0 по СуммаТаб - 1 Цикл
            НазваниеТовара = Документы.Обмен.НайтиПоНомеру(НомерДокумента).Вопросы[Индекс].Товар;
            ЦенаТовара = Документы.Обмен.НайтиПоНомеру(НомерДокумента).Вопросы[Индекс].Цена;
            
страшно приставить, что покажет парсер SQL на такое, а через запрос сделать не судьба?
54 KemerovIvan
 
28.09.20
15:11
(53) Я не прошу исправлять тот код, это был первый вариант
55 KemerovIvan
 
28.09.20
15:11
по HTTP сервисам если есть что добавить, тогда пишите
56 MadJhey
 
28.09.20
15:23
По думай об верификации переданной информации. Например номенклатура передана успешно - возвращаешь какой - нибудь параметр.  Мне пришлось разбить данные на пакеты, иначе выдавал ошибку по таймингу.
https://xn----1-bedvffifm4g.xn--p1ai/articles/2017-09-07-exchange-with-internet-services/ - вот целая статья по http
57 KemerovIvan
 
29.09.20
07:52
(56) Спасибо
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.