Быстрое сохранение и чтение в 1с с помощью JSON



Очень часто необходимо выгрузить из БД 1с данные в таблице значений и загрузить их в другую БД и не только 1с. Для того что бы не мучатся с xml и получить компактный текстовый файл с сериализацией можно воспользоватся и JSON. Приведенный ниже код позволяет быстро выгрузить и загрузить данные из/в 1с.
Для примера выгрузим номенклатуру из УТ 10 (1с8.2 Обычные формы) и загрузим в БП 3 (1с8.3 Управляемые формы).

Создадим текст запроса:

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

    ЗаписьПлоскогоЗапросаВФайл(ИмяКаталогаЗагрузки, "Номенклатура", ТекстЗапроса);
КонецПроцедуры

Выполним и выгрузим:

//Выполняем и записываем ч/з проц. выгрузки 
Процедура ЗаписьПлоскогоЗапросаВФайл(Каталог, ИмяЗапроса, ТекстЗапроса)
    Запрос = Новый Запрос();
    Запрос.Текст = ТекстЗапроса;
    ЗаписьТзВФайл(СокрЛП(Каталог) + "\" + СокрЛП(ИмяЗапроса) + ".jsn", Запрос.Выполнить().Выгрузить());
КонецПроцедуры

Ну вот и самое вкусное, универсальная процедура для JSON:

Процедура ЗаписьТЗВФайл(ИмяФайла, тз_)
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.ПроверятьСтруктуру = Ложь;

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

    ЗаписьJSON.ЗаписатьНачалоМассива();
    
    Для Каждого Стр Из тз_ Цикл
        ЗаписьJSON.ЗаписатьНачалоОбъекта();
        Для Каждого Колонка Из тз_.Колонки Цикл
            ЗаписьJSON.ЗаписатьИмяСвойства(СокрЛП(Колонка.Имя));
            ЗаписьJSON.ЗаписатьЗначение(СокрЛП(Стр[Колонка.Имя]));              
        КонецЦикла;
        ЗаписьJSON.ЗаписатьКонецОбъекта();
    КонецЦикла;
    ЗаписьJSON.ЗаписатьКонецМассива();
    
    ЗаписьJSON.Закрыть();
КонецПроцедуры

Загрузим в 1С БП 3:

//Загрузка файла JSON в УФ
//ОбработкаФайлаНом - реквизит формы произвольного типа
//ИмяКаталогаЗагрузки - реквизит формы типа строка
&НаКлиенте
Процедура ВыполнитьОбработку(Команда)
    Объект.ОбработкаФайлаНом = 
        ПоместитьВоВременноеХранилище(СокрЛП(Объект.ИмяКаталогаЗагрузки) + "\Номенклатура.jsn");

    ЗагрузитьДанныеВТзНоменклатура();
КонецПроцедуры

//Прочитаем из временного хранилища
&НаСервере
Функция ЗагрузитьДанныеВТзНоменклатура()
    ДокумОб = ПолучитьИзВременногоХранилища(Объект.ОбработкаФайлаНом);
    Возврат ПрочитатьТзИзФайла(ДокумОб);
КонецФункции

//Чтение JSON из потока
&НаСервере
Функция ПрочитатьТзИзФайла(ДокумОб) 
    тзДанные = Новый ТаблицаЗначений;
    
    ЧтJSON = Новый ЧтениеJSON();
    ЧтJSON.ОткрытьФайл(ДокумОб);
    Массив = ПрочитатьJSON(ЧтJSON);
    ЧтJSON.Закрыть();   
    
    Для Каждого ЭлементМассива из Массив Цикл
        Для Каждого Элемент Из ЭлементМассива Цикл 
            тзДанные.Колонки.Добавить(СокрЛП(Элемент.Ключ));
        КонецЦикла; 
        Прервать;
    КонецЦикла; 
    
    Для Каждого ЭлементМассива из Массив Цикл
        Строка = тзДанные.Добавить();
        Для Каждого Элемент Из ЭлементМассива Цикл
            Строка[СокрЛП(Элемент.Ключ)] = СокрЛП(Элемент.Значение);            
        КонецЦикла; 
    КонецЦикла; 
    
    Возврат тзДанные;
КонецФункции

Related Post

Выложил в Google Play фотографирование с привязкой к кодуВыложил в Google Play фотографирование с привязкой к коду



Ну наконец то разобрался с правами в новом (для меня) 6-м Android-e, вытряхнул свой давний аккаунт с доступом к маркету Google Play и выложил первую версию по фотографированию товаров с