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




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

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

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

 

Вариант 2:

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

Внимание:

  • при использовании данного варианта необходимо зайти в word включить работу vba (word 2010) см. картинку //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 Тогда
ТекстДляЗамены = СтрЗаменить(ТексДляЗамены, Символы.ПС, "#k8SjZc9Dxkp"); //"#k8SjZc9Dxkl"
КонецЕсли;

КолВоВхожденийКавычек = СтрЧислоВхождений(СокрЛП(Реквизит.Значение),""""); // обрабатываем текст как (ОАО "СБЕРБАНК РОССИИ")
Если КолВоВхожденийКавычек > 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

17 Comments

  1. trunix

    Надо попробовать.

    Reply
  2. jko

    Прикольно. Скоро будем делать, что то подобное на 2007 офисе. Спасибо.

    Reply
  3. ARL

    Полезный пример. Всегда может пригодиться.

    Reply
  4. koka

    Спасибо. Познавательно для создания документов из 1С.

    Reply
  5. galyausik1

    С удовольствием пользуюсь вашим примером. Спасибо, познавательно.

    Reply
  6. ph_1984

    А чем ваша разработка отличается от подсистемы печати в библиотеке стандартных подсистем? В ней так же есть функция формирования документа в Word по шаблону.

    Reply
  7. pavel_pss
    Guran пишет:

    А чем ваша разработка отличается от подсистемы печати в библиотеке стандартных подсистем? В ней так же есть функция формирования документа в Word по шаблону.

    Я не знаю, что там за функция, поэтому не знаю их разницу, но у меня была задача формировать word и я ее решил на 1с8,1 так как это сделано в этой обработке. В ней так же было решение именно добавления строки для word 2010, может в 2007 она тоже будет работать (не помню проверял или нет)

    Reply
  8. gr0ck

    Надо будет посмотреть

    Reply
  9. orsprog

    спасибо…обязательно воспользуюсь этим примером…позновательно и полезно…в ближайшем будущем пригодится

    Reply
  10. Ihty

    Супер. Мне понравилось.

    Reply
  11. zag2art

    (10) +100 присоединяюсь

    Reply
  12. igor_1c

    я сейчас разрабатываю аналогичную универсальную систему систему печати MSWord из шаблонов. Для этого пришлось сделать справочник шаблонов, и обработку «Печать шаблонов» только у меня вместо # угловые скобки < >. Работает два варианта: переменные в <> и закладки. Как нить выложу свою систему, когда пройдет полный контроль на УПП. С помощью её печатают договора, доп. соглашения с таб. частью, сейчас пошли печатать кадровые документы (очень много заморочек с ними)

    Reply
  13. ann_ver

    спасибо большое

    Reply
  14. Zya

    Спасибо большое за обработку

    Интересует только еще один момент, в каждой ячейке таблицы после вывода #Переменных#

    автоматически к тексту добавляется символ возврат каретки.

    Может кто-нибудь знает, как этого избежать? А-то сильно увеличивается размер таблицы и получается неоптимальный расход бумаги..

    Reply
  15. pavel_pss

    (14) Zya,

    по идее такого быть не должно, если ты сама не передаешь вместе со строкой возврат каретки. Попробуй либо сокрЛП(твойТекст) попробуй отформатировать свой шаблон ворда, тоесть проверить чтобы там небыло возврата каретки. Точнее не скажу как то не обращал внимание и пользователи о подобном не говорили. Завтра при случае просмотрю у себя.

    Reply
  16. Abadonna

    (0) Автор, спасибо, конечно, но: попросил меня один нищеброд скачать, пришлось аж три файла качать 🙁

    Мог бы и в один архив все засунуть.

    Reply
  17. pavel_pss

    не забываем ставить плюсы

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *