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

26.10.18

Разработка - Универсальные функции

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

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

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

руб.

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

 

Вступайте в нашу телеграмм-группу Инфостарт

Word тонкий клиент управляемая таблица

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4825    Abysswalker    11    

47

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.

14.05.2025    9027    DeerCven    15    

63

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    57915    dimanich70    85    

175

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    8138    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    72664    atdonya    31    

73

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    10112    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. v3rter 10.11.16 11:06 Сейчас в теме
Я бы на всякий случай в качестве имени файла использовал "Договор_ЖП_"+ПолучитьИмяВременногоФайла ("dot")
3. gortrex 66 10.11.16 14:17 Сейчас в теме
(1) v3rter, Временный файл пришлось бы удалять каждый раз, а так он перезаписывается.
2. msfog 10.11.16 12:39 Сейчас в теме
Спасибо, полезная информация)
4. 1C_Koding 31.08.17 15:00 Сейчас в теме
5. mcgoblin 3 21.09.17 13:37 Сейчас в теме
Блин, как я сам не догадался параметры заменять процедурой. Спасибо.
6. user807271 06.12.17 01:06 Сейчас в теме
Мне данная статья очень помогла. Спасибо автору. Сервер у меня на LINUX, поэтому этот вариант оказался универсальным.
7. vanoono 28.09.18 10:51 Сейчас в теме
1. Как у вас процедура возвращает Неопределено ?
&НаКлиенте
Процедура ВставитьГрафикВорд()
           
            Макет = ПолучитьМакетНаСервере("Договор_жп");
            Попытка
                        Макет.Записать(КаталогВременныхФайлов()+"Договор_жп.dot"); //файл ".dot" сохраняется во временную папку пользователя
            Исключение
                        Сообщить(ОписаниеОшибки());
                        Возврат Неопределено;
            КонецПопытки;
Показать


2. А что делать если шара недоступна ? Или КаталогВременныхФайлов просто недоступен ?
8. gortrex 66 26.10.18 10:23 Сейчас в теме
Исправил.
КаталогВременныхФайлов всегда доступен!
Для отправки сообщения требуется регистрация/авторизация