Имя: Пароль:
IT
 
Печать из 1С в шаблоны Word
0 poligraf
 
22.03.10
16:50
Думал всегда, что неплохо Ворд знаю, но тут заковыка
Есть вот такая обработка - http://infostart.ru/public/59493/
Не могу и все поле в документе добавить!
Делаю, как написано в инструкции - ничего не добавляет.
При том, любые поля документа, DocProperty которые, добавляет.
Может сначала требуется где-нибудь описать поля?
1 hd1
 
23.03.10
09:24
не смотрел обработку, печатаю с закладки word.
2 vde69
 
23.03.10
09:29
себе писал универсальную обработку


// Обработка выводит в копию файла шаблона ТЗ
// Файл шаблона должен иметь название СокрЛП(ИмяШаблона) + ".doc"
// и лежать в каталоге  КаталогИБ() + "ExtForms\PrnForms\"
//
// Параметры запуска должен быть списком значения:
// "Идентификатор"                    - Обязательный
// "КаталогДляСохранения"              - Обязательный
// "ИмяФайла"                          - Не обязательный (если пусто, то используеться имя шаблона)
// "СписокПеременных"               - Не обязательный (Список значений, связь по представлению, см ниже)
//  
//*****************************************************************************************************
//  
//              Настройка шаблона WORD
//                                                  
// В шаблоне должны использоваться поля типа {DOCVARIABLE ИмяПеременной }
// переменные Document.Variables могут не существовать, обработка сама добавляет необходимые
//

Перем СписокПараметров;  
Перем ИмяШаблона, КаталогДляСохранения, ИмяФайла, ТЗ;
 

//*******************************************
// функция возвращает строку индикатор длиной 100 символов
Функция Обмен_Индикатор(значение, максимум=100)
   Если максимум > 0 Тогда
       Длина=50;            
       
       Если значение<=0 тогда
           стр="";
           Для е = 1 по Длина Цикл
               стр=стр+".";
           КонецЦикла;    
   
           Возврат "[" + стр + "]";
       КонецЕсли;
       
       е1="";            
       Для е = 1 По Длина Цикл
           Если е<=((значение*Длина)/максимум) Тогда
               е1=е1+"|";
           Иначе
               е1=е1+".";
           КонецЕсли;        
       КонецЦикла;
       Возврат "[" + е1 + "]";
   Иначе
       Возврат "";
   КонецЕсли;
КонецФункции    


// функция устанавливает связь с WORD
// в качестве параметра требуется имя открываемого файла
// в случае удачи возвращает соответствие из обьектов ОЛЕ, в случае не удачи - 0
Функция   WORD_УстановитьСвязь (ПолноеИмяФайла)Экспорт
   
   Результат = 0;
   Состояние("Идет установка связи, ждите.....");
   
   Попытка
       Результат = СоздатьОбъект("СписокЗначений");
       Результат.УдалитьВсе();
                           
       BaseOLE = СоздатьОбъект("Word.Application");
       BaseOLE.ScreenUpdating = 0;  
       BaseOLE.Visible = 0;

       Результат.Установить("WORD", BaseOLE);
                         
       WORDФайл = BaseOLE.Documents.Add(ПолноеИмяФайла);
       Результат.Установить("WORDФайл", WORDФайл);
                               
       МассивПеременныхДокумента =  СоздатьОбъект("СписокЗначений");
       МассивПеременныхДокумента.УдалитьВсе();  
                                       
       КоличествоПеременных = WORDФайл.Fields.Count;  
       Для е = 1 по КоличествоПеременных Цикл         //Result  Code
           ИмяПеременной = "";
           ЗнПоля = СокрЛП(WORDФайл.Fields(е).Code.text);
           Если ВРег(Лев(ЗнПоля,11)) = "DOCVARIABLE" Тогда
               ЗнПоля = СокрЛП(Сред(ЗнПоля, 12));
               ИмяПеременной = СокрЛП(Лев(ЗнПоля, Найти(ЗнПоля, " ")));
           КонецЕсли;
           
           Если ИмяПеременной <> "" Тогда
               МассивПеременныхДокумента.ДобавитьЗначение(ИмяПеременной);
           КонецЕсли;
       КонецЦикла;
       
       Результат.Установить("Переменные", МассивПеременныхДокумента);

   Исключение
       Результат = 0;
       Сообщить("Ошибка создания обьекта Microsoft Word" + ОписаниеОшибки());
   КонецПопытки;
   
   Возврат Результат;
КонецФункции

// функция разрывает связь с WORD
// в качестве параметра требуеться структура созданая при установке соединения
Процедура WORD_РазорватьСвязь (СписокОбьектов) Экспорт
   Попытка    
       СписокОбьектов.Получить("WORDФайл").Close();        
       СписокОбьектов.Получить("WORD").Quit();
       СписокОбьектов.Установить("WORD", 0);
       СписокОбьектов.УдалитьВсе();
   Исключение
       Сообщить(ОписаниеОшибки());
   КонецПопытки;                  
КонецПроцедуры

Процедура ЗакрытьОбработку (ТекстСообщения = "", СписокЗагрузки = 0)

   Если ТипЗначенияСтр(СписокЗагрузки) = "СписокЗначений" Тогда
       WORD_РазорватьСвязь (СписокЗагрузки);
   КонецЕсли;

   Если СокрЛП(ТекстСообщения) <> "" Тогда
       Сообщить(ТекстСообщения);
   КонецЕсли;                                                    

   СтатусВозврата(0);      
   Форма.Закрыть(0);
   
КонецПроцедуры


Процедура Сохранить()
   
   Если    (СокрЛП(КаталогДляСохранения) = "")
       или (ФС.СуществуетФайл(СокрЛП(КаталогДляСохранения)) = 0) Тогда
       ЗакрытьОбработку ("Не верный каталог для сохранения");
       Возврат;
   КонецЕсли;
             
   // подработка имени каталога
   Если Прав(СокрЛП(КаталогДляСохранения),1) <> "\" Тогда
       КаталогДляСохранения = СокрЛП(КаталогДляСохранения) + "\";
   КонецЕсли;
   
   // подработка имени файла
   Если Найти(СокрЛП(ИмяФайла),".") > 0 Тогда
       ИмяФайла = Лев(СокрЛП(ИмяФайла), Найти(СокрЛП(ИмяФайла),".") - 1);
   КонецЕсли;        
   
   // будем подключаться
   СписокЗагрузки = WORD_УстановитьСвязь (КаталогИБ() + "ExtForms\PrnForms\"+ СокрЛП(ИмяШаблона) + ".doc");
           
   Если СписокЗагрузки = 0 тогда  
       ЗакрытьОбработку ("Ошибка подключения к шаблону");
       Возврат;
   КонецЕсли;      
   
   Попытка                                            
       СписокЗагрузки.Получить("WORD").DisplayAlerts = 0;
       СписокЗагрузки.Получить("WORDФайл").SaveAs(СокрЛП(КаталогДляСохранения) + СокрЛП(ИмяФайла) + ".doc");
       СписокЗагрузки.Получить("WORD").DisplayAlerts = -1;
   Исключение
       ЗакрытьОбработку ("Неудачное копирование шаблона, " + ОписаниеОшибки(), СписокЗагрузки);
       Возврат;
   КонецПопытки;                  

   СписокПеременныхДокумента = СписокЗагрузки.Получить("Переменные");
   
   Для е = 1 по СписокПеременныхДокумента.РазмерСписка() Цикл  
       
       Состояние("Заполнение шапки " + Обмен_Индикатор(е, СписокПеременныхДокумента.РазмерСписка()));
       
       ИмяПеременной = СокрЛП(СписокПеременныхДокумента.ПолучитьЗначение(е));
       ЗначениеПеременной = СписокПараметров.Получить(ИмяПеременной);
       Если СокрЛП(ЗначениеПеременной) = "" Тогда
           ЗначениеПеременной = " ";  // пустое значение в переменную ворда не записывается, будем писать пробел
       КонецЕсли;

       ЕстьПерем = 0;
       КоличествоПеременных = СписокЗагрузки.Получить("WORDФайл").Variables.Count;
       Для е1 = 1 по КоличествоПеременных Цикл
           Если СокрЛП(СписокЗагрузки.Получить("WORDФайл").Variables(е1).Name) = ИмяПеременной Тогда
               ЕстьПерем = 1;
               Прервать;
           КонецЕсли;    
       КонецЦикла;            
           
       Если ЕстьПерем = 0 Тогда
           СписокЗагрузки.Получить("WORDФайл").Variables.Add(ИмяПеременной, ЗначениеПеременной);
       Иначе
           СписокЗагрузки.Получить("WORDФайл").Variables(ИмяПеременной).Value = ЗначениеПеременной;
       КонецЕсли;
   КонецЦикла;
   
   // все теперь запишем
   Попытка
       СписокЗагрузки.Получить("WORD").DisplayAlerts = 0;
       СписокЗагрузки.Получить("WORDФайл").Fields.Update();
       СписокЗагрузки.Получить("WORDФайл").SaveAs(СокрЛП(КаталогДляСохранения) + СокрЛП(ИмяФайла) + ".doc");  
       СписокЗагрузки.Получить("WORD").DisplayAlerts = -1;
   Исключение
       ЗакрытьОбработку ("Неудачное сохранение шаблона", СписокЗагрузки);
       Возврат;
   КонецПопытки;                  
   
   // усе, можно выходить
   ЗакрытьОбработку ("Файл удачно сохранен", СписокЗагрузки);

КонецПроцедуры


Процедура ПриОткрытии()

   ТекСписокПараметров = Форма.Параметр;
           
   Если ТипЗначенияСтр(ТекСписокПараметров) = "СписокЗначений" Тогда
       // загрузим параметры
       Попытка

           ИмяШаблона                = СокрЛП(ТекСписокПараметров.Получить("Идентификатор"));
           КаталогДляСохранения    = СокрЛП(ТекСписокПараметров.Получить("КаталогДляСохранения"));
           ИмяФайла                = СокрЛП(ТекСписокПараметров.Получить("ИмяФайла"));
           СписокПараметров        = ТекСписокПараметров.Получить("СписокПеременных");

           Если СокрЛП(ИмяФайла) = "" Тогда
               ИмяФайла = ИмяШаблона;
           КонецЕсли;
           
           Если ТипЗначенияСтр(СписокПараметров) <> "СписокЗначений" Тогда
               СписокПараметров = СоздатьОбъект("СписокЗначений");
               СписокПараметров.УдалитьВсе();
           КонецЕсли;

       Исключение
           ЗакрытьОбработку ("Ошибка параметров");
           Возврат;
       КонецПопытки;                              
       
       // авто выполнение
       Сохранить();
       Форма.Закрыть(0);
   КонецЕсли;
   
КонецПроцедуры
                             



ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.Очистить();

СписокПараметров = СоздатьОбъект("СписокЗначений");
СписокПараметров.УдалитьВсе();

Описание = "Обработка выводит в копию файла шаблона список переменных
|Файл шаблона должен иметь название СокрЛП(ИмяШаблона) + "".doc""
|и лежать в каталоге  КаталогИБ() + ""ExtForms\PrnForms\""
|
|Параметры запуска должен быть списком значения:
|""Идентификатор"" - Обязательный
|""КаталогДляСохранения"" - Обязательный
|""ИмяФайла"" - Не обязательный (если пусто, то используеться имя шаблона)
|""СписокПеременных"" - Не обязательный (Список значений, связь по представлению, см ниже)
|"
3 poligraf
 
23.03.10
09:54
(2) та обработка, как я понимаю то же самое делает.

У тебя, судя по "КоличествоПеременных = WORDФайл.Fields.Count", тоже работает с полями в документе.
Я не могу в Ворде поля создать:)
Через вставить - поле - DocVariable
Имя поля пишу - ничего не добавляется
Закон Брукера: Даже маленькая практика стоит большой теории.