Имя: Пароль:
1C
1С v8
Как передать макет типа ActiveDocument c сервера клиенту
0 Ampfer
 
20.01.17
10:43
Уважаемые Cпецы,
Переделываю доставшуюся мне по наследству обработку с обычных форм на УФ.
Вынес код получения Макета на Сервер. Столкнулся с проблемой передачи макета (тип ActiveDocument Excel). Предложенные Гуглом варианты и танцы с бубнами не помогли. Пробовал также с использованием Временного хранилища. Ниже код этого варианта

&На Клиенте
Попытка
                    
        МакетСсылка   = ПолучитьМакет("Макет");
      Макет   = ПолучитьИзВременногоХранилища(МакетСсылка);                               
    Книга = Макет.Получить();
    ЛистШаблон = Книга.WorkSheets(1);
Исключение
    Сообщить(ОписаниеОшибки());
        
КонецПопытки;

&НаСервере
Функция ПолучитьМакет(ИмяМакета)
    УниИд = Новый УникальныйИдентификатор;
        ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
    ЭтотМакет = ОбработкаОбъект.ПолучитьМакет(ИмяМакета);
    Адрес =  ПоместитьВоВременноеХранилище(ЭтотМакет,УниИд);              
    Возврат  Адрес;
КонецФункции

Выдает ошибку в строке
Макет   = ПолучитьИзВременногоХранилища(МакетСсылка);
Пробовал также получить книгу на сервере (Макет.Получить()) и передать ее клиенту. Тоже не проходит. Помогите please.
1 drcrasher
 
20.01.17
10:51
не дешевле макет из екселя в таб док перенести?
2 Ampfer
 
20.01.17
11:32
Даже затрудняюсь сказать. В макете три листа Excel. В результате обработки, в Excel файле создаются три листа на каждого контрагента с данными фактических продаж из 1с. В пустые колонки пользователи копированием добавляют бюджетные цифры и таким образом получается план фактный анализ продаж по клиентам.
3 bolobol
 
20.01.17
11:43
(2) Спасибо за информацию. И всё же: не дешевле макет из екселя в таб док перенести? В три таб дока?? В ТЧ??? В три ТЧ????

А на сервере эксель имеется?

Сохранить актив в файл и загнать в двоичные данные.
4 Ampfer
 
20.01.17
12:17
(3) Сохранить актив в файл и загнать в двоичные данные.

В три таб дока?? В ТЧ??? В три ТЧ????
Как вариант, только тогда весь код переписывать.

Про вариант с сохранением в файл а потом загрузить его на клиенте  видел в гугле. Пока  не разобрался.
А вот про загнать в двоичные данные можно поподробнее
5 Ampfer
 
20.01.17
13:50
Пробую вариант с сохранением в файл

&НаКлиенте

МакетФайл   = ПолучитьМакет("Макет");
Попытка
   Макет = ПолучитьCOMОбъект(МакетФайл);
Исключение
   КомОбъект = 0;
   Сообщение = Новый СообщениеПользователю;
   Сообщение.Текст = ОписаниеОшибки();
   Сообщение.Сообщить();
   Возврат;
КонецПопытки;

&НаСервере
Функция ПолучитьМакет(ИмяМакета)
//Каталог =  ПараметрыСеанса.ТекущийПользователь.РабочийКаталог;
//Каталог = ?(Прав(Каталог,1) = "\", Каталог, Каталог+"\");
Каталог = "C:\Users\AVG\";
Если ЗначениеЗаполнено(Каталог) Тогда
    Попытка
    ПолноеИмяФайла = Каталог+ИмяМакета+".xlsx";
    ОбработкаОбъект =   РеквизитФормыВЗначение("Объект");
            ЭтотМакет = ОбработкаОбъект.ПолучитьМакет(ИмяМакета);
            ЭтотМакет.Записать(ПолноеИмяФайла);
            
            Возврат ПолноеИмяФайла;                      
        Исключение
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Не удалось записать файл "+ОписаниеОшибки();      
            Сообщение.Сообщить();
            Возврат Неопределено;          
        КонецПопытки;            
    Иначе
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Не указан каталог. Сохранение файла невозможно";
        Сообщение.Сообщить();
        Возврат Неопределено;
    КонецЕсли;    
КонецФункции

Файл создается и передается. Но не могу открыть на клиенте. И еще нет свойства РабочийКаталог  в ПараметрыСеанса.ТекущийПользователь.РабочийКаталог.Пришось его закоментировать.
6 Akela has missed
 
20.01.17
13:58
Надо было лишь в своей функции сделать следующее:

ЭтотМакет = ОбработкаОбъект.ПолучитьМакет(ИмяМакета);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
ЭтотМакет.Сохранить(ИмяВременногоФайла);
Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяВременногоФайла));
7 Evgueni
 
20.01.17
14:10
&НаСервере
Функция ПолучитьМакетСервер(НазваниеМакета)
АдресМакета = ПоместитьВоВременноеХранилище(Справочники.МойСправочник.ПолучитьМакет("МойДвоичныйМакетСЭкселемВнутри"));
Возврат АдресМакета;
КонецФункции    

&НаКлиенте
Процедура НаПечататьЧтоТо()
АдресМакета = ПолучитьМакетСервер();
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресМакета);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
Эксель = Новый COMОбъект("Excel.Application");
Эксель.Visible    = 1;
Книга = Эксель.WorkBooks.Open(ИмяВременногоФайла);
Лист = Книга.WorkSheets(1);
//TODO
КонецПроцедуры

Я так у себя реализовал
8 Ampfer
 
20.01.17
16:35
to 6,7 Спасибо коллеги, завтра попробую этот вариант
9 Ampfer
 
23.01.17
11:21
Заработало в таком виде
&НаСервере
Функция ПолучитьМакет(ИмяМакета)
Попытка
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xls");
    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
    ЭтотМакет = ОбработкаОбъект.ПолучитьМакет(ИмяМакета);
    ЭтотМакет.Записать(ИмяВременногоФайла);
    Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяВременногоФайла));
    Возврат Адрес;                      
Исключение
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = "Не удалось записать файл "+ОписаниеОшибки();      
    Сообщение.Сообщить();
    Возврат Неопределено;          
КонецПопытки;            
        
    
КонецФункции


&НаКлиенте

Попытка
    МакетФайл   = ПолучитьМакет("Макет");
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(МакетФайл);
    ИмяФ = ПолучитьИмяВременногоФайла("xls");
    ДвоичныеДанные.Записать(ИмяФ);
    Макет = ПолучитьCOMОбъект(ИмяФ); //инициализируем COM-объект
            
Исключение
    Сообщить("Не удалось получить макет");
    Сообщить(ОписаниеОшибки());                                            
КонецПопытки;

Еще раз большущее всем спасибо
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой