Имя: Пароль:
1C
1С v8
Заполнить 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