1с 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-й параметр — направление поиска, вперед.

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

Доброго времени суток!
Подскажите, пожалуйста, как решить проблему: Есть шаблон в 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);   
Подсказка: Вы можете приложить к ответу файл или изображение щелкнув по значку или в редакторе.

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

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

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

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

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

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

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

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

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

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

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

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

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

Тэги:

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

Skip to content

1С — вывести верхний и нижний колонтитулы по условию, в печатной форме

Вывести верхний и нижний колонтитулы по условию, в печатной форме

В результате вы узнаете как:

  • Выводить колонтитулы не на каждой странице;
  • Выводить повторяющиеся область в печатных формах сверху и снизу;
  • Выводить таблицы и картинки в колонтитул печатной формы;

Описание задачи:

  • Вывести области с подписями руководителей на всех страницах, кроме последней, в нижней части страницы;
  • Вывести области шапки на всех страницах, в верхней части страницы;

Решение задачи:

  • Перед каждым выводом текущей области макета запустить процедуру по выводу колонтитулов.

Процедура по выводу колонтитулов:

Процедура ВывестиКолонтитулы(ТабличныйДокумент, МакетОбработки, ТекущаяОбластьМакета,
	ОбластьШапкаСпецификацияКДоговору, ФИОПокупателя)
	
	//Получаем область - нижний колонтитул
	ОбластьНижнийКолонтитул = МакетОбработки.ПолучитьОбласть("НижнийКолонтитул");
	
	//Пока не выводим текущую область,
	//складываем текущую область с областью нижнего колонтитула в массив
	
	//Внимание! Не надо складывать все выведенные до этого области,
	//только Текущая и Нижний колонтитул
	ВыводимыеОбласти = Новый Массив;
	ВыводимыеОбласти.Добавить(ТекущаяОбластьМакета);
	ВыводимыеОбласти.Добавить(ОбластьНижнийКолонтитул);
	
	//Проверяем войдут ли сложенные области на страницу
	Если НЕ ТабличныйДокумент.ПроверитьВывод(ВыводимыеОбласти) Тогда
		//Если сложенные области не входят на страницу,
		//выводим нижний колонтитул и горизонтальный разделитель страниц
		ОбластьНижнийКолонтитул.Параметры.ФИОПокупателя = ФИОПокупателя;
		ОбластьНижнийКолонтитул.Параметры.ФИОДиректора = "Анищенко Б.С.";
		ТабличныйДокумент.Вывести(ОбластьНижнийКолонтитул);
		ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
		//Затем выводим шапку, уже на следующей странице
		ТабличныйДокумент.Вывести(ОбластьШапкаСпецификацияКДоговору);
	КонецЕсли;
КонецПроцедуры


Также стоит отметить что параметры: «ТабличныйДокумент.ПолеСверху» и «ТабличныйДокумент.ПолеСнизу» не должны быть заданы программно.

Связанные статьи

Данная статья — попытка собрать сведения по работе (на начальном уровне) с 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

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

Пример рекурсивной функции, при помощи которой в табличный документ можно выводить верхний или нижний колонтитулы с произвольным содержимым, а также делать повтор шапки таблицы (или таблиц, если их несколько).

В данной статье будет приведен пример рекурсивной функции, при помощи которой в табличный документ можно выводить верхний или нижний колонтитулы с произвольным содержимым, а также делать повтор шапки произвольной таблицы в документе (или таблиц, если в документе их несколько).

Сразу уточню, что функция не тестировалась на очень объемных документах, поэтому, если кто-то проведет такое испытание, пожалуйста, напишите результаты в комментариях.

Задача состояла в следующем: 

1) выводить не очень большой табличный документ (до 30 листов) с несколькими таблицами,

2) на каждой странице в колонтитуле добавлять нумерацию (если страниц больше одной) и картинку (QR-код) (в том числе корректно выводить нижний колонтитул на последней странице),

3) если какие-либо из таблиц переносились на следующую страницу, необходимо было производить повтор шапки переносимой таблицы, при этом не допустить, чтобы на предыдущей странице осталась только шапка без хотя бы одной строки данных в ней,

4) предусмотреть возможность вывода произвольного верхнего колонтитула (изначально макетом заложен не был).

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

