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