Пример работы с шаблоном Word через ole (клиент — сервер, тонкий клиент) — установка значений и заполнение таблицы
В примере показывается заполнение строк готовой таблицы, добавление новой таблицы, объединение ячеек, установка значений в «параметр».
- Описание
- Подробнее
Описание
Встала задача — заполнение договора в ворде и таблицы.
Решил не делать программное форматирование шапки таблицы, а заполнять готовый шаблон:
№ | руб. | Поле4 | ||
Поле1 | Поле2 | Поле3 | ||
{ГрафикНачало} |
|
|
|
|
| ИТОГО: |
|
|
|
В итоге должна получиться вот такая таблица:
№ | руб. | Поле4 | ||
Поле1 | Поле2 | Поле3 | ||
1 | qwe | 12 | 45 | 01.01.2016 |
2 | asd | 34 | 67 | 03.01.2016 |
3 | zxc | 1 | 5 | 04.01.2016 |
4 | rty | 8 | 33 | 10.01.2016 |
| ИТОГО: | 55 |
|
|
В клиент-серверном варианте управляемой конфигурации, сработал только такой вариант — создание OLE из файла.
Получить данные из макета можно только "на сервере", а в управляемой конфигурации с сервера на клиент, без ошибки, передаются только "двоичные данные".
Ниже функция возвращает двоичные данные, на клиента:
&НаСервере
Функция ПолучитьМакетНаСервере(ИмяМакета) //функция возвращает двоичные данные из макета (макет должен быть "двоичные данные")
ОтчетОбъект = РеквизитФормыВЗначение("Объект");
Макет = ОтчетОбъект.ПолучитьМакет(ИмяМакета);
Возврат Макет;
КонецФункцииСледующая процедура находит и заменяет все вхождения в документе:
Имя — имя параметра
Значение — значение параметра
&НаКлиенте
Процедура УстановитьЗначениеВорд(Doc,Имя,Значение) // найти и заменить текст
Replace = Doc.Content.Find;
Replace.Execute(Имя,Ложь,Истина,Ложь,,,Истина,,Ложь,Значение);
КонецПроцедурыЭта функция находит текст и возвращает его диапазон, далее через диапазон можно получить таблицу в которой он находится, или вставить новую в этот диапазон, а также изменить формат и прочее…
&НаКлиенте
Функция GetRange(Doc,Имя) //находит текст и возвращает его диапазон
Range = Doc.Application.Selection.Range;
Range.Find.Execute(Имя);
Возврат Range;
КонецФункцииОсновная процедура, создает "ком" из файла и заполняет таблицу:
&НаКлиенте
Процедура ВставитьГрафикВорд()
Макет = ПолучитьМакетНаСервере("Договор_жп");
Попытка
Макет.Записать(КаталогВременныхФайлов()+"Договор_жп.dot"); //файл ".dot" сохраняется во временную папку пользователя
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Попытка
MSWord = ПолучитьCOMОбъект(КаталогВременныхФайлов()+"Договор_жп.dot");
Doc = MSWord.Application.Documents(1);
Doc.Activate();
//УстановитьЗначениеВорд(Doc,"{ГрафикНачало}","895"); //процедура находит и заменяет все значения {ГрафикНачало} в документе, на "895"
Range = GetRange(Doc,"{ГрафикНачало}"); //получить диапазон текста {ГрафикНачало}
Table = Range.Tables(1); //получить таблицу в которую входит диапазон
НомСтр = 2;
Ном = 0;
Для Каждого СтрокаГрафика Из Объект.График Цикл
НомСтр = НомСтр + 1;
Ном = Ном + 1;
Если НЕ Ном = Объект.График.Количество() Тогда
Table.Rows.Add(Table.Cell(НомСтр,1)); //добавить новую строку перед текущей (для последней строки не добавляем)
КонецЕсли;
Table.Cell(НомСтр,1).Range.Text = СтрокаГрафика.НомерСтроки; // установить текст в ячейку таблицы
Table.Cell(НомСтр,2).Range.Text = Формат(СтрокаГрафика.Поле1,"ЧДЦ=2; ЧРГ=' '");
Table.Cell(НомСтр,3).Range.Text = Формат(СтрокаГрафика.Поле2,"ЧДЦ=2; ЧРГ=' '");
Table.Cell(НомСтр,4).Range.Text = Формат(СтрокаГрафика.Поле3,"ЧДЦ=2; ЧРГ=' '");
Table.Cell(НомСтр,5).Range.Text = Формат(СтрокаГрафика.Поле4,"ДФ=dd.MM.yyyy");
КонецЦикла;
Table.Cell(НомСтр+1,3).Range.Text = Формат(Объект.График.Итог("Поле2"),"ЧДЦ=2; ЧРГ=' '"); //вывод итога
// вставить таблицу вместо {График}
Range = GetRange(Doc,"{График}"); //получить диапазон текста {График}
Table = Doc.Tables.Add(Range,3,5,1,2); //добавить таблицу в диапазоне
Row=Table.Rows(1);// получить строку 1
Row.Cells(2).Merge(Row.Cells(4)); //объединить ячейки
Row.Cells(2).Range.Text="руб."; // установить текст в ячейку строки
Row=Table.Rows(2);
Row.Cells(1).Range.Text="№";
Row.Cells(2).Range.Text="Поле1";
Row.Cells(3).Range.Text="Поле2";
Row.Cells(4).Range.Text="Поле3";
Row.Cells(5).Range.Text="Поле4";
MSWord.Application.Visible = Истина;
MSWord.Activate();
Исключение
Сообщить(ОписаниеОшибки());
MSWord.Application.Visible = Истина;
MSWord.Application.Quit();
КонецПопытки;
КонецПроцедуры

