|
|
|
Заполнить Word-документ на сервере и сохранить там же как pdf | ☑ | ||
|---|---|---|---|---|
|
0
topa310
09.10.24
✎
11:36
|
Доброго времени суток, форумчане!
Вот уже три тысячи лет бьюсь над тем, чтобы заставить 1С автоматически выполнять действия, описанные в названии темы. К сожалению, все мои изыскания ни к чему не привели. Однажды этот форум уже помог мне с совершенно нерешаемой задачей, потому суровая действительность привела меня снова к Вам. Суть того, что происходит: По информации, содержащейся в документе в 1С, нужно заполнить шаблон ворда, сохранить его в пдф и отправить по почте. Что я только не делал, ничего не помогает. Решение-заглушка было найдено: &НаКлиенте все работает, заполняется, сохраняет и отправляет без нареканий. Но тот же самый код не работает на сервере (не открывает ворд, хотя соответствующий ком-объект создает), и, что более странно для меня, даже через планировщик заданий Windows, который я заставляю открывать обработку с кодом &НаКлиенте, тоже стопорится на моменте активизации Ворда. Прилагаю рабочий код, который решает проблему, если вручную запускать его через обработку: &НаКлиенте
Процедура ТестПрием(Команда)
Получить_РезультатыОпроса(); //Получаем информацию из документов в 1С
ЗаполнитьТЗНаОтправкуСертификатов(); //Заполняем ТЗ на форме, если делать &НаСервере, просто заполняем ТЗ
Для Каждого СтрТаб Из ТЗНаОтправкуСертификатов Цикл
ПослатьСерт = ЛОЖЬ;
ДокументОпроса=Найти_документ_опрос_по_GUID_ДляСертификатов(СтрТаб.GUID);
Если Число(СтрТаб.Комментарий)>14 Тогда
Попытка
Идентификатор = ПолучитьДанныеМакета(); //Получаем макет, двоичные данные
МакетСертификата = ПолучитьИзВременногоХранилища(Идентификатор);
ИмяФайла = "shablonmaketTEST.doc";
ПолноеИмяФайла = "C:\AIS_RNG_PROG\Ethics_Surveys\"+ИмяФайла;
МакетСертификата.Записать(ПолноеИмяФайла);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
//Выше мы получили макет и сохранили его на диск сервера (если выполняем обработку, подключившись удаленно к серверной машине)
Попытка
Word = Новый COMОбъект("Word.Application");
Word.Visible = Ложь;
Word.Documents.Open(ПолноеИмяФайла);
Документ = Word.ActiveDocument;
Исключение
Сообщить("Ошибка при попытке создать объект Ворд!"+ОписаниеОшибки())
КонецПопытки;
ФИО = СокрЛП(СтрТаб.ФИО);
ГодФормирования = ""+Год(ТекущаяДата())+" г.";
ГодФормирования = СтрЗаменить(ГодФормирования,Символы.НПП,"");
Документ.Select();
Word.Selection.Find.Execute("{ФИО}");
Word.Selection.Text = СокрЛП(ФИО);
Документ.Select();
Word.Selection.Find.Execute("{ГФ}");
Word.Selection.Text = ГодФормирования;
Документ.SaveAs("C:\AIS_RNG_PROG\Ethics_Surveys\Sertificates\Sertificate"+"_"+СокрЛП(ФИО)+"_"+СтрТаб.GUID+".pdf",17);
Документ.Close(0);
Word.Quit(0);
Если СокрЛП(ФИО) <> "" Тогда
Сообщить("Отправлен сертификат. Сотрудник: "+СтрТаб.Сотрудник);
ОтметитьФормированиеСертификата(ДокументОпроса);
ПослатьСерт = ИСТИНА;
Иначе
Продолжить
КонецЕсли;
КонецЕсли;
Если ПослатьСерт Тогда
ПослатьСертификат(СтрТаб.Почта,"C:\AIS_RNG_PROG\Ethics_Surveys\Sertificates\Sertificate"+"_"+СокрЛП(ФИО)+"_"+СтрТаб.GUID+".pdf");
Иначе
ПроцедурыПриНеудачномТесте(ДокументОпроса, СтрТаб.Почта, СтрТаб.Сотрудник);
КонецЕсли;
КонецЦикла;
//Завершаем работу системы
//ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры
Этот код прекрасно работает, если его запускаю я сам, находясь на серверной машине. Запуск требуется приблизительно раз в неделю и это не очень утомительно, но сам факт... Хотелось бы автоматизировать. Макеты пробовал разные: двоичные данные и activedocument, но сути проблемы это не поменяло, при выполнении &НаСервере он отказывается открывать Word-документ (а точнее валится на строке Документ = Word.ActiveDocument; , так как, по мнению программы, строчкой выше не удалось открыть ни один Word-документ. Как я уже писал в другой своей теме -- не стесняйтесь предложить свое решение или уточнение, даже если я его уже описал или пробовал делать. Найти решение нужно только для формирования заполненного по шаблону ворда и сохранения его в пдф файл на сервере, так как в ходе моих изысканий я сделал регламент, который, при наличии уже сформированных пдф-документов, спокойно отправляет их по почте куда нужно. |
|||
|
1
osa1C
09.10.24
✎
11:56
|
(0) Что за хотелка делать это все на сервере? Создай технического клиента и от его имени делай что тебе надо регламентным заданием. И будет тебе счастье. Если надо обязательно копии файлов сохранять на сервере, открой доступ к расшаренной папке на сервере и сохраняй туда.
|
|||
|
2
topa310
09.10.24
✎
12:21
|
(1)
Да это не хотелка, это просто я не знаю, как реализовать по другому. Технический клиент -- это что? Пользователь, под которым это будет выполняться? |
|||
|
3
osa1C
09.10.24
✎
12:48
|
(2) Просто пользователь в базе, под которым никто физически не работает, да и не знает про него. Под этим пользователем делаешь запуск программы в регламентном задании выполняешь свой код, который у тебя и так работает. Регламентное задание настраиваешь запускаться раз в неделю, судя по твоему тексту, тебе этого достаточно.
|
|||
|
4
osa1C
09.10.24
✎
12:49
|
||||
|
5
topa310
09.10.24
✎
13:09
|
У меня код &НаКлиенте и 1С ругается, говорит, что нельзя настроить расписание
|
|||
|
6
topa310
09.10.24
✎
13:09
|
(4) Сейчас глянем
|
|||
|
7
osa1C
09.10.24
✎
13:14
|
(5) Обязательное требование заключается в том, что код должен размещаться в т.н. общем модуле. При этом вызываемая процедура должна иметь атрибут экспорт.
|
|||
|
8
osa1C
09.10.24
✎
13:15
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |