Имя: Пароль:
1C
 
как программно сохранить отчет в эксель, выполняя его #НаСервере
0 olo_lo1
 
14.03.17
07:01
Добрый день

Есть web-сервис, который вызывается и выполняется сразу на сервере (в серверной процедуре).
Есть отчет, написан на СКД. Но я уже всю голову сломал как его сохранить в эксель, выполняя на сервере, ведь нет доступа к ЭлементыФормы.Результат

//Получаем схему из макета
СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

//Из схемы возьмем настройки по умолчанию
//Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
Настройки = КомпоновщикНастроек.Настройки;

//Помещаем в переменную данные о расшифровке данных
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;

//Формируем макет, с помощью компоновщика макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

//Передаем в макет компоновки схему, настройки и данные расшифровки
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,
Настройки, ДанныеРасшифровки);

//Выполним компоновку с помощью процессора компоновки
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,,
ДанныеРасшифровки);

//Очищаем поле табличного документа
Результат = ЭлементыФормы.Результат;
Результат.Очистить();

//Выводим результат в табличный документ
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);

ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
1 DrZombi
 
гуру
14.03.17
07:09
(0) Точно так же, как и на клиенте :)
2 Лодырь
 
14.03.17
07:09
Создай табличный документ, выведи в него отчет, сохрани. В чем сложность?
3 DrZombi
 
гуру
14.03.17
07:10
+(0) В качестве Результата помести Табличный документ :)
4 olo_lo1
 
14.03.17
07:18
(1,2,3) да ты попробуй на сервере это выполнить
5 h-sp
 
14.03.17
07:23
(4) а в чем сложность? На сервере показать табличный документ нельзя. Всё остальное можно.
6 olo_lo1
 
14.03.17
07:26
Спасибо, утро не проснулся))
7 Мимохожий Однако
 
14.03.17
07:32
ГотовыйТабличныйДокумент = Новый ХранилищеЗначения(Результат);
    
    //ГотовыйОтчетXLS
    ИмяФайла = ПолучитьИмяВременногоФайла();
    Результат.Записать(ИмяФайла,ТипФайлаТабличногоДокумента.XLS);
    ГотовыйОтчетXLS = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ИмяФайла));
8 olo_lo1
 
14.03.17
07:37
Подскажите пож по такому коду.
Есть какая то возможность обойти метод ОткрытьФорму, т.к. она выполняется на клиенте - хочу типовой попробовать впихнуть

Пример для «Карточки счета».



