1с макет word колонтитулы

Демонстрация процесса формирования внешней печатной формы документа из макета Word средствами БСП, колонтитулы, коллекции, и обычные параметры

Функция СведенияОВнешнейОбработке() Экспорт
	
	// Стандартное описание сведений о внешней печатной форме

	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
	
	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
	
	ПараметрыРегистрации.БезопасныйРежим = Ложь;
	ПараметрыРегистрации.Вставить("Версия", "1.0");
	ПараметрыРегистрации.Наименование = "Название печатной формы";
	
	ПараметрыРегистрации.Назначение.Добавить("Справочник.ФизическиеЛица");
	
	НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
	НоваяКоманда.Представление = "Название команды";   //Синоним
	НоваяКоманда.Идентификатор = "НазваниеКоманды";   //ПолноеИмя
	НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
		
	Возврат ПараметрыРегистрации;
	
КонецФункции

Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
	
	// Просто передаем управление дальше если удовлетворяет условию

	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "НазваниеКоманды") Тогда
		ПечатьДокумента(КоллекцияПечатныхФорм, МассивОбъектов, ОбъектыПечати);
	КонецЕсли;
	
КонецПроцедуры

Процедура ПечатьДокумента(КоллекцияПечатныхФорм, МассивОбъектов, ОбъектыПечати) Экспорт
	
	 // Сначала получим данные а потом передадим их для заполнения макета
		
	МассивДанныхЗаполнения = ПолучитьДанныеДляПечатиДокумента(МассивОбъектов);	
		
	ВывестиДанныеДокументаВТабличныйДокумент(КоллекцияПечатныхФорм, МассивДанныхЗаполнения, ОбъектыПечати);
		
КонецПроцедуры 

Функция ПолучитьДанныеДляПечатиДокумента(МассивОбъектов)

	// здесь происходит заполнение данными для ПФ

	Данные = Новый Структура;
	Данные.Вставить("Организация", "ООО ""Рога и копыта""");
	Данные.Вставить("Контрагент", "ИП Иванов");
	Данные.Вставить("СуммаОплаты", 10523);    
	Данные.Вставить("Дата", '202110102158');  
	
	ТаблицаДанных = Новый ТаблицаЗначений;
	ТаблицаДанных.Колонки.Добавить("Номенклатура");
	ТаблицаДанных.Колонки.Добавить("Количество");
	ТаблицаДанных.Колонки.Добавить("Сумма");

	Строка = ТаблицаДанных.Добавить();
	Строка.Номенклатура = "тест";
	Строка.Количество = 2;
	Строка.Сумма = 50;
	
	Строка = ТаблицаДанных.Добавить();
	Строка.Номенклатура = "тест1";
	Строка.Количество = 3;
	Строка.Сумма = 55;
	
	Строка = ТаблицаДанных.Добавить();
	Строка.Номенклатура = "тест2";
	Строка.Количество = 4;
	Строка.Сумма = 51; 
	
	ТаблицаДанныхВМассиве = ОбщегоНазначения.ТаблицаЗначенийВМассив(ТаблицаДанных);
	
	Данные.Вставить("ТаблицаДанных", ТаблицаДанныхВМассиве);
	
	Возврат Данные;
	
КонецФункции 

Процедура ВывестиДанныеДокументаВТабличныйДокумент(КоллекцияПечатныхФорм, МассивДанныхЗаполнения, ОбъектыПечати)

	ДвоичныеДанныеМакета = ПолучитьМакет("ПФ_DOC_НазваниеМакета");
	
	Если ДвоичныеДанныеМакета <> Неопределено Тогда
		
		// Инициализируем печатную форму	
		
		ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "НазваниеКоманды");
		
		// Наличие пустого табличного документа в коллекции обязательно
		
		ПечатнаяФорма.ТабличныйДокумент = Новый ТабличныйДокумент;
		
		Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(ДвоичныеДанныеМакета,Неопределено);
		ПечатнаяФормаДокумента = УправлениеПечатью.ИнициализироватьПечатнуюФорму(Неопределено, Макет.НастройкиСтраницыМакета, Макет);		
		
		// Определим какие области в документе Word хотим заполнить 
		// Для этого у нас документ должен быть размечен конструкциями 
		// {v8 Область.НазваниеОбласти} 
		// {/v8 Область.НазваниеОбласти}
		// наличие областей обязательно
		
		// Область для заполнения обычных параметров в тексте
		
		ОбластьЗаголовок = Новый Структура;
		ОбластьЗаголовок.Вставить("ИмяОбласти", "Заголовок");
		ОбластьЗаголовок.Вставить("ТипОбласти", "Общая");
		
		// Пример определения областей коллекций (таблица и нумерованный или обычный списки)	
		ОбластьШапкаТаблицы = Новый Структура;
		ОбластьШапкаТаблицы.Вставить("ИмяОбласти", "ШапкаТаблицы");
		ОбластьШапкаТаблицы.Вставить("ТипОбласти", "Общая");
		
		ОбластьСтрокаТаблицы = Новый Структура;
		ОбластьСтрокаТаблицы.Вставить("ИмяОбласти", "СтрокаТаблицы");
		ОбластьСтрокаТаблицы.Вставить("ТипОбласти", "СтрокаТаблицы");
		
		// Область должна быть определена первым элементом списка 
		// {v8 Область.НумерованныйСписок}
		// 1.{v8 Номенклатура}
		// {/v8 Область.НумерованныйСписок}
		
		ОбластьНумерованныйСписка = Новый Структура;
		ОбластьНумерованныйСписка.Вставить("ИмяОбласти", "НумерованныйСписок");  
		ОбластьНумерованныйСписка.Вставить("ТипОбласти", "Список");
		
		// Область должна быть определена первым элементом списка 
		// {v8 Область.МаркированныйСписок}
		// • {v8 Номенклатура}
		// {/v8 Область.МаркированныйСписок}
		
		ОбластьМаркированногоСписка = Новый Структура;
		ОбластьМаркированногоСписка.Вставить("ИмяОбласти", "МаркированныйСписок");
		ОбластьМаркированногоСписка.Вставить("ТипОбласти", "Список"); 
		
		// Пример определения областей колонтитулов, эти области в документе есть по умолчанию, 
		// если колонтитулы определены в самом документе
		
		ОбластьВерхнийКолонтитул = Новый Структура;
		ОбластьВерхнийКолонтитул.Вставить("ИмяОбласти", "ВерхнийКолонтитул");
		ОбластьВерхнийКолонтитул.Вставить("ТипОбласти", "ВерхнийКолонтитул");
		
		ОбластьНижнийКолонтитул = Новый Структура;
		ОбластьНижнийКолонтитул.Вставить("ИмяОбласти", "НижнийКолонтитул");
		ОбластьНижнийКолонтитул.Вставить("ТипОбласти", "НижнийКолонтитул");
		
		// Передаем данные заполнения для заполнения печатной формы 
		// Имена параметров данных заполнения должны совпадать с размеченными параметрами в документе в виде  
		// {v8 НазваниеПараметра}
		
		Область = УправлениеПечатью.ОбластьМакета(Макет, ОбластьЗаголовок);
		УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФормаДокумента, Область, МассивДанныхЗаполнения, Ложь); 
		
		
		Область = УправлениеПечатью.ОбластьМакета(Макет, ОбластьВерхнийКолонтитул);  
		УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФормаДокумента, Область, МассивДанныхЗаполнения);
		
		Область = УправлениеПечатью.ОбластьМакета(Макет, ОбластьНижнийКолонтитул);
		УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФормаДокумента, Область, МассивДанныхЗаполнения); 
		
		Область = УправлениеПечатью.ОбластьМакета(Макет, ОбластьШапкаТаблицы);
		УправлениеПечатью.ПрисоединитьОбласть(ПечатнаяФормаДокумента, Область, Ложь);
		
		Область = УправлениеПечатью.ОбластьМакета(Макет, ОбластьСтрокаТаблицы);
		УправлениеПечатью.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФормаДокумента, Область, МассивДанныхЗаполнения.ТаблицаДанных); 
		
		Область = УправлениеПечатью.ОбластьМакета(Макет, ОбластьНумерованныйСписка);
		УправлениеПечатью.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФормаДокумента, Область, МассивДанныхЗаполнения.ТаблицаДанных);
		
		Область = УправлениеПечатью.ОбластьМакета(Макет, ОбластьМаркированногоСписка);
		УправлениеПечатью.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФормаДокумента, Область, МассивДанныхЗаполнения.ТаблицаДанных);
		
		// Поместим получившийся документ в коллекцию печатных форм, в раздел ОфисныеДокументы
		// так БСП поймет что нужно открывать Word при формировании печатной формы
		
		АдресХранилищаОфисныйДокумент = УправлениеПечатью.СформироватьДокумент(ПечатнаяФормаДокумента);
		УправлениеПечатью.ОчиститьСсылки(ПечатнаяФормаДокумента, Ложь);
		УправлениеПечатью.ОчиститьСсылки(Макет);
		
		ОфисныеДокументы = Новый Соответствие;
		
		ОфисныеДокументы.Вставить(АдресХранилищаОфисныйДокумент, НСтр("ru = 'Название документа'"));
		
		ПечатнаяФорма.СинонимМакета    = НСтр("ru = 'Название документа (документ Microsoft Word)'");
		ПечатнаяФорма.ОфисныеДокументы = ОфисныеДокументы;
		
	КонецЕсли;
	
КонецПроцедуры

Комментарии

   Arhitektor

1 — 18.02.04 — 14:06

Работаю следующим образом:

Перем Путь;

//создаем ссылку на объект Word и делаем его невидимым

Word = СоздатьОбъект(«Word.Application»);

Word.Visible = 0;

                                                   
//связываем ссылку с конкретным файлом

Если СокрЛП(ВидДоговора) = «Основной договор» Тогда

Путь = КаталогИБ()+»ExtFormsШаблоныДоговор.doc»;

ИначеЕсли СокрЛП(ВидДоговора) = «ТО» Тогда            

Путь = КаталогИБ()+»ExtFormsШаблоныДоговорТО.doc»;

ИначеЕсли СокрЛП(ВидДоговора) = «ПО» Тогда              

Путь = КаталогИБ()+»ExtFormsШаблоныДоговорПО.doc»;

КонецЕсли;

   
Word.Documents.Open(Путь,,-1);

   
//Создаем объект Fnd типа Find для поиска в документе

Fnd = Word.ActiveDocument.Range().Find;

Fnd.ClearFormatting();                              

Fnd.Forward = -1;

   
//заполняем колонтитул

Fnd.Execute(«<Фирма_Кр>»,,,,,,,,,СокрЛПФирма.ЮрЛицо.Наименование), 2); //не работает

   
//заполняем шапку документа

Fnd.Execute(«<НомерДок>»,,,,,,,,,НомерДок, 2);

Fnd.Execute(«<ДатаДок>»,,,,,,,,,НРЕГ(Формат(ДатаДок,»Д (0)ДДММММГГГГ»)), 2);

Fnd.Execute(«<Место>»,,,,,,,,,Место, 2);

Fnd.Execute(«<Фирма>»,,,,,,,,,СокрЛП(Фирма.ЮрЛицо.ПолнНаименование), 2);

   
//выводим документ для просмотра и активизируем его

Word.Visible = 1;

Word.Activate();

Но как заполнить колонтитул?

   Arhitektor

