Имя: Пароль:
1C
1С v8
ОболочкаActiveDocument
0 darkhome
 
28.11.13
12:33
Создал в общихМакетах Макет типа ActiveDocument с расширением doc. Не получает с ним работать. Подскажите что не так. Делаю на УФ. Вот код

&НаКлиенте
Процедура Печать(Команда)
    ПолучитьМакетНаСервере("ПФ_DOC_Договор");
    //MSWord = Договор.Получить;
КонецПроцедуры

Процедура ПолучитьМакетНаСервере(ИмяМакета)
    Договор = ПолучитьОбщийМакет(ИмяМакета);
    MSWord = Договор.Получить;
конецпроцедуры

Выскакивает ошибка
Ошибка при вызове метода контекста (Получить)
    MSWord = Договор.Получить();
1 Cube
 
28.11.13
12:34
&НаСервере забыл?
2 darkhome
 
28.11.13
12:36
Если не указываешь директиву, то по умолчанию означает что код будет выполняться на сервере
3 darkhome
 
28.11.13
12:37
Да я пробовал и &НаСервере и &НаСервереБезКонтекста. Все-равно не получается
4 Cube
 
28.11.13
12:40
А зачем ты пишешь Получить()? Ведь у тебя это не хранилище...
5 darkhome
 
28.11.13
12:43
(4) А как надо сделать что бы заработало
6 Cube
 
28.11.13
12:44
MSWord = ПолучитьОбщийМакет(ИмяМакета);
не?
7 darkhome
 
28.11.13
12:48
А потом как начать работать с документом что бы можно было заполнять поля в нем?
8 darkhome
 
28.11.13
12:49
Я ставлю
Документ = MSWord.Application.Documents(1);
Документ.Activate();
У меня сразу выскакивает
Поле объекта не обнаружено (Application)
Документ = MSWord.Application.Documents(1);

Весь инет облазил. У всех работает. Может я что с начала не правильно делал
9 Cube
 
28.11.13
12:52
(8) А ты что, заполнять его на сервере собрался?
10 darkhome
 
28.11.13
12:53
Ну вроде как так надо делать.
11 Cube
 
28.11.13
13:03
(10) Я уже сильно не помню причины, но я делаю через временный файл.

Код такой (у меня макет хранится в ХЗ):

&НаКлиенте
Процедура СформироватьПечатнуюФорму(ДоговорКонтрагента, Макет)

    ДанныеДляПечати = ПолучитьДанныеДляПечати(ДоговорКонтрагента, Макет);
    
    ХранилищеМакета = ДанныеДляПечати[0];
    Если ХранилищеМакета.Представление = "ХранилищеМакета" Тогда
        ИмяФайла = ПолучитьИмяВременногоФайла();
        ХранилищеМакета.Значение.Записать(ИмяФайла); //Записываем макет во временный файл.
        ДанныеДляПечати.Удалить(ХранилищеМакета);
    Иначе
        Сообщить("Ошибка получения макета", СтатусСообщения.Внимание);
        Возврат;
    КонецЕсли;
    Попытка
        MSWord = ПолучитьCOMОбъект(, "Word.Application");    //Если Word уже открыт, то подключаемся к нему.
    Исключение
        Попытка
            MSWord = Новый COMОбъект("Word.Application");    //Открываем Word.
        Исключение
            Сообщить("Ошибка формирования печатной формы. Скорее всего на Вашем компьютере не установлен Microsoft Word.", СтатусСообщения.Внимание);
            Сообщить(ОписаниеОшибки(), СтатусСообщения.Внимание);
            Возврат;
        КонецПопытки;
    КонецПопытки;
    Документ = MSWord.Documents.Open(ИмяФайла);                //Открываем макет из временного файла.
    MSWord.Selection.WholeStory();                            //Выделяем весь документ.
    MSWord.Selection.Copy();                                //Копируем выделенное в буфер.
    Документ.Close();                                        //Закрываем документ.
    УдалитьФайлы(ИмяФайла);                                    //Удаляем временный файл.
    Документ = MSWord.Documents.Add();                        //Создаем новый документ.
    MSWord.Selection.PasteAndFormat(19);                    //Вставляем в документ содержимое из буфера с форматом исходного документа.
    MSWord.ActiveDocument.Range(0,1).Copy();                //Очищаем буфер обмена, чтоб лишних вопросов при закрытии документа не задавал.
    MSWord.Selection.HomeKey(6);                            //Переводим курсор в начало документа.
    
    //Производим заполнение заменяемых полей
    Замена = Документ.Content.Find;
    Для Каждого ЗаменяемоеПоле Из ДанныеДляПечати Цикл
        Замена.Execute(ЗаменяемоеПоле.Значение, Ложь, Истина, Ложь, , , Истина, , Ложь, ЗаменяемоеПоле.Представление, 2);
    КонецЦикла;
    
    //Проверяем, остались ли незаполненные заменяемые поля
    Если Замена.Execute("{") Тогда
        Сообщить("В печатной форме """ + СокрЛП(Макет.Наименование) + """ заполнены не все заменяемые поля.", СтатусСообщения.Внимание);
    КонецЕсли;
    
    Документ.Saved = Истина;                                //Помечаем документ как сохраненный, чтобы при закрытии не выдавался запрос на сохранение документа
    Если Элементы.ФормаПечатьНаПринтер.Пометка Тогда
        Документ.PrintOut(Истина, , , , , , , Макет.КоличествоКопий, , , , Истина);
        Документ.Close();
    Иначе
        MSWord.Visible = Истина;
        MSWord.Activate();
    КонецЕсли;
    
КонецПроцедуры //СформироватьПечатнуюФорму()
12 darkhome
 
28.11.13
13:06
(11) Спасибо. Попробую. Надеюсь заработает
13 Cube
 
28.11.13
13:08
ПолучитьДанныеДляПечати() выполняется &НаСервере
14 darkhome
 
02.12.13
12:03
&НаСервереБезКонтекста
Процедура ПолучитьМакетНаСервере()
    Макет = ПолучитьОбщийМакет("ПФ_DOC_Договор");
    Ком = Макет.Получить();
    Ком.Application.Visible = 1;
конецПроцедуры    

&НаКлиенте
Процедура Напечатать(Команда)
    Состояние(НСтр("ru = 'Выполняется формирование печатных форм'"));
    
    ПолучитьМакетНаСервере();
        
КонецПроцедуры

Ошибка при вызове метода контекста (Получить)
    Ком = Макет.Получить();


Что не так? Сделал как написано в книге "Профессиональная разработка в системе 1С".
В общих макетах создал .doc макет, в него скопировал содержимое документа. Пытаюсь его получить, вылетает ошибка. Помоги разобрать, как сделать через ActiveDocument
15 darkhome
 
02.12.13
12:04
Тип созданного макета - ActiveDocument
16 darkhome
 
02.12.13
12:06
Делаю все это во внешней обработке
17 Kupogun
 
02.12.13
12:08
(14) что за ошибка?
18 darkhome
 
02.12.13
12:09
Ошибка при вызове метода контекста (Получить)
    Ком = Макет.Получить();
19 Kupogun
 
02.12.13
12:10
хз, попробуй так

текОбъект = ЭтаФорма.РеквизитФормыВЗначение("Объект");
Макет = текОбъект.ПолучитьМакет("ПФ_DOC_Договор");
20 darkhome
 
02.12.13
12:11
(19) Делал, не получается
21 Cube
 
02.12.13
12:15
(14) (18) Ты (4) Читал?

&НаСервереБезКонтекста
Процедура ПолучитьМакетНаСервере()
    Ком = ПолучитьОбщийМакет("ПФ_DOC_Договор");
    Ком.Application.Visible = 1;
конецПроцедуры    

&НаКлиенте
Процедура Напечатать(Команда)
    Состояние(НСтр("ru = 'Выполняется формирование печатных форм'"));
    ПолучитьМакетНаСервере();
КонецПроцедуры

Так работает?
22 darkhome
 
02.12.13
12:17
(4) я читал
23 darkhome
 
02.12.13
12:19
(21) Сделал так, выскочила другая ошибка

Поле объекта не обнаружено (Application)
    Ком.Application.Visible = 1;

Я еще раз повторюсь, делал по примеру, который приведен в книге.
24 darkhome
 
02.12.13
12:20
Ну если не работает, как там приведен, вот я спрашиваю у Вас все, форумчане. Так как считаю этот форум одним из лучших по 1С, почти всегда тут можно найти решение проблем
25 Cube
 
02.12.13
12:23
(23) А, точно, Получить() надо. Только что посмотрел, как раньше делал. Тогда у меня версия, что у тебя в макете что-то не то...
26 Cube
 
02.12.13
12:26
+(25) Если оставить только суть, то:

Макет = ПолучитьМакет("Макет");
MSWord = Макет.Получить();
...
Документ = MSWord.Application.Documents(1);
Документ.Activate();
...
MSWord.Application.Visible = Истина;
MSWord.Activate();