1с word шаблон — Заполнение таблиц в шаблоне Word
В предыдущей заметке «Использование шаблонов Word в 1С» был показан простой способ, как используя механизмы 1С и документа Word в качестве шаблона, можно создать печатную форму для вывода данных. В текущей заметке «1с word шаблон» будет показан один из способов, как можно реализовать заполнение таблиц в шаблоне 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»:

Хотелось воспользоваться Вашей обработкой, я ее воспроизвел и запустил.
На строчке ШаблонВорд.Application.Selection.SelectRow();
выдается {ВнешняяОбработка.КПвWord.Форма.Форма.Форма(196)}: Ошибка при вызове метода контекста (SelectRow)
ШаблонВорд.Application.Selection.SelectRow();
по причине:
Произошла исключительная ситуация (Microsoft Word): Метод или свойство SelectRow недоступны, потому что некоторые или все объекты не ссылаются на таблицу.
Похоже на то, что не была выделена строка таблицы, вероятно где то ошибка, либо в коде либо в шаблоне.
Посмотрите так же примеры:
http://infostart.ru/public/488556/
http://infostart.ru/public/65996/
https://www.youtube.com/watch?v=hjgOLIh3UjM
У меня была та же ошибка потому что я лишний MoveDown сделал и сошел с таблицы на обычное пространство документа. А так все работает, спасибо
Заголовки только еще сделал динамические…
А, если количество колонок неизвестно? Можно ли таблу создать программно? Скажем, создать таблицу 1х1, к ней программно прибавить сколько нужно колонок и создать в каждой метку, по которым заполнять?
Спасибо за идею. Сделал немножко сложнее
Тут не прикрепишь, ссылку на то что получилось приложу, не баньте, просто картинка
https://ibb.co/dM4mRW0
Идея в том, чтобы шаблонную строчку не опускать а держать всегда сверху, под Табом
А потом ее просто сносить в конце, катом… И строчку с табом тоже… так удобнее
Перед каждым:
надо добавлять (повторять):
а иначе вся таблица съезжает.
Word 2007
Также не понятно почему последний параметр Find.Execute( … ,2); если ищем в одной выделенной строке?
И не понятно, почему в последнем вызове последний параметр передаем пустым — по документации указано три возможных значения (0, 1, 2) — с пустыми, ИМХО, может быть нештатное поведение вызова.
Забыл упомянуть, что воспроизводил данный алгоритм в 1С 7.7