Вывожу двоичные данные в макет word.
Данные берутся из внешней обработки, из списка сотрудников.
Вопрос: как вывести по порядку данные нескольких сотрудников в макет? При этом при каждой обработке количество сотрудников может быть разные. То есть заранее не прописать количество пунктов в макете.
Часть макета во вложении.
! Решение Данные помещаются в ТЗ и оттуда выводятся на документ. В документе добавлена только одна закладка ( ТекстСтрокиПриказа ). Остальное выводится программно. Можно конечно было и её выводить программно, но надо было в документе отметить необходимое место, откуда добавлять закладки.
Код:
Для Каждого Параметр Из СтруктураПараметров.Значение Цикл
ТекстСтрокиПриказа = Строка(Параметр.Номер) + ". С ";
СсылкаМакет.Bookmarks("ТекстСтрокиПриказа").Select();
СсылкаМакет.Application.Selection.TypeText(ТекстСтрокиПриказа);
СсылкаМакет.Bookmarks.Add("ДатаНачала", Word.Application.Selection.Range());
СсылкаМакет.Bookmarks("ДатаНачала").Select();
СсылкаМакет.Application.Selection.BoldRun();
СсылкаМакет.Application.Selection.TypeText(Параметр.ДатаНачала);
СсылкаМакет.Bookmarks.Add("по", Word.Application.Selection.Range());
СсылкаМакет.Bookmarks("по").Select();
СсылкаМакет.Application.Selection.BoldRun();
СсылкаМакет.Application.Selection.TypeText(" по ");
СсылкаМакет.Bookmarks.Add("ДатаОкончания", Word.Application.Selection.Range());
СсылкаМакет.Bookmarks("ДатаОкончания").Select();
СсылкаМакет.Application.Selection.BoldRun();
СсылкаМакет.Application.Selection.TypeText(Параметр.ДатаОкончания);
СсылкаМакет.Bookmarks.Add("поручить", Word.Application.Selection.Range());
СсылкаМакет.Bookmarks("поручить").Select();
СсылкаМакет.Application.Selection.BoldRun();
СсылкаМакет.Application.Selection.TypeText(" поручить ");
СсылкаМакет.Bookmarks.Add("ЗамещающийСотрудникДолжностьдп", Word.Application.Selection.Range());
СсылкаМакет.Bookmarks("ЗамещающийСотрудникДолжностьдп").Select();
СсылкаМакет.Application.Selection.TypeText(Параметр.ЗамещающийСотрудникДолжностьдп + " ");
СсылкаМакет.Bookmarks.Add("ЗамещающийСотрудникФИОдп", Word.Application.Selection.Range());
СсылкаМакет.Bookmarks("ЗамещающийСотрудникФИОдп").Select();
СсылкаМакет.Application.Selection.BoldRun();
СсылкаМакет.Application.Selection.TypeText(Параметр.ЗамещающийСотрудникФИОдп);
СсылкаМакет.Bookmarks.Add("исполнениеобязанностей", Word.Application.Selection.Range());
СсылкаМакет.Bookmarks("исполнениеобязанностей").Select();
СсылкаМакет.Application.Selection.BoldRun();
СсылкаМакет.Application.Selection.TypeText(" исполнение обязанностей ");
СсылкаМакет.Bookmarks.Add("ЗамещаемыйСотрудникДолжностьрп", Word.Application.Selection.Range());
СсылкаМакет.Bookmarks("ЗамещаемыйСотрудникДолжностьрп").Select();
СсылкаМакет.Application.Selection.TypeText(Параметр.ЗамещаемыйСотрудникДолжностьрп + " в течение установленной продолжительности рабочего дня наряду с работой, определённой трудовым договором." + Символы.ПС);
СсылкаМакет.Bookmarks.Add("ТекстСтрокиПриказа", Word.Application.Selection.Range());
КонецЦикла;
Показать
_____
Итог:
1. С 18.03.2020 по 20.03.2020 поручить ведущему инженеру Иванову Ивану Ивановичу исполнение обязанностей начальника отдела в течение установленной продолжительности рабочего дня наряду с работой, определённой трудовым договором.
2. С 25.03.2020 по 27.03.2020 поручить инженеру Петрову Петру Петровичу исполнение обязанностей начальника отдела в течение установленной продолжительности рабочего дня наряду с работой, определённой трудовым договором.
Table = Word.ActiveDocument.Tables(1);
Для Каждого Стр Из СсылкаНаОбъект.Услуги Цикл
Row = Table.Rows.Add();
Row.Cells(1).Range.Text = Стр.НомерСтроки;
КонецЦикла;
(4) у меня не ссылка на объект, а ТЗ.
И по вашему коду можно вывести только одну слово/цифру. А мне нужно вывести текст на несколько строк в разных шрифтах.
Может накопить эти несколько строк в переменной (вместе с переводами строк), затем вывести и применить список (или вместо списка добавить нумерацию прямо в текст и отформатировать абзац с выступом)?
(7) В этом же цикле создавайте готовый текст по каждой строке таблицы значений и накапливайте его в текстовую переменную, разделяя абзацы Символы.ПС. ТекстПриказа =ТекстПриказа +<готовый текст текущей строки>+Символы.ПС. После цикла в переменной будет готовый текст, просто выведете разом переменную ТекстПриказа.
(8) Если бы я заранее знал, где вставлять Символы ПС, то сделал бы это текстовым документом и не мучался. В данном случае будут подставляться значения разной длины, посему подставлять перенос строки уже не получится.
(9) Не совсем понятно каким образом Ваш текст попадает в ворд, можно подробнее? У вас конвертируется табличный документ, открывается шаблон и в нём делаются средствами ворда замены шаблонных блоков текста (или полей) на Ваши, или Вы файл делаете в ворде программно с нуля целиком?
(10) вы видите значения в квадратных скобках в прикреплённом скане? Вот эти значения и берутся из ТЗ.
У меня первый вариант - "делаются средствами ворда замены шаблонных блоков текста".
Сформируйте в модуле сразу большую готовую длинную строку по всем сотрудникам с энтерами и вставьте-замените [ТекстСтрокиПриказа] сразу целиком. Символы.ПС заставят Word автоматически сделать следующие элементы списка (2,3,4,...). Недостаток - шаблон строки будет храниться в коде, а не в шаблоне.
2. Заверните строку приказа в другие скобки, например
1. {C [] по [] приказываю....}
, найдите текст в скобках поиском по шаблону \{*\} (Wildcards - четвертый параметр .Execute - Истина ( https://docs.microsoft.com/ru-ru/office/vba/api/word.find.execute ) , вытащите найденный текст через Selection, а дальше - накапливайте и заменяйте через СтрЗаменить в локальной переменной циклом как в п.1., сотрите Selection и в это же место вставьте накопленную строку.
3. Сделайте в конце строки приказа параметр [СледующийЭлемент]. По необходимости заменяйте его Enter + ещё одну полную строку с шаблоном. Недостаток - как в п.1.
(13) у меня туго с vba. В целом понятно, но текст у меня всё равно остаётся одинаковый. А мне нужно, чтобы часть слов была выделена ЖИРНЫМ шрифтом. Смысл мне накапливать всё в одну переменную, если я с таким успехом мог всё поместить в текст в шаблоне по отдельности?
(13) Вот так получилось записать строку в переменную и завернуть в структуру.
______________________
Для Каждого СтрокаТЧ Из ЗамещениеСотрудников Цикл
ДанныеЗамещающихСотрудниковВТаблицуЗначений = КадровыйУчет.КадровыеДанныеСотрудников(Истина, ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СтрокаТЧ.ЗамещающийСотрудникФИО), "Должность", ДокОбъект.ДатаДокумента);
Для Каждого ЗамещающийСотрудник Из ДанныеЗамещающихСотрудниковВТаблицуЗначений Цикл
ЗамещающийСотрудникДолжность = ЗамещающийСотрудник.Должность;
ЗамещающийСотрудникФИО = ЗамещающийСотрудник.Сотрудник;
КонецЦикла;
ТекстСтрокиПриказа = Номер + ". С" + ДатаНачала + " по " + ДатаОкончания + " поручить " + ЗамещающийСотрудникДолжностьдп + ЗамещающийСотрудникФИОдп
+ " исполнение обязанностей " + ЗамещаемыйСотрудникДолжностьрп + " в течение установленной продолжительности рабочего дня наряду с работой, определеённой трудовым договором." + Символы.ПС;
СтруктураВсегоДокумента.Вставить("ТекстСтрокиПриказа" + Номер, ТекстСтрокиПриказа);
КонецЦикла;
_______________________
А дальше не могу сообразить. Вроде же так надо делать:
________
Замена = ШаблонВорд.Content.Find;
Замена.Execute("<Параметр>", Ложь, Истина, Ложь, Ложь, , Истина, , Ложь, "ПОЛУЧИЛОСЬ!", 2);
________
Но. Как мне весь текст отформатировать и нужные слова выделить жирным шрифтом, пока не могу сообразить.
(15) Я тоже не силен в VBA. Если есть список нужных слов, то можно их сделать жирными той же заменой, добавив
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Font.Bold = True
.Text = "слово"
.Replacement.Text = ""
и установив в Find.Execute девятый параметр в True, но похоже проблему уже решили другим способом.
не понял суть задачи, но было 1 раз необходимо было в приказ вывести список сотрудников хотя в шаблоне ворда это был 1 параметр, вышел из ситуации заменой стрЗаменить("[ФиоСотрудника]", СтрСоединить(массивФио, ","))
Для Каждого Параметр Из СтруктураПараметров.Значение Цикл
ТекстСтрокиПриказа = Строка(Параметр.Номер) + ". С [ДатаНачала] по [ДатаОкончания] поручить [ЗамещающийСотрудникДолжностьдп] [ЗамещающийСотрудникФИОдп] исполнение обязанностей [ЗамещаемыйСотрудникДолжностьрп] в течение установленной продолжительности рабочего дня наряду с работой, определеённой трудовым договором." + Символы.ПС;
СсылкаМакет.Bookmarks("ТекстСтрокиПриказа").Select();
СсылкаМакет.Application.Selection.TypeText(ТекстСтрокиПриказа);
СсылкаМакет.Bookmarks.Add("ДатаНачала", Word.Application.Selection.Range());
СсылкаМакет.Bookmarks("ДатаНачала").Select();
СсылкаМакет.Application.Selection.BoldRun();
СсылкаМакет.Application.Selection.TypeText(Параметр.ДатаНачала);
СсылкаМакет.Bookmarks.Add("ДатаОкончания", Word.Application.Selection.Range());
СсылкаМакет.Bookmarks("ДатаОкончания").Select();
СсылкаМакет.Application.Selection.BoldRun();
СсылкаМакет.Application.Selection.TypeText(Параметр.ДатаОкончания);
СсылкаМакет.Bookmarks.Add("ЗамещающийСотрудникДолжностьдп", Word.Application.Selection.Range());
СсылкаМакет.Bookmarks("ЗамещающийСотрудникДолжностьдп").Select();
СсылкаМакет.Application.Selection.BoldRun();
СсылкаМакет.Application.Selection.TypeText(Параметр.ЗамещающийСотрудникДолжностьдп);
СсылкаМакет.Bookmarks.Add("ЗамещающийСотрудникФИОдп", Word.Application.Selection.Range());
СсылкаМакет.Bookmarks("ЗамещающийСотрудникФИОдп").Select();
СсылкаМакет.Application.Selection.BoldRun();
СсылкаМакет.Application.Selection.TypeText(Параметр.ЗамещающийСотрудникФИОдп);
СсылкаМакет.Bookmarks.Add("ЗамещаемыйСотрудникДолжностьрп", Word.Application.Selection.Range());
СсылкаМакет.Bookmarks("ЗамещаемыйСотрудникДолжностьрп").Select();
СсылкаМакет.Application.Selection.BoldRun();
СсылкаМакет.Application.Selection.TypeText(Параметр.ЗамещаемыйСотрудникДолжностьрп);
КонецЦикла;
Показать
Но при двух строках в ТЗ, выходит вот такая каша(20.03.2020 и Иванову Ивану Ивановичу - в документе выделено полужирным шрифтом):
_________________________
1. С [ДатаНачала] по [ДатаОкончания] поручить [ЗамещающийСотрудникДолжностьдп] [ЗамещающийСотрудникФИОдп] исполнение обязанностей [ЗамещаемыйСотрудникДолжностьрп] в течение установленной продолжительности рабочего дня наряду с работой, определеённой трудовым договором.
17.03.202020.03.2020инженеру Иванову Ивану Ивановичуначальника отдела
________________________
Что ещё поправить можно?
! Решение Данные помещаются в ТЗ и оттуда выводятся на документ. В документе добавлена только одна закладка ( ТекстСтрокиПриказа ). Остальное выводится программно. Можно конечно было и её выводить программно, но надо было в документе отметить необходимое место, откуда добавлять закладки.
Код:
Для Каждого Параметр Из СтруктураПараметров.Значение Цикл
ТекстСтрокиПриказа = Строка(Параметр.Номер) + ". С ";
СсылкаМакет.Bookmarks("ТекстСтрокиПриказа").Select();
СсылкаМакет.Application.Selection.TypeText(ТекстСтрокиПриказа);
СсылкаМакет.Bookmarks.Add("ДатаНачала", Word.Application.Selection.Range());
СсылкаМакет.Bookmarks("ДатаНачала").Select();
СсылкаМакет.Application.Selection.BoldRun();
СсылкаМакет.Application.Selection.TypeText(Параметр.ДатаНачала);
СсылкаМакет.Bookmarks.Add("по", Word.Application.Selection.Range());
СсылкаМакет.Bookmarks("по").Select();
СсылкаМакет.Application.Selection.BoldRun();
СсылкаМакет.Application.Selection.TypeText(" по ");
СсылкаМакет.Bookmarks.Add("ДатаОкончания", Word.Application.Selection.Range());
СсылкаМакет.Bookmarks("ДатаОкончания").Select();
СсылкаМакет.Application.Selection.BoldRun();
СсылкаМакет.Application.Selection.TypeText(Параметр.ДатаОкончания);
СсылкаМакет.Bookmarks.Add("поручить", Word.Application.Selection.Range());
СсылкаМакет.Bookmarks("поручить").Select();
СсылкаМакет.Application.Selection.BoldRun();
СсылкаМакет.Application.Selection.TypeText(" поручить ");
СсылкаМакет.Bookmarks.Add("ЗамещающийСотрудникДолжностьдп", Word.Application.Selection.Range());
СсылкаМакет.Bookmarks("ЗамещающийСотрудникДолжностьдп").Select();
СсылкаМакет.Application.Selection.TypeText(Параметр.ЗамещающийСотрудникДолжностьдп + " ");
СсылкаМакет.Bookmarks.Add("ЗамещающийСотрудникФИОдп", Word.Application.Selection.Range());
СсылкаМакет.Bookmarks("ЗамещающийСотрудникФИОдп").Select();
СсылкаМакет.Application.Selection.BoldRun();
СсылкаМакет.Application.Selection.TypeText(Параметр.ЗамещающийСотрудникФИОдп);
СсылкаМакет.Bookmarks.Add("исполнениеобязанностей", Word.Application.Selection.Range());
СсылкаМакет.Bookmarks("исполнениеобязанностей").Select();
СсылкаМакет.Application.Selection.BoldRun();
СсылкаМакет.Application.Selection.TypeText(" исполнение обязанностей ");
СсылкаМакет.Bookmarks.Add("ЗамещаемыйСотрудникДолжностьрп", Word.Application.Selection.Range());
СсылкаМакет.Bookmarks("ЗамещаемыйСотрудникДолжностьрп").Select();
СсылкаМакет.Application.Selection.TypeText(Параметр.ЗамещаемыйСотрудникДолжностьрп + " в течение установленной продолжительности рабочего дня наряду с работой, определённой трудовым договором." + Символы.ПС);
СсылкаМакет.Bookmarks.Add("ТекстСтрокиПриказа", Word.Application.Selection.Range());
КонецЦикла;
Показать
_____
Итог:
1. С 18.03.2020 по 20.03.2020 поручить ведущему инженеру Иванову Ивану Ивановичу исполнение обязанностей начальника отдела в течение установленной продолжительности рабочего дня наряду с работой, определённой трудовым договором.
2. С 25.03.2020 по 27.03.2020 поручить инженеру Петрову Петру Петровичу исполнение обязанностей начальника отдела в течение установленной продолжительности рабочего дня наряду с работой, определённой трудовым договором.