Статей на данную тему с примерами вывода колонтитулов и повторов шапки таблицы в интернете довольно много. Однако, когда возникла описанная выше задача, готового варианта реализации всех названных условий не нашлось (лишь фрагментарно), поэтому был написан некий свой универсальный вариант.

Привожу код получившейся основной рекурсивной функции вывода в табличный документ колонтитулов и повторения шапки таблицы:



















Функция ВыводВТабДокСКолонтитулами(ТабДок,
ВыводимаяОбласть
,
ОбластьПустойСтроки
,
ОбластьВерхнегоКолонтитула
= Неопределено,
ОбластьНижнегоКолонтитула
= Неопределено,
ОбластьШапкаТаблицы
= Неопределено,
НомерСтраницы
= 0)



ЗапретВисячихШапокТаблицы
= Истина;


ЕстьВыводимаяОбласть
= ?(ВыводимаяОбласть = Неопределено, Ложь, Истина);
ЕстьВерхнийКолонтитул
= ?(ОбластьВерхнегоКолонтитула = Неопределено, Ложь, Истина);
ЕстьНижнийКолонтитул
= ?(ОбластьНижнегоКолонтитула = Неопределено, Ложь, Истина);
ЕстьШапкаТаблицы
= ?(ОбластьШапкаТаблицы = Неопределено, Ложь, Истина);


ЭтоВыводШапкиТаблицы
= (ЕстьШапкаТаблицы И ВыводимаяОбласть = ОбластьШапкаТаблицы);


ОбластьСНижнимКолонтитулом
= Новый Массив;
ОбластьСНижнимКолонтитулом.Добавить
(?(ЕстьВыводимаяОбласть, ВыводимаяОбласть, ОбластьПустойСтроки));


Если ЗапретВисячихШапокТаблицы Тогда
Если ЭтоВыводШапкиТаблицы Тогда
ОбластьСНижнимКолонтитулом.Добавить
(ОбластьПустойСтроки);
КонецЕсли;
КонецЕсли;


Если ЕстьНижнийКолонтитул Тогда
ОбластьСНижнимКолонтитулом.Добавить
(ОбластьНижнегоКолонтитула);
КонецЕсли;

Если ВыводимаяОбласть = Неопределено И ЕстьНижнийКолонтитул Тогда



Пока ТабДок.ПроверитьВывод(ОбластьСНижнимКолонтитулом) Цикл
ТабДок.Вывести
(ОбластьПустойСтроки);
КонецЦикла;

Если НомерСтраницы > 1 Тогда
ОбластьНижнегоКолонтитула.Параметры.НомерСтраницы
= НомерСтраницы;
КонецЕсли;
ТабДок.Вывести
(ОбластьНижнегоКолонтитула);
Иначе

Если Не ТабДок.ПроверитьВывод(ОбластьСНижнимКолонтитулом) Тогда
Если ВыводимаяОбласть = ОбластьПустойСтроки Тогда
Возврат НомерСтраницы;
КонецЕсли;

НомерСтраницы
= ВыводВТабДокСКолонтитулами(ТабДок,
ОбластьПустойСтроки
,
ОбластьПустойСтроки
,
ОбластьВерхнегоКолонтитула
,
ОбластьНижнегоКолонтитула
,
ОбластьШапкаТаблицы
,
НомерСтраницы
);

Если ЕстьНижнийКолонтитул Тогда
Если НомерСтраницы > 0 Тогда
ОбластьНижнегоКолонтитула.Параметры.НомерСтраницы
= НомерСтраницы;
НомерСтраницы
= НомерСтраницы + 1;
КонецЕсли;
ТабДок.Вывести
(ОбластьНижнегоКолонтитула);
КонецЕсли;
ТабДок.ВывестиГоризонтальныйРазделительСтраниц
();

Если ЕстьВерхнийКолонтитул Тогда
ТабДок.Вывести
(ОбластьВерхнегоКолонтитула);
КонецЕсли;

Если ЕстьШапкаТаблицы и Не ЭтоВыводШапкиТаблицы Тогда
ТабДок.Вывести
(ОбластьШапкаТаблицы);
КонецЕсли;
КонецЕсли;

ТабДок.Вывести
(ВыводимаяОбласть);
Если ВыводимаяОбласть = ОбластьПустойСтроки Тогда

НомерСтраницы
= ВыводВТабДокСКолонтитулами(ТабДок,
ОбластьПустойСтроки
,
ОбластьПустойСтроки
,
ОбластьВерхнегоКолонтитула
,
ОбластьНижнегоКолонтитула
,
ОбластьШапкаТаблицы
,
НомерСтраницы
);
КонецЕсли;
КонецЕсли;
Возврат НомерСтраницы;
КонецФункции

Как использовать данную функцию

Что понадобится задать в макете для использования функции:

    1) область пустой строки,

    2) область верхнего колонтитула с произвольным содержимым,

    3) область нижнего колонтитула с произвольным содержимым,

    4) области шапок таблиц.

Пример:

В коде их соответственно зачитываем:

ОбластьВерхнегоКолонтитула = Макет.ПолучитьОбласть(«ВерхнийКолонтитул»);
ОбластьНижнегоКолонтитула
= Макет.ПолучитьОбласть(«НижнийКолонтитул»);
ОбластьПустойСтроки
= Макет.ПолучитьОбласть(«ПустаяСтрока»);

Заполняем колонтитулы значениями параметров, если они присутствуют, например:


ОбластьНижнегоКолонтитула.Параметры.QRCode
= QRCode;

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

ТабДок = Новый ТабличныйДокумент;

ТабДок.РазмерСтраницы
= «A4»;
ТабДок.ОриентацияСтраницы
= ОриентацияСтраницы.Ландшафт;
ТабДок.МасштабПечати
= 100;
ТабДок.ПолеСверху
= 10;
ТабДок.ПолеСнизу
= 5;
ТабДок.ПолеСлева
= 15;
ТабДок.ПолеСправа
= 10;
НомерСтраницы
= 1;

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

Пример вывода какой-либо области:

Область = Макет.ПолучитьОбласть(«ШапкаДокумента»);

Область.Параметры.Заполнить
(ПараметрыОтчетаВВидеСтруктуры);
НомерСтраницы
= ВыводВТабДокСКолонтитулами(ТабДок, Область,
ОбластьПустойСтроки
, ОбластьВерхнегоКолонтитула, ОбластьНижнегоКолонтитула,, НомерСтраницы);

Пример вывода таблицы:

ОбластьШапкаТаблицы = Макет.ПолучитьОбласть(ИмяТаблицы + «ШапкаТаблицы»);    

НомерСтраницы
= ВыводВТабДокСКолонтитулами(ТабДок, ОбластьШапкаТаблицы,
        ОбластьПустойСтроки
, ОбластьВерхнегоКолонтитула,
        ОбластьНижнегоКолонтитула
, ОбластьШапкаТаблицы, НомерСтраницы);

Для каждого Строка из ВыводимаяТаблица Цикл
    Область
= Макет.ПолучитьОбласть(ИмяТаблицы + «Данные»);
    Область.Параметры.Заполнить
(ПараметрыОтчетаВВидеСтруктуры);
    

    НомерСтраницы
= ВыводВТабДокСКолонтитулами(ТабДок, Область, ОбластьПустойСтроки, О
            бластьВерхнегоКолонтитула
, ОбластьНижнегоКолонтитула,
            ОбластьШапкаТаблицы
, НомерСтраницы);
КонецЦикла;

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

Пример повтора шапки таблицы:

Почему в задаче был упомянут корректный вывод нижнего колонтитула на последней странице? Потому что при тех способах, что советовали в других статьях (например, просто добавить область нижнего колонтитула к последней выводимой области в документе) получалось, что колонтитул отображался не в самом низу страницы, а там, где закончился документ (например, где-нибудь посередине, а бывало и в вверху). В указанной функции для этого используется область пустой строки (т.е. последняя страница «дополняется» до самого низа пустыми строками и только в самом конце выводится нижний колонтитул).

Вот пример вывода последней страницы:

Поэтому, после вывода всех данных в табличный документ делаем завершающий вызов функции, если нужно корректно завершить страницу с нижним колонтитулом:


НомерСтраницы
= ВыводВТабДокСКолонтитулами(ТабДок,,
ОбластьПустойСтроки
,, ОбластьНижнегоКолонтитула,, НомерСтраницы);

Полный пример:

Функция СформироватьПечатнуюФорму()


Макет
= Документы.п_ВыпискаИзЭлектроннойЗачетнойКнижки.ПолучитьМакет(«МакетСКолонтитулами»);
ОбластьВерхнегоКолонтитула
= Макет.ПолучитьОбласть(«ВерхнийКолонтитул»);
ОбластьНижнегоКолонтитула
= Макет.ПолучитьОбласть(«НижнийКолонтитул»);
ОбластьПустойСтроки
= Макет.ПолучитьОбласть(«ПустаяСтрока»);


QRCode
= Новый Картинка(УправлениеПечатью.ДанныеQRКода(«СтрокаДляКодирования», 0, 100));
ОбластьНижнегоКолонтитула.Параметры.QRCode
= QRCode;

ТабДок = Новый ТабличныйДокумент;

ТабДок.РазмерСтраницы
= «A4»;
ТабДок.ОриентацияСтраницы
= ОриентацияСтраницы.Ландшафт;
ТабДок.МасштабПечати
= 100;
ТабДок.ПолеСверху
= 10;
ТабДок.ПолеСнизу
= 5;
ТабДок.ПолеСлева
= 15;
ТабДок.ПолеСправа
= 10;
НомерСтраницы
= 1;


ТабДок.Вывести
(ОбластьВерхнегоКолонтитула);

ПараметрыОтчетаВВидеСтруктуры = Новый Структура(«ФамилияИмяОтчество, НомерДокумента»,
ЭтотОбъект.ФизическоеЛицо
, ЭтотОбъект.ЗачетнаяКнига);

Область = Макет.ПолучитьОбласть(«ШапкаДокумента»);

Область.Параметры.Заполнить
(ПараметрыОтчетаВВидеСтруктуры);

НомерСтраницы
= ВыводВТабДокСКолонтитулами(ТабДок, Область,
ОбластьПустойСтроки
, ОбластьВерхнегоКолонтитула,
ОбластьНижнегоКолонтитула
,, НомерСтраницы);


Если ЭтотОбъект.КурсовыеРаботы.Количество() > 0 Тогда
ОбластьШапкаТаблицы
= Макет.ПолучитьОбласть(«КурсовыеРаботыШапкаТаблицы»);

НомерСтраницы
= ВыводВТабДокСКолонтитулами(ТабДок, ОбластьШапкаТаблицы,
ОбластьПустойСтроки
, ОбластьВерхнегоКолонтитула,
ОбластьНижнегоКолонтитула
, ОбластьШапкаТаблицы, НомерСтраницы);

Для каждого СтрокаКР из ЭтотОбъект.КурсовыеРаботы Цикл
Область
= Макет.ПолучитьОбласть(«КурсовыеРаботыДанные»);
Область.Параметры.Заполнить
(СтрокаКР);

НомерСтраницы
= ВыводВТабДокСКолонтитулами(ТабДок, Область,
ОбластьПустойСтроки
, ОбластьВерхнегоКолонтитула,
ОбластьНижнегоКолонтитула
, ОбластьШапкаТаблицы, НомерСтраницы);
КонецЦикла;
КонецЕсли;

Область = Макет.ПолучитьОбласть(«Подвал»);
НомерСтраницы
= ВыводВТабДокСКолонтитулами(ТабДок, Область,
ОбластьПустойСтроки
, ОбластьВерхнегоКолонтитула,
ОбластьНижнегоКолонтитула
,, НомерСтраницы);


НомерСтраницы
= ВыводВТабДокСКолонтитулами(ТабДок,, ОбластьПустойСтроки,,
ОбластьНижнегоКолонтитула
,, НомерСтраницы);

Возврат ТабДок;
КонецФункции

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

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

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

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

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

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

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

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

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

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

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

См. также:

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

Понравилась статья? Поделить с друзьями:
  • 1с excel формат файла не поддерживается
  • 1с excel построитель отчета
  • 1с excel ошибка метода контекст open
  • 1с excel не устанавливая
  • 1с excel методы доступа