|
программно закрыть ворд X Leshiy, lucky-nn, Garykom, Vbirf, Мультук, kir-g, arsik, trdm, Caesar, AlexKimp, , , novichok79, , Sabron, serpentt, , Bigbro, sikuda, , , Прохожий, BOOL, СвинТуз, Prog_man, Wern, Климов Сергей, Maxsim24, lxndr, Кукуев, nick86, Дмитрий, Hawk_1c, Страждущий, 1Снеговик, Хряк, FormatC, Amfiaray, Tefal, mikecool, Elf_80_lvl, Расим, vicof, Масянька, BlottoYolo, Жеглофф, maxab72, Шурик71, ColonelAp4u, ldo6, runuts, RVN, abfm, KJlag, Kongo2019, dmt, Kobol, kupec, Vstur, НоваяВолна, frmdtf1, вым, Ivanich
| ☑ | ||
---|---|---|---|---|
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" - нереально сопоставить с процессом ОС Я пробовал, там только можно попытаться по времени запуска, что ненадежно Или через хак со сменой заголовка окна (должно быть видимо причем) и поиска процесса по этому заголовку |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |