Встала задача - заполнение договора в ворде и таблицы.
Решил не делать программное форматирование шапки таблицы, а заполнять готовый шаблон:
№ |
руб. |
Поле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();
КонецПопытки;
КонецПроцедуры