Имя: Пароль:
1C
Админ
1c +Word
0 Виль
 
04.06.13
19:52
Что лучше - загружать шаблон как актив-документ или считывать как файл с диска? Работают несколько операторов. Обращаются регулярно к актив-документу - то печать глючит, то база зависает, процесс word в памяти подвисает и не выгружается.
1 Uzumaki
 
04.06.13
20:49
Я открывал как файл через ole сервер, там были расставлены метки которые заполнялись из 1ски. Проблема в том, для корректной работы ворд в сеансе винды должен был быть закрытым, с этим глюком я не разобрался. Т.к. работал только один пользователь в этой базе, разделенный доступ реализовал копированием шаблона, но на практике не проверял.
2 Икогнито
 
04.06.13
20:50
(0) в конфигурации 1С:Риэлтор есть просто гениальный вариант заполнения шаблонов Word на основе СКД.
И строки и табличные части поддерживает.
3 Икогнито
 
04.06.13
20:51
+(2) шаблон можно править интерактивно, он сам потом загружается в БД
4 Икогнито
 
04.06.13
20:51
+(3) и никаких глюков!
5 Torquader
 
04.06.13
21:59
(1) Последние версии Word могут работать сразу в нескольких процессах, и создание документа по OLE не пересекается с открытыми документами.
P.S. но, проще всего написать шаблон, в который передавать данные из файла, а код заполнения шаблона выполнять при открытии - получается гарантия, что ничего не зависнет, так как при активном использовании буфера OLE происходит фрагментация памяти и, как следствие, отказ в очередном вызове (особенно, если через буфер таскать большие объёмы данных).
6 Uzumaki
 
04.06.13
22:48
(5) То есть вордовский файл (шаблон) в котором скрипт чтения файла с данными сформированного 1ской перед открытием этого шаблона?
7 Виль
 
04.06.13
23:27
При печати выходят пустые листы - ткните что не так

     Word = Новый COMОбъект("Word.Application");
     Word.Visible =1;
     КаталогВремФайлов="c:\1\Шаблон1Б.dot";
     //открываем сброшенный файл
     Word.Documents.Open(КаталогВремФайлов);
     Документ = Word.ActiveDocument();
   Попытка
       
       Word.Selection.WholeStory();
       Word.Selection.Copy();
       //                
       Замена = Документ.Content.Find;
       Замена.Execute("<Прочее>",         Ложь, Истина, Ложь, , , Истина, , Ложь,СтрокаПр,2);
       Замена = Документ.Content.Find;
       Замена.Execute("<777>",         Ложь, Истина, Ложь, , , Истина, , Ложь,СтрокаПр1,2);
       Документ.PrintOut(0, 0, 0, "", "", "", 0, 1,,,,,,,2,1);
       //Ожидание окончания отправки на печать...
       
       Пока Word.Application.BackgroundPrintingStatus<>0 Цикл
           ///Предупреждение("Ожидание",1);
           Сообщить("Ожидание")
       КонецЦикла;
       
   //Word.Application.Quit();    
   Исключение
       
       // Если произойдет ошибка выводятся данные об ошибке и объект закрывается.
       Сообщить(ОписаниеОшибки());
       Word.Application.Quit();
       
   КонецПопытки;
   Документ.Close(0);
   Word.Application.Quit();
   Word=0;
8 Uzumaki
 
05.06.13
00:01
А что выводится на печать? Выделенный фрагмент который был изменен?
Я создавал новый лист в него вставлял скопированный текст из шаблона и все там менял, в итоге у пользователя оставался открытый новый файл (потому как обязательно они правились из-за специфики договоров)

Функция глОфДокОткрыть(Word, ИмяФайла) Экспорт
   Word = CreateObject("Word.Application");
   Word.Visible = 1;
   Возврат Word.Documents.Open (КаталогИБ() + "mxls\" + ИмяФайла);
КонецФункции

Процедура глОфДокВставитьТекст(Word, спТекст) Экспорт
   Для Н = 1 По спТекст.РазмерСписка() Цикл
       Текст = "";
       Word.Selection.GoTo(-1,,, спТекст.ПолучитьЗначение(Н, Текст));
       Word.Selection.TypeText(Текст);
   КонецЦикла;
КонецПроцедуры

Процедура генерации файла:
   спТекст = СоздатьОбъект("СписокЗначений");
   спТекст.ДобавитьЗначение("SomeLabel", "Hello, Word!");    
   
   Word = 0;
   Window = глОфДокОткрыть(Word, "wrdtmplts\" + ИмяФайла);
   
   Word.Selection.WholeStory ();
   Word.Selection.Copy();
   Word.Documents.Add();
   Word.Selection.PasteAndFormat(0);
   Window.Close(0);    
   
   глОфДокВставитьТекст(Word, спТекст);
9 Виль
 
05.06.13
00:06
Что-то с методом PrintOut() если параметры убираю - листы выходят заполненными
10 Uzumaki
 
05.06.13
00:10
11 Виль
 
05.06.13
00:13