gifts2017

Пример создания динамической таблицы в шаблоне MS Office Word 2010 и вставка в него картинки

Опубликовал Павел С (pavel_pss) в раздел Печать - Универсальные печатные формы

Обработка с открытым кодом, для формирования в шаблоне MS Office Word 2010  динамической таблицы по результату запроса и вставке в него картинки. Картинка и шаблон - также в макете обработки.

Обработка с открытым кодом. В обработке имеется шаблон (в виде макета) MS Office Word 2010 с  таблицей, эта таблица в макете имеет одну строку данных и итоговую строку, при обходе результата запроса в эту таблицу добавляются новые строки данных перед итогами. Так же - пример вставки картинки в конец документа.

В шаблоне MS Office Word 2010 использованы ключевые параметры типа #Период#, которые ищутся и заменяются.

 

Вариант 2:

Здесь представлю вариант передачи заменяемых параметров через макрос.

Внимание:

  • при использовании данного варианта необходимо зайти в word включить работу vba (word 2010) см. картинку http://infostart.ru/upload/iblock/560/dddd.png.
  • а также у переменной в коде "ТекстДляЗамены" длина не может превышать 255 знаков
Word = Новый COMОбъект("Word.Application");
Doc=Word.Documents.Add(ИмяФайла,0, 0);
Fnd = Word.ActiveDocument.Range().Find;

// Вставляем комментарий в котором укажем номер сделки и печатной формы

Попытка
    ФормаПроцесса.НадписьСостоянияПрогрессора = "Вывод примечания в шаблоне MS Word с информацией по печатной форме";
    ФормаПроцесса.Обновить();
    Документ_актив = Word.ActiveDocument();

    м_Selection = Word.Selection.Range;
    мКоммент = Документ_актив.Comments.Add(м_Selection);
    //мКоммент.ShowTip = Истина;
    мКоммент.Author = "Сысоев Павел";// строка (назначает автора примечанию, чтобы можно было делать отбор примечаний по автору. Автор всегда будет выводится, а здесь задается его представление)
    //мКоммент.Date = ТекущаяДата(); // дата
    мКоммент.Initial = "Сысоев ПС"; // строка (выводит текст в шапке примечания, ограничение 9 знаков)
    мКоммент.Range.Text = НазваниеПечатнойФормы + ДопИнформация;
Исключение

КонецПопытки;

ПримерМакроса = "Sub UPN_FormSdelki()";

 

СтруктураПечатнойФормы = Новый Структура;

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| КурсыВалют.Период КАК Период,
| КурсыВалют.Курс КАК Курс
|ИЗ
| РегистрСведений.КурсыВалют КАК КурсыВалют
|ГДЕ
| КурсыВалют.Валюта В(&Валюта)
| И КурсыВалют.Период МЕЖДУ &НачПериод И &КонПериод
|
|УПОРЯДОЧИТЬ ПО
| Период";

МВалюта = Новый Массив;
МВалюта.Добавить(Справочники.Валюты.НайтиПоКоду("840"));
Запрос.УстановитьПараметр("Валюта", МВалюта);
Запрос.УстановитьПараметр("НачПериод", НачалоДня(НачПериода));
Запрос.УстановитьПараметр("КонПериод", КонецДня(КонПериода));

Результат = Запрос.Выполнить().Выбрать();
СумммаИтог = 0;
сч=1;
Пока Результат.Следующий() Цикл
СтруктураПечатнойФормы.Вставить("Период"+сч);
СтруктураПечатнойФормы.Вставить("Курс"+сч);
СтруктураПечатнойФормы.Вставить("КурсПрописью"+сч);
СтруктураПечатнойФормы.Вставить("ИтогКурс");
СтруктураПечатнойФормы.Вставить("ИтогКурсПрописью");


СтруктураПечатнойФормы["Период"+сч] = Формат(Результат.Период,"ДФ=dd.MM.yyyy");
СтруктураПечатнойФормы["Курс"+сч] = Результат.Курс;
СтруктураПечатнойФормы["КурсПрописью"+сч] = ЧислоПрописью(Результат.Курс,?(Результат.Курс=Окр(Результат.Курс),"Л = ru_RU; НД=Ложь ДП=Ложь","Л = ru_RU; ДП=Истина"),"рубль ,рубля,рублей,м,копейка,копейки,копеек,м,2");

КонецЦикла;

 

ПримерМакроса = ПримерМакроса + Символы.ПС +
"
| ' выводим примечание с информацией по сделке и печатной форме
| '
| '
| ActiveWindow.ActivePane.VerticalPercentScrolled = 0
| Selection.Comments.Add Range:=Selection.Range
| Selection.TypeText Text:= """ + "Номер сделки: Сделка " + """

| Selection.TypeParagraph
| Selection.TypeText Text:= """ + "Код печатной формы: 1" + """
| Selection.TypeParagraph
| Selection.TypeText Text:= """ + "Название печатной формы: сделка"  + """
| Selection.TypeParagraph
| Selection.TypeParagraph
| Selection.TypeParagraph
| Selection.TypeText Text:= ""Для того чтобы не печатать это примечание:""
| Selection.TypeParagraph
| Selection.TypeText Text:= ""Просто удалите его (щелкнув на нем правой клавишей мышки и выбрать """"удалить примечание"""")""
| Selection.TypeParagraph
|
| ' перейдем с примечания к тексту
| '
| Selection.EscapeKey
|
|";

 

КолвоПараметров = СтруктураПечатнойФормы.Количество();
ТекНомерПараметра = 0;

 


Для Каждого Реквизит из СтруктураПечатнойФормы Цикл

    ТекНомерПараметра = ТекНомерПараметра + 1;

    Если НЕ ТипЗнч(Реквизит.Значение) = Тип("Картинка") Тогда


        ТекстДляЗамены = СокрЛП(Реквизит.Значение);
        КолВоВхожденийПереносаСтроки = СтрЧислоВхождений(СокрЛП(Реквизит.Значение), Символы.ПС); // обрабатываем текст как (ОАО "СБЕРБАНК РОССИИ")
        Если КолВоВхожденийПереносаСтроки > 0 Тогда
            ТекстДляЗамены = СтрЗаменить(ТексДляЗамены, Символы.ПС, "^p"); //"^l"
        КонецЕсли;

        КолВоВхожденийКавычек = СтрЧислоВхождений(СокрЛП(Реквизит.Значение),""""); // обрабатываем текст как (ОАО "СБЕРБАНК РОССИИ")
        Если КолВоВхожденийКавычек > 0 Тогда
            ТекстДляЗамены = СтрЗаменить(ТекстДляЗамены, """", """""");
        КонецЕсли;


        ПримерМакроса = ПримерМакроса + Символы.ПС +
        "
        |Selection.Find.ClearFormatting
        | Selection.Find.Replacement.ClearFormatting
        | With Selection.Find
        | .Text = """ + "#"+Реквизит.Ключ+"#" + """
        | .Replacement.Text = """ + ТекстДляЗамены + """
        | .Forward = True
        | .Wrap = wdFindContinue
        | .Format = False
        | .MatchCase = False
        | .MatchWholeWord = False
        | .MatchWildcards = False
        | .MatchSoundsLike = False
        | .MatchAllWordForms = False
        | End With
        | Selection.Find.Execute Replace:=wdReplaceAll
        | ";

////КонецЕсли;

    Иначе


        ИмяФайлаКартинки = ПолучитьИмяВременногоФайла();
        Картинка =Реквизит.Значение;
        Картинка.Записать(ИмяФайлаКартинки);
        ПримерМакроса = ПримерМакроса + Символы.ПС +
        "
        |'
        |' Вставяем картинку объекта
        |'
        |'
        |Selection.Find.ClearFormatting
        |With Selection.Find
        | .Text = ""#КартинкаПланОбъекта#""
        | .Replacement.Text = ""
        | .Forward = True
        | .Wrap = wdFindContinue
        | .Format = False
        | .MatchCase = False
        | .MatchWholeWord = False
        | .MatchWildcards = False
        | .MatchSoundsLike = False
        | .MatchAllWordForms = False
        |End With
        |Selection.Find.Execute
        |Selection.InlineShapes.AddPicture FileName:= _
        |""" + ИмяФайлаКартинки + """, LinkToFile:=False, _
        | SaveWithDocument:=True
        |ActiveWindow.ActivePane.HorizontalPercentScrolled = 6
        |
        |";
    КонецЕсли;
КонецЦикла;

 

ТекстМакроса = ПримерМакроса + Символы.ПС + "End Sub";

 

VBComponents = Word.ActiveDocument.VBProject.VBComponents;
Count = VBComponents.Count();
VBComponents.Add(1);
VBComponents.Item(Count + 1).CodeModule.InsertLines(1, ТекстМакроса);
Word.Application.Run("UPN_FormSdelki");

 

Word.Caption = " " + Строка(Сделка) + " - (" + УправлениеСделками.УдалениеЛидирующихНулейВНомере(Сделка.ОбъектСтроительства.МакетыПечатныхФорм.Найти(GUID,"GUID").МодульПечатнойФормы.Код) + ") " + Сделка.ОбъектСтроительства.МакетыПечатныхФорм.Найти(GUID,"GUID").МодульПечатнойФормы.Наименование; //ActiveDocument.FullName

//Word.PrintOut(); // распечатать док

Word.Visible = 1;
Word.Activate();
Word.WindowState = 2; // wdWindowStateMinimize (с) статья _http://forum.foxclub.ru/read.php?32,177182,258927
Word.WindowState = 1; // wdWindowStateMaximize

Скачать файлы

Наименование Файл Версия Размер
Обработка 76
.epf 101,78Kb
23.07.12
76
.epf 101,78Kb Скачать
Пример (все файлы в архиве) 54
.rar 181,84Kb
23.07.12
54
.rar 181,84Kb Скачать
шаблон ворд 27
.doc 35,50Kb
23.07.12
27
.doc 35,50Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Александр Муравьев (trunix) 19.10.11 03:58
2. Иван Иванов (jko) 19.10.11 06:14
Прикольно. Скоро будем делать, что то подобное на 2007 офисе. Спасибо.
3. Владимир (ARL) 19.10.11 09:50
Полезный пример. Всегда может пригодиться.
4. Константин Матвеев (koka) 19.10.11 10:01
Спасибо. Познавательно для создания документов из 1С.
5. Галя (galyausik1) 19.10.11 10:21
С удовольствием пользуюсь вашим примером. Спасибо, познавательно.
6. Guran (ph_1984) 19.10.11 16:11
А чем ваша разработка отличается от подсистемы печати в библиотеке стандартных подсистем? В ней так же есть функция формирования документа в Word по шаблону.
7. apalon_pss (pavel_pss) 19.10.11 17:38
Guran пишет:
А чем ваша разработка отличается от подсистемы печати в библиотеке стандартных подсистем? В ней так же есть функция формирования документа в Word по шаблону.


Я не знаю, что там за функция, поэтому не знаю их разницу, но у меня была задача формировать word и я ее решил на 1с8,1 так как это сделано в этой обработке. В ней так же было решение именно добавления строки для word 2010, может в 2007 она тоже будет работать (не помню проверял или нет)
8. Gr0ck (gr0ck) 20.10.11 08:45
9. Anna Babynina (orsprog) 20.10.11 09:33
спасибо...обязательно воспользуюсь этим примером...позновательно и полезно...в ближайшем будущем пригодится
10. Владимир (Ihty) 21.10.11 13:05
11. zag2art (zag2art) 23.10.11 19:25
12. Igor Александрович (igor_1c) 25.10.11 23:26
я сейчас разрабатываю аналогичную универсальную систему систему печати MSWord из шаблонов. Для этого пришлось сделать справочник шаблонов, и обработку "Печать шаблонов" только у меня вместо # угловые скобки < >. Работает два варианта: переменные в <> и закладки. Как нить выложу свою систему, когда пройдет полный контроль на УПП. С помощью её печатают договора, доп. соглашения с таб. частью, сейчас пошли печатать кадровые документы (очень много заморочек с ними)
13. A V (ann_ver) 26.10.11 15:24
14. Нина Апр (Zya) 21.02.12 22:43
Спасибо большое за обработку

Интересует только еще один момент, в каждой ячейке таблицы после вывода #Переменных#
автоматически к тексту добавляется символ возврат каретки.
Может кто-нибудь знает, как этого избежать? А-то сильно увеличивается размер таблицы и получается неоптимальный расход бумаги..
15. apalon_pss (pavel_pss) 22.02.12 00:12
(14) Zya,
по идее такого быть не должно, если ты сама не передаешь вместе со строкой возврат каретки. Попробуй либо сокрЛП(твойТекст) попробуй отформатировать свой шаблон ворда, тоесть проверить чтобы там небыло возврата каретки. Точнее не скажу как то не обращал внимание и пользователи о подобном не говорили. Завтра при случае просмотрю у себя.
16. Аркадий Кучер (Abadonna) 23.07.12 06:54
(0) Автор, спасибо, конечно, но: попросил меня один нищеброд скачать, пришлось аж три файла качать :(
Мог бы и в один архив все засунуть.
18. apalon_pss (pavel_pss) 21.02.13 16:38
не забываем ставить плюсы