|
УПП как сериализовать универсальный отчет | ☑ | ||
---|---|---|---|---|
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
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |