gifts2017

Пример работы с шаблоном Word через ole (клиент - сервер, тонкий клиент) - установка значений и заполнение таблицы

Опубликовал Антон Егоров (gortrex) в раздел Программирование - Практика программирования

В примере показывается заполнение строк готовой таблицы, добавление новой таблицы, объединение ячеек, установка значений в "параметр".

Встала задача - заполнение договора в ворде и таблицы.

Решил не делать программное форматирование шапки таблицы, а заполнять готовый шаблон:

руб.

Поле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();   
    КонецПопытки;   
           
КонецПроцедуры

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Роберт В е р т и н с к и й (v3rter) 10.11.16 11:06
Я бы на всякий случай в качестве имени файла использовал "Договор_ЖП_"+ПолучитьИмяВременногоФайла ("dot")
2. Юлия Бачаева (juliabah) 10.11.16 12:39
Спасибо, полезная информация)
3. Антон Егоров (gortrex) 10.11.16 14:17
(1) v3rter, Временный файл пришлось бы удалять каждый раз, а так он перезаписывается.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа