Имя: Пароль:
1C
 
программно закрыть ворд
0 Prog_man
 
гуру
18.03.25
14:40
Добрый день,

создаю договор в ворде, пересохраняю в PDF, открываю PDF все норм. только Ворд остается висеть в процессах (через диспетчер задач).

пробовал     
       Word.Application.Quit();

    Word.Quit();
как еще можно закрыть ?
1 Prog_man
 
гуру
18.03.25
14:40
Подробности
&НаКлиенте
Процедура СобратьМакетWORD(СсылкаНаОбъект)
        
    Данные = ПолучитьДанные(СсылкаНаОбъект);
      
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("doc");
    
    ИмяВременногоФайлаПДФ = ПолучитьИмяВременногоФайла("PDF");

    
    Адрес = ФормированиеДоговораПоШаблону();
    Если Адрес = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    Макет = ПолучитьИзВременногоХранилища(Адрес);
    Макет.Записать(ИмяВременногоФайла);
    Word = Новый COMОбъект("Word.Application");
    Документ = Word.Documents.Open(ИмяВременногоФайла);
        
    Попытка
        ДокументЗаполнение = Документ.Application.Documents(1);
        
        Для Каждого ЭлементДанных Из Данные Цикл
            //Сообщить(ЭлементДанных.Ключ + " = " + ЭлементДанных.Значение);
            
        Замена = Документ.Content.Find;
        Замена.Execute("«" + ЭлементДанных.Ключ + "»", Ложь, Истина, Ложь, Ложь, , Истина, , Ложь, СокрЛП(ЭлементДанных.Значение), 2);
    КонецЦикла;  
    
    Документ.SaveAS(ИмяВременногоФайлаПДФ, 17);  
    
       Word.Application.Quit();

    Word.Quit();
    
    ЗапуститьПриложение(ИмяВременногоФайлаПДФ);
    
    
    
        //
        //Word.Application.Visible = Истина;
        //Word.Activate();
        
    Исключение
        Сообщение         = Новый СообщениеПользователю();
        Сообщение.Текст = ОписаниеОшибки();
        Сообщение.Сообщить();    
        Word.Application.Quit();
    КонецПопытки;


КонецПроцедуры     
2 Волшебник
 
18.03.25
14:40
Word = 0
3 arsik
 
гуру
18.03.25
14:43
А вот так?
Замена = Неопределено;
ДокументЗаполнение = Неопределено;
Документ = Неопределено;
Word.Application.Quit();
Word.Quit();
Word = Неопределено;
4 Prog_man
 
гуру
18.03.25
14:45
(2) (3) не получается
5 sikuda
 
18.03.25
14:46
(2) Мы перфекционисты -
Word = Неопределенно;

(0) Создаю договор в 1С, сохраняю его в PDF и вообще не знаю что такое Word.Application!
6 Волшебник
 
18.03.25
14:46
(4) Надо подождать. Сборщик мусора не сразу отрабатывает
И перед закрытием Word надо закрыть открытый файл
7 novichok79
 
18.03.25
14:50
(0) сделайте сервис обертку уже.
вам надо убить процесс, если по-другому никак.
отправьте через Выполнить команду taskkill.
8 Prog_man
 
гуру
18.03.25
15:00
(5) задачка чтобы менеджеры не правили вручную договор, раньше нужно было чтобы в ворде открывался, сейчас вот нужно в PDF. в PDF открывается. а ворд весит в процессах.
не понятно почему не срабатывает код:
Word.Application.Quit();
Word.Quit();
9 arsik
 
гуру
18.03.25
15:04
(8) А нахрена тебе ворд в этой чехарде? из 1С печатную форму сразу в pdf сохраняй.
Ну а по сути нужно очистить все ссылки на твой ком-объект, тогда из памяти уйдет.
Можно еще делать например так: Открывать пустую форму, при создании сгенерить все и отменить открытие. При убийстве формы 1С почистит и все ссылки.
10 Prog_man
 
гуру
18.03.25
15:07
(9) так макет на ворде сделан и все работает, предлагаешь переделать макет на табличный документ ?
11 arsik
 
гуру
18.03.25
15:08
(10) Это плохо?
12 Prog_man
 
гуру
18.03.25
15:14
дипсик подсказал, вот рабочее решение:

    
    Документ.Close(0); // 0 — не сохранять изменения
    Word.Application.Quit();
    
    // Закрываем Word
    Word.Quit();
    Word = Неопределено; // Освобождаем объект
13 Prog_man
 
гуру
18.03.25
15:16
(11) то что макет в ворде, это очень даже хорошо, если нужно вносить изменения, просто скидываю вордовский файл юристам.
там несколько договоров на десять страниц.
14 arsik
 
гуру
18.03.25
15:22
(13) После юристов все равно программист это шаблон разгребает.
(10) Можно еще через форматированный документ.
15 Prog_man
 
гуру
18.03.25
15:24
(14) да после юристов, вносить корректировки приходится, но делать это удобнее в ворде, а  не в табличном документе (в ТД еще страницы подгонять сложнее)
16 sikuda
 
19.03.25
08:42
(7) Убийство процесса нарушает правило 4 ничего не взламывать?
метод Скрипт()
  пер Процесс = новый ПроцессОс("TASKKILL", ["/IM","WINWORD.EXE"], СоединитьПотокиОшибокИВывода = Ложь)
  Процесс.Запустить()
  исп ПотокВывода = Процесс.ПолучитьПотокВывода()
  знч Длительность = 5с
  если Процесс.ОжидатьЗавершения(Длительность) 
          Консоль.Записать(ПотокВывода.ПрочитатьКакСтроку("cp866"))
  ;
;
17 mikecool
 
19.03.25
09:04
(15) есть две стороны - удобно и хорошо, ты выбрал удобно...
18 Prog_man
 
гуру
19.03.25
09:16
(17) удобно это и есть хорошо, за час все договора переделал на PDF, сколько времени потребовалось бы переделать на другой макет? наверно пару дней. Юристам удобнее работать в ворде. не представляю как они бы в дальнейшем дорабатывали ТД. клиент получил то что хотел, а клиенту разницы нет как там внутри сделано. так что норм.
19 arsik
 
гуру
19.03.25
09:19
(17) Есть и хорошо и удобно - Форматированный документ :)
20 novichok79
 
19.03.25
15:36
(16) ахахха, лол что?
не является ли нарушением какого-то непонятного 4го пункта желание завершить программу на своем компьютере стандартными средствами ОС?
в чьем-то манямирке вполне вероятно, что является.
21 Garykom
 
гуру
19.03.25
16:08
(16) А как ты узнаешь какой именно процесс WINWORD надо убить?
Ладно по пользователю можно отобрать
Но открытый через COM/OLE "Word.Application" - нереально сопоставить с процессом ОС

Я пробовал, там только можно попытаться по времени запуска, что ненадежно
Или через хак со сменой заголовка окна (должно быть видимо причем) и поиска процесса по этому заголовку
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн