Имя: Пароль:
1C
 
Active Document перестал работать на 8.3.6.2237
0 evorle145
 
18.09.15
15:39
Помогите, чет совсем в ступоре. База клиент-серверная.

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

Падает в исключение!


Функция ПолучитьМакетСервер(КомОбъект)
    Об = РеквизитФормыВЗначение("Объект");
    Макет = Об.ПолучитьМакет("Макет");  
    ИмяФайла = ПолучитьИмяВременногоФайла("doc");
    Макет.Записать(ИмяФайла);
        
    Возврат ИмяФайла;
    
КонецФункции


Где туплю, подскажите?
1 ВедущийП
 
18.09.15
15:41
Текст ошибки?
2 evorle145
 
18.09.15
15:42
{Справочник.ДоговорыКонтрагентов.Форма.ФормаЭлемента.Форма(1010)}: Ошибка при вызове метода контекста (ПолучитьCOMОбъект): Ошибка получения объекта COM: -2147221020(0x800401E4): Синтаксическая ошибка
3 evorle145
 
18.09.15
15:44
(1) , забыл уточнить, в файлом варианте все работает!
4 Записьдампа
 
18.09.15
15:45
(0) Файловые системы на клиенте и сервере - очень разные вещи. Начиная от расположения файлов и кончая правами доступа.
5 evorle145
 
18.09.15
15:47
(4) , понимаю. Но ведь тут сделано все вроде по инструкции как http://catalog.mista.ru/public/270277/ . Но com объект на клиенте создать не может...
6 ВедущийП
 
18.09.15
15:51
Windows 32 разрядный?
7 evorle145
 
18.09.15
15:52
(6) не, 64
8 Записьдампа
 
18.09.15
15:56
(5) Это к автору писульки на нимфостарте, плз. Ты сохраняешь файл по пути для сервера, а потом пытаешся читать его на клиенте. А это возможно только в файловой базе или в случае когда сервер запущен на той же машине.
9 evorle145
 
18.09.15
15:58
(8) , так а как же тогда? читать тоже на сервере что ли?
10 Записьдампа
 
18.09.15
16:03
(9) Передавать тушку файла, из которого ты создаешь комобъект, через временное хранилище.
11 Serginio1
 
18.09.15
16:03
Возвращай Двоичные Данные и записывай на клиенте в папки на которые есть разрешения в Ворде итд.
12 ВедущийП
 
18.09.15
16:06
(5) Сохраняй файл в общей папке, и отдавай путь типа \\server\share\fail.doc
13 ВедущийП
 
18.09.15
16:09
Функция ПолучитьМакетСервер(КомОбъект)
    Об = РеквизитФормыВЗначение("Объект");
    Макет = Об.ПолучитьМакет("Макет");  
    ИмяФайла = ПолучитьИмяВременногоФайла("doc");
    СтрЗаменить(ИмяФайла, КаталогВременныхФайлов(), "\\server\share\");
Макет.Записать(ИмяФайла);
        
    Возврат ИмяФайла;
    
КонецФункции
14 ВедущийП
 
18.09.15
16:09
Ессесно надо добавить ИмяФайла=
ИмяФайла = СтрЗаменить(ИмяФайла, КаталогВременныхФайлов(), "\\server\share\");
15 ВедущийП
 
18.09.15
16:10
В папку должен доступ иметь пользователь под которым запущен сервер 1С
16 evorle145
 
18.09.15
16:11
(13) , то есть проблема в том , что на клиенте я не могу обратиться к файлу, у которого путь такой: C:\Users\USR1CV82\AppData\Local\Temp\  ?
17 evorle145
 
18.09.15
16:16
(11)  это то есть так делать:
&НаСервере
Функция ПолучитьМакетСервер(АдресФайлаВХранилище)
    Об = РеквизитФормыВЗначение("Объект");
    Макет = Об.ПолучитьМакет("Макет");  
    ИмяФайла = ПолучитьИмяВременногоФайла("doc");
    Макет.Записать(ИмяФайла);
    ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);
    АдресФайлаВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
    Возврат ИмяФайла;
КонецФункции

И потом на клиенте
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайлаВХранилище );
ДвоичныеДанные.Записать(ПолучитьИмяВременногоФайла("doc"));
18 ВедущийП
 
18.09.15
16:23
(16) Путь к файлу, который находится на сервере. А ты или не на сервере, или,  если на сервере, у тебя нет доступа к папке пользователя, под которым запущен сервер 1с.
19 evorle145
 
18.09.15
16:27
(18) , да, доступа нет, совершенно верно. Сейчас буду делать как вы сказали. Только хотел бы еще просить взглянуть на (17), что я не так тут сделал, что опять валится в исключение, вот сам код:
Макет = ПолучитьМакетСервер(АдресФайлаВХранилище); //серверная функция, записывает макет в файл и возвращает полное имя файла  
        ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайлаВХранилище );
        ИмяФ = ПолучитьИмяВременногоФайла("doc");
        ДвоичныеДанные.Записать(ИмяФ);
        Попытка        
            КомОбъект = ПолучитьCOMОбъект(ИмяФ); //инициализируем COM-объект
        Исключение
            КомОбъект = 0;
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = ОписаниеОшибки();
            Сообщение.Сообщить();
            
        КонецПопытки;
20 evorle145
 
18.09.15
16:28
В функцию добавил помещение во временное хранилище:

Функция ПолучитьМакетСервер(АдресФайлаВХранилище)
    Об = РеквизитФормыВЗначение("Объект");
    Макет = Об.ПолучитьМакет("Макет");  
    ИмяФайла = ПолучитьИмяВременногоФайла("doc");
    Макет.Записать(ИмяФайла);
    ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);
    АдресФайлаВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
    
    Возврат ИмяФайла;
    
КонецФункции
21 Serginio1
 
18.09.15
16:43
(17) А разве нельзя просто
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);
      Возврат ДвоичныеДанные ;
22 evorle145
 
18.09.15
16:46
(21) Может быть и так тоже работает! Прошу меня просить, код в (19)-(20) полностью рабочий!! Спасибо больше Serginio1 и ВедущийП  за помощь! Воспользовался советом в (11)
23 Serginio1
 
18.09.15
16:52