Имя: Пароль:
1C
 
УПП как сериализовать универсальный отчет
0 breezee
 
21.01.21
17:22
Коллеги, добрый день. Ситуация такая: есть база УПП и её реплика. Есть отчеты, которые нагружают базу. Решили перенести все на реплику. Через веб сервис коннектимся к реплике и выполняем запрос, с параметрами, которые сериализуем на стороне клиента и передаем как строку по веб-сервису. Возвращаем сериализованный результат запроса. Для бух. отчтетов (ОСВ, карточка счета) проблем не было. А вот отчет на построителе отчета как оказалось не сериализуется. Я думал "обмануть" систему и поместить в хранилище посторитель, но оказалось (почитал СП) что так нельзя и в хранилище несериализуемые вещи помещать нельзя. Почитав форум нашел что через есть типовой механизм которым УПП сохраняет данные. Может у кого есть пример под рукой как сохранить настройки типовым методом и сериализовать? Я, наверное, разберусь, но может кто-то уже делал и сможет поделиться кодом, пожалуйста?))
1 acht
 
21.01.21
17:32
Если объект несериализуемый, то его какбэ нельзя сериализовать. Ни в хранилище, ни в строку, ни в Очень Тайный Механизм.
2 breezee
 
21.01.21
17:34
(1) Я про сераилзацию всех отборов и параметров и текста запроса. Кстати, попробую просто все свойства построителя сераилзовать, может выйдет)
3 breezee
 
22.01.21
08:42
Добрый день. Если кому понадобиться. В отчете УниверсальныйОтчет меняем
//было:
        //ПостроительОтчета.Выполнить();
        //ПостроительОтчета.Вывести(ТабличныйДокумент);
        //стало:
            ТабДокументВС = моймодуль_ОбщегоНазначенияКлиентСервер.ОбработатьПострительПоВебСервису(ПостроительОтчета);    
            ТабличныйДокумент.Вывести(ТабДокументВС);
        

а в вашем модуле пишем:

функция ОбработатьПострительПоВебСервису(ПостроительОтчета) Экспорт

    //1. Сохраним из текущего построителя все настройки для нового построителя
    НастройкиПостроителя     = ПостроительОтчета.ПолучитьНастройки();
    
    СтруктураСвойствДляЗаполненияПостроителя = Новый Структура;
    
    СтруктураСвойствДляЗаполненияПостроителя.Вставить("АвтоДетальныеЗаписи", ПостроительОтчета.АвтоДетальныеЗаписи);
    //СтруктураСвойствДляЗаполненияПостроителя.Вставить("ВыбранныеПоля", ПостроительОтчета.ВыбранныеПоля);
    СтруктураСвойствДляЗаполненияПостроителя.Вставить("ВыводитьДетальныеЗаписи", ПостроительОтчета.ВыводитьДетальныеЗаписи);
    СтруктураСвойствДляЗаполненияПостроителя.Вставить("ВыводитьЗаголовокОтчета", ПостроительОтчета.ВыводитьЗаголовокОтчета);
    СтруктураСвойствДляЗаполненияПостроителя.Вставить("ВыводитьОбщиеИтоги", ПостроительОтчета.ВыводитьОбщиеИтоги);
    СтруктураСвойствДляЗаполненияПостроителя.Вставить("ВыводитьПодвалОтчета", ПостроительОтчета.ВыводитьПодвалОтчета);
    СтруктураСвойствДляЗаполненияПостроителя.Вставить("ВыводитьПодвалТаблицы", ПостроительОтчета.ВыводитьПодвалТаблицы);
    СтруктураСвойствДляЗаполненияПостроителя.Вставить("ВыводитьШапкуТаблицы", ПостроительОтчета.ВыводитьШапкуТаблицы);
    //СтруктураСвойствДляЗаполненияПостроителя.Вставить("ДобавлениеПредставлений", ПостроительОтчета.ДобавлениеПредставлений);
    //СтруктураСвойствДляЗаполненияПостроителя.Вставить("ДоступныеПоля", ПостроительОтчета.ДоступныеПоля);
    СтруктураСвойствДляЗаполненияПостроителя.Вставить("ЗаполнениеРасшифровки", ПостроительОтчета.ЗаполнениеРасшифровки);
    //СтруктураСвойствДляЗаполненияПостроителя.Вставить("ИзмеренияКолонки", ПостроительОтчета.ИзмеренияКолонки);
    //СтруктураСвойствДляЗаполненияПостроителя.Вставить("ИзмеренияСтроки", ПостроительОтчета.ИзмеренияСтроки);
    //СтруктураСвойствДляЗаполненияПостроителя.Вставить("ИсточникДанных", ПостроительОтчета.ИсточникДанных);
    СтруктураСвойствДляЗаполненияПостроителя.Вставить("Макет", ПостроительОтчета.Макет);
    СтруктураСвойствДляЗаполненияПостроителя.Вставить("МакетДетальныхЗаписей", ПостроительОтчета.МакетДетальныхЗаписей);
    СтруктураСвойствДляЗаполненияПостроителя.Вставить("МакетЗаголовкаОтчета", ПостроительОтчета.МакетЗаголовкаОтчета);
    СтруктураСвойствДляЗаполненияПостроителя.Вставить("МакетОбщихИтогов", ПостроительОтчета.МакетОбщихИтогов);
    СтруктураСвойствДляЗаполненияПостроителя.Вставить("МакетОформления", ПостроительОтчета.МакетОформления);
    СтруктураСвойствДляЗаполненияПостроителя.Вставить("МакетПодвалаОтчета", ПостроительОтчета.МакетПодвалаОтчета);
    СтруктураСвойствДляЗаполненияПостроителя.Вставить("МакетПодвалаТаблицы", ПостроительОтчета.МакетПодвалаТаблицы);
    СтруктураСвойствДляЗаполненияПостроителя.Вставить("МакетШапкиТаблицы", ПостроительОтчета.МакетШапкиТаблицы);
    СтруктураСвойствДляЗаполненияПостроителя.Вставить("ОбрабатыватьПрерываниеПользователя", ПостроительОтчета.ОбрабатыватьПрерываниеПользователя);
    //СтруктураСвойствДляЗаполненияПостроителя.Вставить("Отбор", ПостроительОтчета.Отбор);
    СтруктураСвойствДляЗаполненияПостроителя.Вставить("ОтображатьСостояние", ПостроительОтчета.ОтображатьСостояние);
    СтруктураСвойствДляЗаполненияПостроителя.Вставить("Параметры", ПостроительОтчета.Параметры);
    //СтруктураСвойствДляЗаполненияПостроителя.Вставить("Порядок", ПостроительОтчета.Порядок);
    СтруктураСвойствДляЗаполненияПостроителя.Вставить("РазмещениеИзмеренийВКолонках", ПостроительОтчета.РазмещениеИзмеренийВКолонках);
    СтруктураСвойствДляЗаполненияПостроителя.Вставить("РазмещениеИзмеренийВСтроках", ПостроительОтчета.РазмещениеИзмеренийВСтроках);
    //СтруктураСвойствДляЗаполненияПостроителя.Вставить("РазмещениеИтоговВКолонках", ПостроительОтчета.РазмещениеИтоговВКолонках);
    //СтруктураСвойствДляЗаполненияПостроителя.Вставить("РазмещениеИтоговВСтроках", ПостроительОтчета.РазмещениеИтоговВСтроках);
    СтруктураСвойствДляЗаполненияПостроителя.Вставить("РазмещениеРеквизитовИзмеренийВКолонках", ПостроительОтчета.РазмещениеРеквизитовИзмеренийВКолонках);
    СтруктураСвойствДляЗаполненияПостроителя.Вставить("РазмещениеРеквизитовИзмеренийВСтроках", ПостроительОтчета.РазмещениеРеквизитовИзмеренийВСтроках);
    //СтруктураСвойствДляЗаполненияПостроителя.Вставить("Результат", ПостроительОтчета.Результат);
    СтруктураСвойствДляЗаполненияПостроителя.Вставить("Текст", ПостроительОтчета.Текст);
    СтруктураСвойствДляЗаполненияПостроителя.Вставить("НастройкиПостроителя", НастройкиПостроителя);
    
    СтруктураСвойствДляЗаполненияПостроителя_Хранилище_Сериал = ОбщегоНазначения.ЗначениеВСтрокуXML(Новый ХранилищеЗначения(СтруктураСвойствДляЗаполненияПостроителя));
    
    Попытка  
        ОпределениеWS = Новый WSОпределения(ПутьВебСервисаОбмена, ИмяПользователяОбмена, ПарольПользователяОбмена);
    Исключение
        Сообщить(ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;    

    Сервис                = ОпределениеWS.Сервисы.Получить(0);
    ИмяСервиса            = Сервис.Имя;
    ТочкаПодключения    = Сервис.ТочкиПодключения.Получить(0).Имя;
            
    КлиентWS = Новый WSПрокси(ОпределениеWS, Сервис.URIПространстваИмен, ИмяСервиса, ТочкаПодключения);
    
    КлиентWS.Пользователь = ИмяПользователяОбмена;
    КлиентWS.Пароль          = ПарольПользователяОбмена;

    ТабДокСериализованный =  КлиентWS.ВыполнитьПостроитель(СтруктураСвойствДляЗаполненияПостроителя_Хранилище_Сериал);
    
    ТабдДок = ОбщегоНазначения.ЗначениеИзСтрокиXML(ТабДокСериализованный);
    
    ТабдДок = ТабдДок.Получить();
    
    Возврат ТабдДок;
    
КонецФункции


А в веб-сервисе создаем процедуру для получения данных:

Функция ВыполнитьПостроитель(СтруктураПараметровЗапроса)
    
    //Веб сервис
    СтруктураСвойствДляЗаполненияПостроителя     = ОбщегоНазначения.ЗначениеИзСтрокиXML(СтруктураПараметровЗапроса);
    СтруктураСвойствДляЗаполненияПостроителя     = СтруктураСвойствДляЗаполненияПостроителя.Получить();    
    
    Параметры = СтруктураСвойствДляЗаполненияПостроителя.Параметры;
    
    //Создадим построитель и заполним параметры отчета
    ПостроительОтчета = Новый ПостроительОтчета;
    
    ПостроительОтчета.Текст = СтруктураСвойствДляЗаполненияПостроителя.Текст; //Заполнение отдельно для возможности установки отборов и прочего
    
    Для Каждого Параметр Из Параметры Цикл
        ПостроительОтчета.Параметры.Вставить(Параметр.Ключ, Параметр.Значение);
    КонецЦикла;    
    
    Для Каждого Свойство Из СтруктураСвойствДляЗаполненияПостроителя Цикл
        
        Свойство_Ключ = Свойство.Ключ;
        Свойство_Значение = Свойство.Значение;
        
        Если Свойство_Ключ = "Параметры" Тогда
            Продолжить;
        КонецЕсли;    
        
        Если Свойство_Ключ = "Результат" Тогда
            Продолжить;
        КонецЕсли;
        
        Если Свойство_Ключ = "НастройкиПостроителя" Тогда
            Продолжить;
        КонецЕсли;
        
        ПостроительОтчета[Свойство_Ключ] = Свойство_Значение;
        
    КонецЦикла;    
    
    ПостроительОтчета.УстановитьНастройки(СтруктураСвойствДляЗаполненияПостроителя.НастройкиПостроителя);
    
    //ПостроительОтчета.ЗаполнениеРасшифровки = ВидЗаполненияРасшифровкиПостроителяОтчета.Расшифровка;
    
    ПостроительОтчета.Выполнить();
    
    Табдок = Новый ТабличныйДокумент;
    
    ПостроительОтчета.Вывести(Табдок);
        
    РезультатХранилищеСериал = ОбщегоНазначения.ЗначениеВСтрокуXML(Новый ХранилищеЗначения(Табдок));
    
    Возврат РезультатХранилищеСериал;
    
КонецФункции

Может, кому-то будет полезно. Пол дня убил на это))
4 acht
 
22.01.21
11:36
Бедненькие, чтож вы так без ЗаполнитьЗначениеСвойств мучаетесь-то?
5 Вафель
 
22.01.21
12:33
во внутр. строку то можно запихать?
6 acht
 
22.01.21
12:39
(5) Нельзя.

    Построитель = Новый ПостроительОтчета;
    Построитель.Текст = "ВЫБРАТЬ 1";
    Построитель.ЗаполнитьНастройки();
    
    Сообщить(ЗначениеВСтрокуВнутр(Построитель));

{"#",0dda99d9-ae9f-43d2-b7ac-44f3fb0d4059}
7 breezee
 
22.01.21
12:41
(4) Про функцию я знаю)) Да, чет не додумался. Я только для структур её обычно использую, не доверяю для объектов((
8 acht
 
22.01.21
12:43
(7) > не доверяю
Да вообще, опасное это дело - на 1С программировать.
9 breezee
 
22.01.21
12:44
:C
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.