7 — 18.02.04 — 14:50

Тогда поступаем так:

FndCol = Word.ActiveDocument.Sections(1).Headers(1).Range().Find;

FndCol.Execute(«<Что_меняем>»,,,,,,,,,»На_что_меняем», 2);

Спасибо, Шершень

в (1) тоже твой текст…

   Шершень

8 — 18.02.04 — 15:16

(7) ЗдОрово!

Кста, более правильно делать так:

FndCol.Execute(«<Что_меняем>»,,,,,,-1,,,»На_что_меняем», 2);

а строчку

Fnd.Forward = -1;

писать не надо. Параметры метода перебивают то, что установлено через свойства объекта. 7-й параметр — направление поиска, вперед.

Решил прикрутить печатную форму, шаблон в word всё работает и заполняет единственное колонтитулы пропадают, вопрос, как лечить? Задействовал максимально штатный механизм БСП

вот поэтому последний раз такой макет делал через COM

то есть по старинке?(( неужели так криво БСП работает? жалко время потраченное на изучение(((

а параметр в колонтитул добавить можно? может его программно заполнить? но как к нему обратиться?

всё разобрался… но подводные камни новые вылазят

не знаю. последний год делаю силами БСП. Вообще без проблем.

аа нет, вру, что-то было с освобождением монопольного доступа к файлу, но легко решилось

есть ли литература или курсы где подробно про БСП рассказываеться с подробными примерами?, Сидя в УПП видимо я сильно от жизни отстал(((

поднимаю тему, еще с одним камнем столкнулся который не знаю как преодолеть, Слетает форматирования заголовка в документе Word Вот как выглядит шаблон: Вот что на выходе: Наверху и внизу заголовка поставил для контроля две жирные точки по середине, они не слетают.

Если используется БСП, то для вывода колонтитулов в процедуру ПолучитьОписаниеОбластейМакетаОфисногоДокумента()
необходимо добавить

enter code here
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "ВерхнийКолонтитул", "ВерхнийКолонтитул");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "НижнийКолонтитул", "НижнийЧетныйКолонтитул");

затем при выводе областей в ворд добавить

enter code here
Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["НижнийКолонтитул"]);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта, Ложь);

Тэги:

Комментарии доступны только авторизированным пользователям

В работе программиста 1С, данный функционал требуется крайне редко, хотя благодаря нему можно решать довольно сложные задачи с динамическими и не постоянными печатными формами. При реализации данной задачи, работа по созданию шаблонов Word и расстановке закладок в шаблоне Word возлагается на пользователей 1C.

В данном примере будет показано, как используя механизмы 1С и документа Word в качестве шаблона, можно создать печатную форму для вывода данных, пользователям программы 1С.

Создадим шаблон на основе документа Word для 1С. Сначала необходимо включить показ закладок для более удобной работы с документом:

Использование шаблонов Word в 1С

Использование шаблонов Word в 1С

Использование шаблонов Word  в 1С

Использование шаблонов Word в 1С

Далее необходимо в файл шаблона для 1С, добавить текст и пару закладок. Закладка добавляется через меню «Вставка» — «Закладка». Нужно выделить текст закладки, скопировать его, открыть меню «Вставка — Закладка», вставить скопированный текст закладки и нажать «Добавить»:

Установка закладки, шаблон Word для 1С

Установка закладки, шаблон Word для 1С

Когда файл шаблона Word готов, создаем новую внешнею обработку в 1С, добавляем форму и в модуле формы вставляем следующий код:

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	ЗаполнитьШаблонВорд();
	
КонецПроцедуры

&НаКлиенте
Функция ЗаполнитьШаблонВорд()

	//Попытка создать COM объект
	Попытка
		ОбъектВорд = Новый COMОбъект("Word.Application"); 
	Исключение
		Сообщить("Ошибка при запуске Microsoft Word: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
		Возврат Неопределено;
	КонецПопытки;
	
	//Путь к шаблону
	ОбъектВорд.Documents.Add("C:UsersКонстантинDesktopШаблон.docx");
	ШаблонВорд = ОбъектВорд.ActiveDocument;
	
	//Получаем все закладки из шаблона
	Для каждого ЗакладкаВорд Из ШаблонВорд.Bookmarks Цикл
		Сообщить(ЗакладкаВорд.Name);		
	КонецЦикла;
	
	//Заменяем закладку1 на текст
	ШаблонВорд.Bookmarks("Закладка1").Select();
	ШаблонВорд.Application.Selection.TypeText("Текст для закладки №1.");
	
	//Заменяем закладку2 на текст
	ШаблонВорд.Bookmarks("Закладка2").Select();
	ШаблонВорд.Application.Selection.TypeText("Текст для закладки №2.");
	
	//Заменяем закладку3 на текущую дату
	ШаблонВорд.Bookmarks("Закладка3").Select();
	ШаблонВорд.Application.Selection.TypeText(ТекущаяДата());
	
	ОбъектВорд.Application.Visible = Истина;
	ОбъектВорд.Activate();
	
	//Закрытие документа
	//ОбъектВорд.Application.Quit();
	
КонецФункции

В результат запуска внешней обработки 1С по формированию печатной формы на основе шаблона в виде файла Word, мы получим следующий результат:

Результат использования шаблонов Word в 1С

Результат использования шаблонов Word в 1С

Информацию по методам COM объекта Word, а так же дополнительные данные можно узнать из MSDN.

Скачать файл обработки 1С и шаблона Word.

Дополнение к заметке Использование шаблонов Word в 1С

Выражаю благодарность, всем тем, кто комментирует запись, благодаря вам, материал дополняется новыми данными и будет полезен более широкому кругу посетителей.

1. А как поменять размер шрифта во вставляемом тексте?
Достаточно изменить размер шрифта закладки, в шаблоне. А вот, если необходимо динамически менять размерность, тогда:

//Заменяем закладку3 на текущую дату
ШаблонВорд.Bookmarks("Закладка3").Select();

ШаблонВорд.Application.Selection.Font.Bold = 1;
ШаблонВорд.Application.Selection.Font.Size = 20;
	
ШаблонВорд.Application.Selection.TypeText(ТекущаяДата());

2. Картинки есть возможность выгружать в шаблон?
Да, конечно. Примеры для C# и VB описаны по ссылке: https://msdn.microsoft.com/ru-ru/library/ms178792.aspx, а для 1С код будет следующий:

// Вставка изображения
ШаблонВорд.Bookmarks("Закладка3").Select();
ШаблонВорд.Application.Selection.InlineShapes.AddPicture("C:UsersКонстантинDesktoplogo_1c.png");

3. При выполнении кода: ОбъектВорд.Documents.Add(«C:/Шаблон.docx») (туда я поместил Ваш документ) получаю ошибку : «Ошибка при вызове метода контекста (Add)» в чем может быть причина?
Может попробовать изменить путь на: «C:Шаблон.docx».

4. Подскажите пожалуйста еще почему при сохранении макета типа active document в файл word кодом:

ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
Макет    = ОбработкаОбъект.ПолучитьМакет("ШаблонПисьмаПросрочка"); 
ИмяФайла = КаталогВременныхФайлов() + ""файл.doc";
Макет.Записать(ИмяФайла);

Я получаю вместо нормального документа вот такой http://prntscr.com/eshgjk
Предполагаю, что метод Записать(< ИмяФайла>, < ТипФайлаТаблицы>) по умолчанию, записывает файл в формате MXL. Попробуйте вторым параметром установить значение: ТипФайлаТабличногоДокумента.DOCX, более подробно описано в «Синтакс-помощнике».

5. У меня в документе есть ссылки на файлы которые расположены на сетевом диске. Как в шаблоне сделать гиперссылку на эти файлы?
Интересный вопрос, если попробовать сделать запись макроса и посмотреть результат, то в Visual Basic добавление гиперссылки будет выглядеть следующим образом:

Sub Макрос1()
'
' Макрос1 Макрос
'
'
    Selection.MoveLeft Unit:=wdCharacter, Count:=15, Extend:=wdExtend
    ActiveDocument.Hyperlinks.Add Anchor:=Selection.Range, Address:= _
        "C:UsersКонстантинDesktopТест.txt", SubAddress:="", ScreenTip:="", _
        TextToDisplay:="ТестоваяСсылка"
End Sub

Описание метода добавления в MSDN: https://msdn.microsoft.com/en-us/vba/word-vba/articles/hyperlinks-add-method-word

Соответственно код для 1С следующий:

Функция ЗаполнитьШаблонВорд()

	//Попытка создать COM объект
	Попытка
		ОбъектВорд = Новый COMОбъект("Word.Application"); 
	Исключение
		Сообщить("Ошибка при запуске Microsoft Word: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
		Возврат Неопределено;
	КонецПопытки;
	
	//Путь к шаблону
	ОбъектВорд.Documents.Add("C:Usersk.blaginDesktopШаблон.docx");
	ШаблонВорд = ОбъектВорд.ActiveDocument;
	
	//Получаем все ссылки из шаблона
	Для каждого ЗакладкаВорд Из ШаблонВорд.Hyperlinks Цикл
		Сообщить(ЗакладкаВорд.Name);		
	КонецЦикла;
	
	//Меняем адрес уже существующей ссылки
	ШаблонВорд.Hyperlinks("Logs.zip").Address = "C:Usersk.blaginDesktopMemory.zip";
	
	//Заменяем закладку на ссылку
	ОбъектЗакладка = ШаблонВорд.Bookmarks("Закладка3");
	ШаблонВорд.Hyperlinks.Add(ОбъектЗакладка.Range, "C:Usersk.blaginDesktopШаблон.docx", "", "Шаблон.docx", "C:Usersk.blaginDesktopШаблон.docx");
	
	ОбъектВорд.Application.Visible = Истина;
	ОбъектВорд.Activate();
	
	//Закрытие документа
	//ОбъектВорд.Application.Quit();
	
КонецФункции

Данная статья — попытка собрать сведения по работе (на начальном уровне) с MS Word в одном месте. На infostart.ru и других сайтах полно похожего материала, и при наличии должной усидчивости это все можно найти. Хотелось собрать основные моменты в одном месте.

Публикация — своего рода памятка, содержащая примеры кода для:

1. заполнение шаблона Word данными из 1С;
2. заполнение колонтитулов Word данными из 1С;
3. заполнение таблицы в Word данными из 1С;

Начало работы

В большинстве случаев перед нами ставится следующая задача:
Нужно открыть документ Word, заполненный данными из 1С.

Для этого нам нужно подготовить шаблон документа Word. Не путайте это с Word Template, специальные файлы Word, которые содержат настройки документов для многократного использования. Нам нужен обычный вордовский документ с расширениеми *.docx или *.doc. А далее поместить этот документ в макет с двоичными данными.


Попытка
//Получаем макет из двоичных данных
Шаблон = ПолучитьМакет(ДополнительныеПараметры.ВидДоговора);
ИмяФайла = ПолучитьИмяВременногоФайла(".docx");
Шаблон.Записать(ИмяФайла);
//Создаем COM-объект для работы с Word
ОбъектВорд = Новый COMОбъект("Word.Application");
ОбъектВорд.Documents.add(ИмяФайла);
//В Word можно открывать в одном приложении несколько документов, поэтому ОбъектВорд.Application.Documents - это коллекция открытых документов.
//В нашем случае документ открыт всегда один
ДокументВорд = ОбъектВорд.Application.Documents(1);
ДокументВорд.Activate();
Исключение Сообщить("Ошибка при запуске приложения "+ОписаниеОшибки());
КонецПопытки;
//Разумеется, получение COM-объекта нужно поместить в попытку. Мало ли, что-то пойдет не так.

Читатель может справедливо заметить, что используется модальный вызов, и погрозить автору пальцем. И будет прав.


//Создадим структуру параметров документа
ПараметрыДокумента = ПодготовитьСтрукутруПараметров();
//Заполним структуру параметров документа
ЗаполнитьСтруктуруПараметров(ПараметрыДокумента);

Далее я обычно создаю структуру полей, которые будут заполняться в шаблоне. Такой подход позволяет унифицировать процедуру заполнения шаблона, а также упростить последующее его изменение.

Углубимся немножко в принципы работы Word…

Каждый документ Word разделен на разделы, которые состоят из страниц.

Для каждого раздела есть возможность создавать свою нумерацию элементов, уникальные колонтитулы и настройки параметров страницы. Так, например, чтобы повернуть одну из страниц (вывести на печать как альбомную), нужно создать под неё отдельный раздел.

Каждая страница Word разделена на несколько областей:

  • Верхний колонтитул
  • Основной текст
  • Нижний колонтитул

Нужно заметить, что в каждом разделе может быть уникальный колонтитул для первой страницы.


//Объект, содержит весь основный текст из всех разделов
ДокументВорд.Content
//Объект содержит коллекцию разделов документа
ДокументВорд.Sections
//В каждом разделе есть своя коллекция для верхних колонтитулов
ДокументВорд.Sections(1).Headers
//И своя коллекция для нижних колонтитулов
ДокументВорд.Sections(1).Footers
//При этом, если стоит галочка "Уникальный колонтитул для первой страницы", то коллекции Headers и Footers будут содержать два элемента

Заполнение пользовательских параметров

При обращении к этим коллекциям мы можем выполнять в них поиск и получать встроенные объекты, например, таблицы.

Теперь мы более-менее поняли, как обращаться к областям Word, можем в них пошуровать и выполнить замену наших параметров:


//Переберем все параметры и заменим их в документе
Для каждого Параметр Из ПараметрыДокумента Цикл
ВыполнитьЗамену(ДокументВорд.Content, Параметр.Ключ, Параметр.Значение);
//Ищим вхождения параметра в верхнем колонтитуле
ВыполнитьЗамену(ДокументВорд.Sections(1).Headers.Item(1).Range(), Параметр.Ключ, Параметр.Значение);
//Ищим вхождения параметра в нижнем колонтитуле первой и последующих страниц
ВыполнитьЗамену(ДокументВорд.Sections(1).Footers.Item(1).Range(), Параметр.Ключ, Параметр.Значение);
ВыполнитьЗамену(ДокументВорд.Sections(1).Footers.Item(2).Range(), Параметр.Ключ, Параметр.Значение);
КонецЦикла;

//Выполнить поиск и замену Функция
ВыполнитьЗамену(знач Object, Параметр, Значение)
Object.Find.Execute(Параметр,,,,,,,,,Значение,2)
КонецФункции

Рассмотри подробнее метод Execute. Его параметры идентичны диалоговуму окну при замене/поиске непоседресвенно из MS Word:

А вот и основные параметры (вольный перевод справки MSDN):

  1. Искомый текст — Строка — Текст для замены. Текст может содержать специальные параметры. Например, ^p — абзац, ^t — табуляция
  2. Чувствительность к регистру — Булево — Если истина, то поиск будет осуществляться с учетом регистра
  3. Слова целиком — Булево — Если истина, то ищутся слова целиком. Вхождение слов не учитываются. Например, при поиске слова дом будет пропущено слово домашний
  4. Использовать подстановочные знаки — Булево — Если истина, то используются встроенные регулярные выражения.
  5. Искать похожие — Булево — Если истина, то результат поиска будет содержать похожие слова
  6. Искать все формы — Булево — Если истина, то результат поиска будет содержать различные формы слов.
  7. Поиск сначала — Булево — Если истина, то будет осуществляться с начала до конца документа
  8. Охват — WdFindWrap Опредяляет направление поиска
  9. Формат — Format — Формат искомого текста
  10. Строка замены — Строка — Строка, на которую будет заменен исходный текст
  11. Количество замен — WdReplace — Определяет сколько раз выполнять замену
  12. и т.д.

WdReplace — Constant Value:
wdReplaceAll 2
wdReplaceNone 0
wdReplaceOne 1

Данный метод не позволяет получить «Строка замены» как выделенную область, но он работает где-то в 10 раз медленнее. Для получения выделенной области можно воспользоваться немножко откорректированной типовой функцией:


//УправлениеПечатьюMSWordКлиент c незначительными изменениями для конфигурации УПП 1.3
Функция ВыполнитьЗамену(знач Object, Параметр, Значение)
СтрокаПоиска = "[" + Параметр + "]";
СтрокаЗамены = Строка(Значение);
//Необходимо выделить областей, в которой мы осуществляем замену
Object.Select();
//Получаем выделенную область
Selection = Object.Application.Selection;
//Найдем все вхождения параметра и заменим его на нужное нам значение
FindObject = Selection.Find;
FindObject.ClearFormatting();
Пока FindObject.Execute(СтрокаПоиска) Цикл
Если ПустаяСтрока(СтрокаЗамены) Тогда
Selection.Delete();
Иначе
Selection.TypeText(СтрокаЗамены);
КонецЕсли;
КонецЦикла;
//Отменим выделение
Selection.Collapse();
КонецФункции

Уже получив выделенную область можно отредактировать стиль текста, шрифт и т.д.


//Редактирование шрифта
Selection.Font
//Редактирование цвета
Selection.HighlightColorIndex

Также есть второй подход, использующий такой объект Word, как поля. Мне он не очень нравится, т.к. в больших документах, порядка 100 страниц, эти поля начинают глючить (исчезать, не подставлять нужные значения) и прочая ерунда. Ну по крайней мере в Word 2007. Но я его все равно приведу:

При подготовке шаблона в тело документа необходимо навставлять полей с типом DOCVARIABLE (можно вставлять горячими клавишими Ctrl+F9).

Доступ к таким полям можно получить следующим нехитрым образом:


ДокументВорд.Variables.Item(НазваниеПараметра).Values

Заполнение таблиц по шаблону

Итак, мы заполнили параметры в основном тексте документа, заменили параметры в колонтитулах, но у нас еще есть одна неприятность — нужно заполнить таблицу.

Подход, описанный ниже, годится только для таблиц с заранее известным форматом. Т.е. мы можем как угодно отформатировать таблицу и её строки изначально. Но потом изменять довольно-таки проблематично.

К таблицам можно получить доступ через области документа.


//Получаем доступ к первой таблице в основном тексте
Таблица = ДокументВорд.Content.Tables(1)

Далее, получив таблицу, мы работаем с ней по привычной схеме — строки, столбцы.

Для задания форматирования легче в шаблоне создать таблицу с пустой первой строкой, которую мы в последующем удалим.


//Данные для заполнения
ПараметрыТЧ = ПараметрыДокумента.ПриложениеТЧ;
//Нужно оставить шапку и первую строку нетронутой Итератор = 2;
Таблица = ДокументВорд.Content.Tables(3);
Для каждого Строка Из ПараметрыТЧ Цикл
//По умолчанию добавляет строку выше первой
Таблица.Rows.Add();
ЗаполнитьСтрокуТаблицы(Таблица, Итератор, Строка,"ПП,НоменклатураНаименование,ЕдИзмерения,ЦенаСтрокой",ПараметрыТЧ );
Итератор = Итератор + 1;
КонецЦикла;
//Структура шаблонов содержит Наименование колонок и их порядок
Процедура ЗаполнитьСтрокуТаблицы(Таблица, НомерСтроки, ЗначениеЗаполнения, СтруктураШаблонов,ТаблицаЗначений)
МассивСтрок = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтруктураШаблонов,",");
Итератор = 1;
Для каждого Строка Из МассивСтрок Цикл
Если ТаблицаЗначений.Колонки.Найти(Строка) = Неопределено И Строка <> "ПП" Тогда
Итератор = Итератор + 1;
Продолжить;
//Не забываем, что Шапка тоже строка, а при нумерации нам нужно её исключить
ИначеЕсли Строка = "ПП" Тогда
Таблица.Cell(НомерСтроки, Итератор).Range().Text = Строка(НомерСтроки-1);
Итератор = Итератор + 1;
Продолжить;
КонецЕсли;
Таблица.Cell(НомерСтроки, Итератор).Range().Text = Строка(ЗначениеЗаполнения[Строка]);
Итератор = Итератор + 1;
КонецЦикла;
КонецПроцедуры

Вот, в принципе, и все. Основные вопросы, возникающие при работе с Word, я постарался осветить. Надеюсь, данный обзор поможет вам в работе =)

Спасибо за советы и комментарии:
v3rter, monkbest

Критика только приветствуется. Чем больше замечаний, тем лучше будет гайд =)

ivan232
29.11.2011 06:53 Прочитано: 20516

Доброго времени суток!
Подскажите, пожалуйста, как решить проблему: Есть шаблон в Word, необходимо изменить нижний колонтитул(подставить данные из 1С)???
Рабочий код:
Код 1C v 8.х

 	Попытка
Объект = ПолучитьCOMОбъект(ПутьКФайлу);
// Покажем документ. Для красоты.
Объект.Application.Visible = 1;

Документ = Объект.Application.Documents(1);
Документ.Activate();
//Определим имена
Заказчик = "Петр Иванович КакВасТам";
Исполнитель = "Help1C.com - Помощник по 1С";

// Заменить заранее определенные ключевые конструкции на требуемый текст.
Документ.Content.Find.Execute("[Заказчик]", Ложь, Истина, Ложь, , , Истина, , Ложь, Заказчик, 2);
Документ.Content.Find.Execute("[Исполнитель]", Ложь, Истина, Ложь, , , Истина, , Ложь, Исполнитель, 2);
// Далее аналогично для остальных ключевых конструкций.
// ...

// Делаем видимым приложение и активизируем его.
MSWord.Application.Visible = Истина;
MSWord.Activate();
Исключение
// Если произойдет ошибка, выводятся данные об ошибке и объект закрывается.
Сообщить(ОписаниеОшибки());
MSWord.Application.Quit();
КонецПопытки;

Заранее большое спасибо! )


Изменено 29.11.11 06:53:59

Yandex
Возможно, вас также заинтересует

Реклама на портале

E_Migachev
29.11.2011 11:49 Ответ № 1

(0) ivan232, вот код пример работы c WORDом, только он для 7.7, но впринципе все тоже! как сделаешь, выложи пожалуйста получившийся у тебя код *13
Код 1C v 7.x

 Попытка
Application=СоздатьОбъект("Word.Application");
Исключение
Сообщить(ОписаниеОшибки(),"!!!");
Сообщить("Возможно, MS Word не установлен на этом компьютере.");
Возврат;
КонецПопытки;
// , , DocumentType:=0
//Создание листа документа
Application.Documents.Add();
WorkBook=Application.ActiveDocument;
//Получение окна
Window=WorkBook.Windows(1);
//Установка невидимости окна для убыстрения вывода
Window.Visible=1;
//не выдавать предупреждений
Application.DisplayAlerts=0;
//Установка ориентации листа
WorkBook.PageSetup.Orientation = 0;
//Это портретная, альбомная 1
//Установка размера полей
WorkBook.PageSetup.TopMargin = 28; //Размер в поинтах, 1 СМ=28pt
WorkBook.PageSetup.BottomMargin = 28;
WorkBook.PageSetup.LeftMargin = 28;
WorkBook.PageSetup.RightMargin = 28;
//Установка высоты колонтитулов
WorkBook.PageSetup.HeaderDistance = 28; //Размер в поинтах, 1 СМ=28pt
WorkBook.PageSetup.FooterDistance = 28;
//Установка зеркальных полей
WorkBook.PageSetup.MirrorMargins = False;
//Установка параметров абзаца
Application.S_election.ParagraphFormat.LeftIndent = 10;//Абзац, отступ слева
Application.S_election.ParagraphFormat.RightIndent = 10;//Абзац, отступ Справа
Application.S_election.ParagraphFormat.SpaceBefore = 10;//Отступ до абзаца
Application.S_election.ParagraphFormat.SpaceBeforeAuto = False; //не автомат
Application.S_election.ParagraphFormat.SpaceAfter = 10;//Отступ после абзаца
Application.S_election.ParagraphFormat.SpaceAfterAuto = False;//не автомат
Application.S_election.ParagraphFormat.LineSpacingRule = 1;//Междустрочный интервал 0-одинарный,1-полуторный,2-двойной
Application.S_election.ParagraphFormat.FirstLineIndent = 28;//Отступ первой строки абзаца
Application.S_election.ParagraphFormat.Alignment = 3;//Выравнивание 0-по левому краю, 1-по центру, 2-по правому краю, 3-по ширине
//Установка шрифта для печати
Application.S_election.Font.Name = "Times New Roman";
Application.S_election.Font.Size = 14;
//Ввод текста
Application.S_election.TypeText("Просто текст. Просто текст. Просто текст. Просто текст. Просто текст. Просто текст. И так алее... ");
Application.S_election.TypeText("Просто текст. Просто текст. Просто текст. Просто текст. Просто текст. Просто текст. И так далее... ");
Application.S_election.TypeText("Просто текст. Просто текст. Просто текст. Просто текст. Просто текст. Просто текст. И так далее... ");
//Ввод абзаца
Application.S_election.TypeParagraph();
//Ввод текста
Application.S_election.Font.Name = "Courier New";
Application.S_election.Font.Size = 14;
Application.S_election.TypeText("Просто текст. Просто текст. Просто текст. Просто текст. Просто текст. Просто текст. И так далее... ");
Application.S_election.Font.Bold = 1;
Application.S_election.TypeText("Просто текст. Просто текст. Просто текст. Просто текст. Просто текст. Просто текст. И так далее... ");
Application.S_election.Font.Bold = 0;
Application.S_election.TypeText("Просто текст. Просто текст. Просто текст. Просто текст. Просто текст. Просто текст. И так далее... ");
Application.S_election.TypeParagraph();
//Запись и форматирование верхнего колонтитула
WorkBook.Sections(1).Headers(1).Range.ParagraphFormat.Alignment = 2;
WorkBook.Sections(1).Headers(1).Range.Font.Name = "Times New Roman";
WorkBook.Sections(1).Headers(1).Range.Font.Bold = 1;
WorkBook.Sections(1).Headers(1).Range.Font.Size = 8;
WorkBook.Sections(1).Headers(1).Range.Font.Size = 8;
WorkBook.Sections(1).Headers(1).Range.Text="Верхний колонтитул";
//Запись и форматирование нижнего колонтитула
WorkBook.Sections(1).Footers(1).Range.ParagraphFormat.Alignment = 0;
WorkBook.Sections(1).Footers(1).Range.Font.Name = "Times New Roman";
WorkBook.Sections(1).Footers(1).Range.Font.Italic = 1;
WorkBook.Sections(1).Footers(1).Range.Font.Size = 8;
WorkBook.Sections(1).Footers(1).Range.Font.Size = 8;
WorkBook.Sections(1).Footers(1).Range.Text="Нижний колонтитул";
//Вставка и форматирование таблицы
WorkBook.Tables.Add(WorkBook.Paragraphs(Workbook.Paragraphs.Count()).Range,3,2);
WorkBook.Tables(1).Range.S_elect();
Application.S_election().Style = "Сетка таблицы";
Application.S_election.Tables(1).Columns(1).Width = 97.55;
Application.S_election.Tables(1).Columns(2).Width = 446.5;
Application.S_election.ParagraphFormat.LeftIndent = 0;//Абзац, отступ слева
Application.S_election.ParagraphFormat.RightIndent = 0;//Абзац, отступ Справа
Application.S_election.ParagraphFormat.SpaceBefore = 3;//Отступ до абзаца
Application.S_election.ParagraphFormat.SpaceBeforeAuto = False; //не автомат
Application.S_election.ParagraphFormat.SpaceAfter = 0;//Отступ после абзаца
Application.S_election.ParagraphFormat.SpaceAfterAuto = False;//не автомат
Application.S_election.ParagraphFormat.LineSpacingRule = 0;//Междустрочный интервал 0-одинарный,1-полуторный,2-двойной
Application.S_election.ParagraphFormat.FirstLineIndent = 0;//Отступ первой строки абзаца
Application.S_election.ParagraphFormat.Alignment = 1;//Выравнивание 0-по левому краю, 1-по центру, 2-по правому краю, 3-по ширине
//Заполнения таблицы
WorkBook.Tables(1).Cell(1,1).Range.Font.Name = "Times New Roman";
WorkBook.Tables(1).Cell(1,1).Range.Font.Size = 8;
WorkBook.Tables(1).Cell(1,1).Range.Font.Bold = 1;
WorkBook.Tables(1).Cell(1,1).Range.Text = "Это первая строка, первая колонка";
WorkBook.Tables(1).Cell(1,1).Range.Font.Name = "Times New Roman";
WorkBook.Tables(1).Cell(1,1).Range.Font.Size = 8;
//Форматирование ячейки таблицы
WorkBook.Tables(1).Cell(1,2).Range.Font.Name = "Times New Roman";
WorkBook.Tables(1).Cell(1,2).Range.Font.Size = 8;
WorkBook.Tables(1).Cell(1,2).Range.Font.Bold = 1;
//Вставка таблицы в ячейку
WorkBook.Tables(1).Cell(1,2).Range.S_elect();
Application.S_election.TypeParagraph();
//Application.S_election.TypeParagraph();
//Application.S_election.TypeParagraph();
//Application.S_election.TypeParagraph();
WorkBook.Tables(1).Cell(1,2).Range.S_elect();
Application.Options.DefaultBorderLineStyle=2;
qwer=Application.ActiveDocument.Tables.Add(Application.S_election().Range,3,9,9);
qwer.Range.S_elect();
Application.S_election().Borders.InsideLineStyle=2;
//WorkBook.Tables(2).Cell(1,1).Range.Font.Name = "Times New Roman";
//WorkBook.Tables(2).Cell(1,1).Range.Font.Size = 8;
//WorkBook.Tables(2).Cell(1,1).Range.Font.Bold = 1;
//WorkBook.Tables(2).Cell(1,1).Range.Text = "Это полная ываыва";
//Application.S_election.MoveDown(7,7);
////***************************************
//Application.S_election.TypeParagraph();
//
//WorkBook.Tables.Add(WorkBook.Paragraphs(Workbook.Paragraphs.Count()).Range,3,2);
//WorkBook.Tables(2).Range.S_elect();
//Application.Options.DefaultBorderLineStyle=2;
//Application.S_election().Borders.InsideLineStyle=2;
////Application.S_election().Style = "Сетка таблицы";
//
//Application.S_election.Tables(1).Columns(1).Width = 97.55;
//Application.S_election.Tables(1).Columns(2).Width = 446.5;
////
//Application.S_election.ParagraphFormat.LeftIndent = 0;//Абзац, отступ слева
//Application.S_election.ParagraphFormat.RightIndent = 0;//Абзац, отступ Справа
//Application.S_election.ParagraphFormat.SpaceBefore = 3;//Отступ до абзаца
//Application.S_election.ParagraphFormat.SpaceBeforeAuto = False; //не автомат
//Application.S_election.ParagraphFormat.SpaceAfter = 0;//Отступ после абзаца
//Application.S_election.ParagraphFormat.SpaceAfterAuto = False;//не автомат
//Application.S_election.ParagraphFormat.LineSpacingRule = 0;//Междустрочный интервал 0-одинарный,1-полуторный,2-двойной
//Application.S_election.ParagraphFormat.FirstLineIndent = 0;//Отступ первой строки абзаца
//Application.S_election.ParagraphFormat.Alignment = 1;//Выравнивание 0-по левому краю, 1-по центру, 2-по правому краю, 3-по ширине
//
//////Заполнения таблицы
//WorkBook.Tables(2).Cell(1,2).Range.Font.Name = "Times New Roman";
//WorkBook.Tables(2).Cell(1,2).Range.Font.Size = 8;
//WorkBook.Tables(2).Cell(1,2).Range.Font.Italic = 1;
//WorkBook.Tables(2).Cell(1,2).Range.Text = "Это первая строка, вторая колонка";
Application.Visible=1;
Window.Visible=1;

!!! В слове S_election убери символ _


Изменено 29.11.11 11:56:51

ivan232
29.11.2011 18:30 Ответ № 2

Проблему решил добавив следующую строку:Код 1C v 8.х

 Документ.Sections(1).Footers(1).Range.Find.Execute("[НашаОрганизация]", Ложь, Истина, Ложь, , , Истина, , Ложь, Заказчик, 2);   

Спасибо E_Migachev

djserega
04.08.2021 15:51 Ответ № 3

Может кому пригодится: иногда колонтитулы различаются, тогда надо добавить

Код 1C v 8.х

 Документ.Sections(1).Footers(2).Range.Find.Execute("[НашаОрганизация]", Ложь, Истина, Ложь, , , Истина, , Ложь, Заказчик, 2);   
Подсказка: Для быстрого перемещения к последнему ответу или к вопросу используйте или .

ТабличныйДокумент (SpreadsheetDocument)
ПроверитьВывод (CheckPut)
Синтаксис:

ПроверитьВывод(<Таблицы>)
Параметры:

<Таблицы> (обязательный)

Тип: Массив; ТабличныйДокумент.
Массив из проверяемых таблиц или табличный документ.
Возвращаемое значение:

Тип: Булево.
Истина — умещаются; Ложь — в противном случае.
Описание:

Проверяет, умещаются ли переданные табличные документы на страницу при печати.

Доступность:

Сервер, толстый клиент, внешнее соединение.
Примечание:

При возникновении проблем с получением информации о текущем принтере (например, в системе не установлено ни одного принтера), будет вызвано исключение.
Пример:

Т.Добавить(ШапкаДокумента);
Т.Добавить(СтрокаДокумента);
Т.Добавить(ПодвалДокумента);
Если Не ТабДок.ПроверитьВывод(Т) Тогда
Сообщить(«Документ не умещается на страницу!»);
КонецЕсли;

См. также:

ТабличныйДокумент, метод ПроверитьПрисоединение

Like this post? Please share to your friends:
  • 1с макет active document word
  • 1с как табличную часть сохранить в excel
  • 1с как сохранить только группировки в excel
  • 1с как сохранить таблицу значений в файл excel
  • 1с как сохранить справочник в excel