//Имя вызываемого отчета карточка,анализ, ОСВ по счету . Я делал только для этих трех.
    ИмяОтчета = "КарточкаСчета";
    
    //Заполняем реквизиты отчета и обязательные поля (могут отличаться в зависимости от отчета)
    ПользовательскиеНастройкиКомпоновкиДанных = Новый ПользовательскиеНастройкиКомпоновкиДанных;
    ПользовательскиеНастройкиКомпоновкиДанных.ДополнительныеСвойства.Вставить("Счет"          , Счет);
    ПользовательскиеНастройкиКомпоновкиДанных.ДополнительныеСвойства.Вставить("НачалоПериода" , Объект.ДатаНачало);
    ПользовательскиеНастройкиКомпоновкиДанных.ДополнительныеСвойства.Вставить("КонецПериода"  , Объект.ДатаКонец);
    ПользовательскиеНастройкиКомпоновкиДанных.ДополнительныеСвойства.Вставить("Организация"   , Объект.Организация);
    
    //Заполняем дополнительные отборы (в примере только для субконто1 и субконто2)
    НовыйОтбор                                        = ПользовательскиеНастройкиКомпоновкиДанных.Элементы.Добавить(Тип("ОтборКомпоновкиДанных"));
    НовыйОтбор.ИдентификаторПользовательскойНастройки = "Отбор";    
    ЗаполнитьЭлементОтбораКомпоновкиДанных(НовыйОтбор,Истина,ВидСравненияКомпоновкиДанных.Равно,"Субконто1", Контрагент);
    ЗаполнитьЭлементОтбораКомпоновкиДанных(НовыйОтбор,Истина,ВидСравненияКомпоновкиДанных.Равно,"Субконто2", Договор);
    
    //Обязателньо указываем ключ (Равным параметру "ИДРасшифровки",я указывал Имя отчета ) НастройкиРасшифровки
    НастройкиРасшифровки = Новый Структура;
    НастройкиРасшифровки.Вставить(ИмяОтчета, ПользовательскиеНастройкиКомпоновкиДанных);
    
    УсловияОтбора = Новый Структура();
    УсловияОтбора.Вставить("НастройкиРасшифровки", НастройкиРасшифровки);
    
    //Дублируем настройки (у меня в файловой без этого не открывалось)
    ОбщиеНастройки = Новый Структура();
    ОбщиеНастройки.Вставить("Объект"              , УсловияОтбора);
    ОбщиеНастройки.Вставить("НастройкиРасшифровки", НастройкиРасшифровки);
    
    //Помещаем во временное хранилище (Уид можно случайный)
    АлресХранилища = ПоместитьВоВременноеХранилище(ОбщиеНастройки, Новый УникальныйИдентификатор);
    
    //Обращаем внимания на заполнемые настройки, если вы укажете отбор = истина то затрется все выше указанные отборы ( поскольку показатели и группировки я не менял, то оставил их типоыми)
    ЗаполнятьТиповыеНастройки = Новый Структура;
    ЗаполнятьТиповыеНастройки.Вставить("Отбор"          , Ложь);
    ЗаполнятьТиповыеНастройки.Вставить("Группирова"     , Истина);
    ЗаполнятьТиповыеНастройки.Вставить("ВыводимыеДанные", Истина);
    ЗаполнятьТиповыеНастройки.Вставить("Показатели"     , Истина);
    
    //Сами параметры для предачи на форму ("ИДРасшифровки" - в данном случаи ключ от структуры НастройкиРасшифровки , если "СформироватьПриОткрытии" будет равно Ложь то отчет откроется с ранее сохраненными настройками)    
    ПараметрыОтчета = Новый Структура;
    ПараметрыОтчета.Вставить("ВидРасшифровки"         , 1);
    ПараметрыОтчета.Вставить("АдресНастроек"          , АлресХранилища);
    ПараметрыОтчета.Вставить("СформироватьПриОткрытии", Истина);
    ПараметрыОтчета.Вставить("ИДРасшифровки"          , ИмяОтчета);
    ПараметрыОтчета.Вставить("РежимРасшифровки"       , Истина);
    ПараметрыОтчета.Вставить("ЗаполняемыеНастройки"   , ЗаполнятьТиповыеНастройки);
    
    //Ну и открываем саму форму
    ОткрытьФорму("Отчет." + ИмяОтчета + ".Форма.ФормаОтчета", ПараметрыОтчета,ЭтаФорма);
9 olo_lo1
 
14.03.17
07:38
может все таки есть идеи как обойтись без вызова клиента и без СКД
10 Мимохожий Однако
 
14.03.17
07:39
(8) Куда ты хочешь прийти? Я не понял.
11 Альбатрос
 
14.03.17
07:39
(9) У тебя отчет построен на СКД, а ты хочешь без него обойтись?
12 Stepa86
 
14.03.17
09:07
13 olo_lo1
 
14.03.17
12:29
(10) я хочу выполнить отчет в момент того как придет REST запрос и отправить его получателю. Как то так. Есть типовой отчет в бухгалтерии 3.0 Задолженность по покупателям. Хочу его отправить, жедательно без допиливаний. Но так как не придумал как сделать без открытия формы - делаю через СКД
14 Лодырь
 
14.03.17
13:52
(13) А кто мешает тебе выполнить все те действия что ты делаешь при открытии, сделать просто так, на сервере? И вывести отчет? В упор не понимаю.
15 Garykom
 
гуру
14.03.17
14:16
(14) Не кто а что, вероятно мешает неумение читать/понимать книжки/учебники по 1С.
16 olo_lo1
 
14.03.17
17:10
(14) Я же написал, что это серверная процедура. Там нельзя вызвать ПолучитьФорму или ОткрытьФорму
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший