Всем привет!
У нас было Имеем Windows Server Standart 2007 64x SP2, установленный на нем сервер 1С Предприятия 8.3 и установленный MS Office 2010.
Печатаем УТВЕРЖДЕННЫЕ шаблоны (много шаблонов) WORD из ЗУП 3.1 . Все по классике, внешняя печатная форма + макет, содержащий в себе ActiveDocument. Получаем, заполняем на сервере и передаем на клиент в виде двоичных данных, все работает стабильно и все довольны, но в один прекрасный момент мы получаем сообщение: разрыв соединения с сервером 1С. И все. Зайти в программу больше не получится, пока не перезапустите службу Агент сервера 1С 8.3.
Честно говоря, с первого подобного сообщения отследить, чем был вызван разрыв, не удалось.
Но случаи участились.
Дальше опытным путем выяснилось, что при сохранении заполненного шаблона на сервере в файл вызывается экземпляр объекта COM (x32), он успешно записывает файл и уходит в забвение, причем не каждый раз, после чего сервер "отключается от клиентов".
В чем же проблема? Объяснение здесь. "Камень номер один " цитата :
Причина в том, что код
MSWord = Макет.Получить();
Всегда вызывает экземпляр объекта COM (x32) независимо от того какой разрядности Office установлен.
Автор предлагает заранее создавать пустой файл COM (x64), потом его открывать и в него копировать заполненный, но не сохраненный шаблон из объекта COM (x32) . В общем, данный метод у меня не взлетел, так как документ всегда возвращался пустым, т.е. даже не шаблон. Проблема, думаю, во взаимодействии объектов 32х/64х.
Еще была замечена особенность: ошибка совместного доступа к файлу, причем появилась она внезапно и никак не уходила, но парализовала печать по шаблонам всегда и сразу.
После сохранения файла (SaveAS) при попытке завершить экземпляр COM (x32) для перевода в двоичные данные сервер также падал.
После всех каруселей было найдено решение:
&НаСервере
Договор = ПолучитьМакет("Макет");
ВременныйФайл = ПолучитьИмяВременногоФайла(".doc");
//Было:
ОбъектWord = Договор.Получить(); // Здесь вся беда.
ДокументWord = ОбъектWord.Application.Documents(1);
ДокументWord.Activate();
//Заполняем
ДокументWord.SaveAs(ВременныйФайл,0);
ДокументWord.Close(); // Вылетает сервер.
ОбъектWord.Quit(0); // Вылетает сервер.
//*******************************************************
//Стало:
Договор.Записать(ВременныйФайл); //Это решает проблему полностью. 32х разрядное приложение не вызывается.
Word = Новый COMОбъект("Word.Application");
Word.Displayalerts = 0;
ДокументWord = Word.Application.Documents.Open(ВременныйФайл); // Можно попробовать через ПолучитьCOMОбъект().
//Заполняем
ДокументWord.SaveAs(ВременныйФайл,0);
ДокументWord.Close();
Word.Quit(0);
ФайлДД= Новый ДвоичныеДанные(ВременныйФайл);
АдресМакета = ПоместитьВоВременноеХранилище(ФайлДД);
УдалитьФайлы(ВременныйФайл);
Возврат АдресМакета;
Спасибо всем за внимание. Нагуглить симптомы не удалось. Поэтому надеюсь, что кому-нибудь данная статья сэкономит время.