Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Сериализация и десериализация JSON нескольких документов

Сериализация и десериализация JSON  нескольких документов
Я
   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.Закрыть();
        
КонецПроцедуры
   KemerovIvan
 
1 - 25.09.20 - 14:57
Хоть справочники, хоть документы. Везде выдает ошибку
   Ёпрст
 
2 - 25.09.20 - 14:58
(0) в этом коде нет записи документа в жсон.
   KemerovIvan
 
3 - 25.09.20 - 14:59
(2) разве?
   Ёпрст
 
4 - 25.09.20 - 15:00
(3) железобетонно
   KemerovIvan
 
5 - 25.09.20 - 15:00
Вот создание: ЗаписьJSON = Новый ЗаписьJSON;

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

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

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

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

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

 
 Рекламное место пустует
   KemerovIvan
 
31 - 28.09.20 - 09:11
(30) Ооо работает.
Но возникла новая проблема. Когда внутри одной базы я Сериализую, а потом считываю, он все показывает. Но когда передаю в другую базу через HTTP сервис то там не пишется ссылка не найдена

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

    Чтение.Закрыть();
   KemerovIvan
 
32 - 28.09.20 - 09:11
Вот такой код что бы прочитать
   KemerovIvan
 
33 - 28.09.20 - 09:12
Может я что то не так делаю?
   KemerovIvan
 
34 - 28.09.20 - 09:15
Пишет на каждой строке объект не найден
   Garykom
 
35 - 28.09.20 - 09:22
(33) Угу задачку слишком сложную взял пока не по силам.
   Garykom
 
36 - 28.09.20 - 09:23
(34) Дык объекта (в другой базе) нет по ссылке которая в JSON фуй ли шотишь?
   KemerovIvan
 
37 - 28.09.20 - 09:34
ну а как мне передать тогда через json все на другую базу?
   KemerovIvan
 
38 - 28.09.20 - 09:35
я сделал это через структуры, но мне сказали что можно и делать сериализацию и так сразу документы передавать целиком
   KemerovIvan
 
39 - 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.НеИспользовать);
    Возврат Ответ;
   KemerovIvan
 
40 - 28.09.20 - 09:36
Вот как передаю с помощью структур
   KemerovIvan
 
41 - 28.09.20 - 09:37
возможно есть вариант передать все таки по проще?!
   KemerovIvan
 
42 - 28.09.20 - 09:38
(36) Может подскажете как сделать вместо сарказма?
   hhhh
 
43 - 28.09.20 - 10:48
(42) вот тут у тебя невероятная хрень

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

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

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

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

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

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

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

и

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.