Пример работы с шаблоном 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 тонкий клиент управляемая таблица

См. также

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

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

21.05.2024    25266    dimanich70    82    

149

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

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

1 стартмани

18.03.2024    4516    3    John_d    11    

57

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

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

12.02.2024    25705    atdonya    25    

58

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

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

30.11.2023    6093    ke.92@mail.ru    17    

65

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    16601    YA_418728146    8    

170

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    4283    73    progmaster    10    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 1C:Бухгалтерия 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    19160    181    sapervodichka    112    

136
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. v3rter 10.11.16 11:06 Сейчас в теме
Я бы на всякий случай в качестве имени файла использовал "Договор_ЖП_"+ПолучитьИмяВременногоФайла ("dot")
3. gortrex 65 10.11.16 14:17 Сейчас в теме
(1) v3rter, Временный файл пришлось бы удалять каждый раз, а так он перезаписывается.
2. msfog 10.11.16 12:39 Сейчас в теме
Спасибо, полезная информация)
4. programmer_87 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 65 26.10.18 10:23 Сейчас в теме
Исправил.
КаталогВременныхФайлов всегда доступен!
Оставьте свое сообщение