Перейти к содержимому

1с word шаблон — Заполнение таблиц в шаблоне Word

1с word шаблон — Заполнение таблиц в шаблоне Word

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

Для примера использовался шаблон Word следующего вида:

1с word шаблон - Заполнение таблиц в шаблоне Word - Шаблон
1с word шаблон — Заполнение таблиц в шаблоне Word — Шаблон

Как видно из шаблона, закладка «Таблица1» является указателем на начало таблицы и служит для позиционирования выделения.
Теперь непосредственно сам способ, для его реализации использовалась внешняя обработка, в модуле формы которой, описана лишь одна процедура «ПриОткрытии(Отказ)»:

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	//Попытка создать COM объект
	Попытка
		ОбъектВорд = Новый COMОбъект("Word.Application"); 
	Исключение
		Сообщить("Ошибка при запуске Microsoft Word: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
	КонецПопытки;
	
	//Путь к шаблону
	ОбъектВорд.Documents.Add("C:\Users\Константин\Desktop\Шаблон.docx");
	ШаблонВорд = ОбъектВорд.ActiveDocument;
	
	//Заполняем первую таблицу
	Если ШаблонВорд.Bookmarks.Exists("Таблица1") Тогда
		
		//Выделяем обязательную закладку начала таблицы
		ШаблонВорд.Bookmarks("Таблица1").Select();
		
		
		//Перемещаемся вниз, выделяем строку таблицы и копируем ее в буфер обмена
		ШаблонВорд.Application.Selection.MoveDown();
		ШаблонВорд.Application.Selection.SelectRow();
		ШаблонВорд.Application.Selection.Copy();
		
		Для Счетчик = 1 По 10 Цикл
			
			//Заменяем значения
			ШаблонВорд.Application.Selection.Find.Execute("Номер" ,,,,,,,,,Счетчик,2);
			ШаблонВорд.Application.Selection.Find.Execute("ЗначениеКолонки1" ,,,,,,,,,Счетчик+10,2);
			//Последний параметр поиска пустой
			ШаблонВорд.Application.Selection.Find.Execute("ЗначениеКолонки2" ,,,,,,,,,Счетчик+100,);
			
			//Перемещаемся вниз, вставляем из буфера обмена строку
			ШаблонВорд.Application.Selection.MoveDown();
			ШаблонВорд.Application.Selection.Paste();
			//Перемещаемся вверх и выделяем строку для замены значений
			ШаблонВорд.Application.Selection.MoveUp();
			ШаблонВорд.Application.Selection.SelectRow();
			
		КонецЦикла;
		
		//Вырезаем лишнюю строку
		ШаблонВорд.Application.Selection.Cut();
		
		//Скрываем обязательную закладку начала таблицы
		ШаблонВорд.Bookmarks("Таблица1").Select();
		ШаблонВорд.Application.Selection.TypeText(" ");
		
	КонецЕсли;
	
	ОбъектВорд.Application.Visible = Истина;
	ОбъектВорд.Activate();
	
	//Закрытие документа
	//ОбъектВорд.Application.Quit();
	
КонецПроцедуры

Как видно из кода процедуры, сначала находим закладку, выделяем и копируем строку таблицы находящуюся ниже, после заменяем текст на значения и вставляем скопированную строку. Результат работы внешней обработки 1С «Заполнение таблиц в шаблоне Word»:

1с word шаблон - Заполнение таблиц в шаблоне Word - Результат
1с word шаблон — Заполнение таблиц в шаблоне Word — Результат

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

Метки:

6 комментариев для “1с word шаблон — Заполнение таблиц в шаблоне Word”

  1. Хотелось воспользоваться Вашей обработкой, я ее воспроизвел и запустил.
    На строчке ШаблонВорд.Application.Selection.SelectRow();
    выдается {ВнешняяОбработка.КПвWord.Форма.Форма.Форма(196)}: Ошибка при вызове метода контекста (SelectRow)
    ШаблонВорд.Application.Selection.SelectRow();
    по причине:
    Произошла исключительная ситуация (Microsoft Word): Метод или свойство SelectRow недоступны, потому что некоторые или все объекты не ссылаются на таблицу.

  2. У меня была та же ошибка потому что я лишний MoveDown сделал и сошел с таблицы на обычное пространство документа. А так все работает, спасибо
    Заголовки только еще сделал динамические…
    А, если количество колонок неизвестно? Можно ли таблу создать программно? Скажем, создать таблицу 1х1, к ней программно прибавить сколько нужно колонок и создать в каждой метку, по которым заполнять?

  3. Спасибо за идею. Сделал немножко сложнее
    Тут не прикрепишь, ссылку на то что получилось приложу, не баньте, просто картинка
    https://ibb.co/dM4mRW0
    Идея в том, чтобы шаблонную строчку не опускать а держать всегда сверху, под Табом
    А потом ее просто сносить в конце, катом… И строчку с табом тоже… так удобнее

  4. Перед каждым:

    ШаблонВорд.Application.Selection.Find.Execute(
    

    надо добавлять (повторять):

    ШаблонВорд.Application.Selection.SelectRow();
    

    а иначе вся таблица съезжает.
    Word 2007

    Также не понятно почему последний параметр Find.Execute( … ,2); если ищем в одной выделенной строке?
    И не понятно, почему в последнем вызове последний параметр передаем пустым — по документации указано три возможных значения (0, 1, 2) — с пустыми, ИМХО, может быть нештатное поведение вызова.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *