Вывод макета двоичных данных word во внешней обработке

1. ivangrant 10 06.03.20 09:47 Сейчас в теме
Вывожу двоичные данные в макет word.
Данные берутся из внешней обработки, из списка сотрудников.
Вопрос: как вывести по порядку данные нескольких сотрудников в макет? При этом при каждой обработке количество сотрудников может быть разные. То есть заранее не прописать количество пунктов в макете.
Часть макета во вложении.
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
17. ivangrant 10 18.03.20 07:04 Сейчас в теме
! Решение
Данные помещаются в ТЗ и оттуда выводятся на документ. В документе добавлена только одна закладка ( ТекстСтрокиПриказа ). Остальное выводится программно. Можно конечно было и её выводить программно, но надо было в документе отметить необходимое место, откуда добавлять закладки.
Код:
				Для Каждого Параметр Из СтруктураПараметров.Значение Цикл
					ТекстСтрокиПриказа = Строка(Параметр.Номер) + ". С ";
					СсылкаМакет.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 поручить инженеру Петрову Петру Петровичу исполнение обязанностей начальника отдела в течение установленной продолжительности рабочего дня наряду с работой, определённой трудовым договором.

Всем спасибо за подсказки.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. lehis_S 06.03.20 10:58 Сейчас в теме
Можно вот так:
		
Table = Word.ActiveDocument.Tables(1);
Для Каждого Стр Из СсылкаНаОбъект.Услуги Цикл
	Row = Table.Rows.Add();
	Row.Cells(1).Range.Text = Стр.НомерСтроки;
КонецЦикла;
11. ivangrant 10 13.03.20 12:47 Сейчас в теме
(4) у меня не ссылка на объект, а ТЗ.
И по вашему коду можно вывести только одну слово/цифру. А мне нужно вывести текст на несколько строк в разных шрифтах.
2. lehis_S 06.03.20 10:52 Сейчас в теме
Может быть использовать таблицу?
3. ivangrant 10 06.03.20 10:55 Сейчас в теме
(2) вот тоже советуют в профильном форуме таблицу использовать. Но не могу понять - каким образом?
5. v3rter 06.03.20 11:27 Сейчас в теме
Может накопить эти несколько строк в переменной (вместе с переводами строк), затем вывести и применить список (или вместо списка добавить нумерацию прямо в текст и отформатировать абзац с выступом)?
7. ivangrant 10 06.03.20 11:52 Сейчас в теме
(5) я их накапливаю в ТаблицуЗначений. И вот потом... с ними надо что-то сделать)))
8. v3rter 06.03.20 11:58 Сейчас в теме
(7) В этом же цикле создавайте готовый текст по каждой строке таблицы значений и накапливайте его в текстовую переменную, разделяя абзацы Символы.ПС. ТекстПриказа =ТекстПриказа +<готовый текст текущей строки>+Символы.ПС. После цикла в переменной будет готовый текст, просто выведете разом переменную ТекстПриказа.
9. ivangrant 10 06.03.20 12:38 Сейчас в теме
(8) Если бы я заранее знал, где вставлять Символы ПС, то сделал бы это текстовым документом и не мучался. В данном случае будут подставляться значения разной длины, посему подставлять перенос строки уже не получится.
10. v3rter 06.03.20 12:46 Сейчас в теме
(9) Не совсем понятно каким образом Ваш текст попадает в ворд, можно подробнее? У вас конвертируется табличный документ, открывается шаблон и в нём делаются средствами ворда замены шаблонных блоков текста (или полей) на Ваши, или Вы файл делаете в ворде программно с нуля целиком?
12. ivangrant 10 13.03.20 12:50 Сейчас в теме
(10) вы видите значения в квадратных скобках в прикреплённом скане? Вот эти значения и берутся из ТЗ.
У меня первый вариант - "делаются средствами ворда замены шаблонных блоков текста".
13. v3rter 13.03.20 14:52 Сейчас в теме
(12) Тут как минимум 3 варианта:

1. Сделайте в шаблоне так:
1. [ТекстСтрокиПриказа]
Сформируйте в модуле сразу большую готовую длинную строку по всем сотрудникам с энтерами и вставьте-замените [ТекстСтрокиПриказа] сразу целиком. Символы.ПС заставят 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.
14. ivangrant 10 17.03.20 07:13 Сейчас в теме
(13) у меня туго с vba. В целом понятно, но текст у меня всё равно остаётся одинаковый. А мне нужно, чтобы часть слов была выделена ЖИРНЫМ шрифтом. Смысл мне накапливать всё в одну переменную, если я с таким успехом мог всё поместить в текст в шаблоне по отдельности?
15. ivangrant 10 17.03.20 08:10 Сейчас в теме
(13) Вот так получилось записать строку в переменную и завернуть в структуру.
______________________
Для Каждого СтрокаТЧ Из ЗамещениеСотрудников Цикл
ДанныеЗамещающихСотрудниковВТаблицуЗначений = КадровыйУчет.КадровыеДанныеСотрудников(Истина, ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СтрокаТЧ.ЗамещающийСотрудникФИО), "Должность", ДокОбъект.ДатаДокумента);
Для Каждого ЗамещающийСотрудник Из ДанныеЗамещающихСотрудниковВТаблицуЗначений Цикл
ЗамещающийСотрудникДолжность = ЗамещающийСотрудник.Должность;
ЗамещающийСотрудникФИО = ЗамещающийСотрудник.Сотрудник;
КонецЦикла;

ЗамещающийСотрудникДолжностьдп = ПадежП(ЗамещающийСотрудникДолжность, 3, Неопределено);
ЗамещающийСотрудникФИОдп = Неопределено;
ФизическиеЛицаЗарплатаКадры.Просклонять(Строка(ЗамещающийСотрудникФИО), 3, ЗамещающийСотрудникФИОдп, ЗамещающийСотрудникФИО.ФизическоеЛицо.Пол, ЗамещающийСотрудникФИО.ФизическоеЛицо);
Номер = 1;
ДатаНачала = ?(СтрокаТЧ.ДатаНачала = Неопределено, "___________", СтрокаТЧ.ДатаНачала);
ДатаОкончания = ?(СтрокаТЧ.ДатаОкончания = Неопределено, "___________", СтрокаТЧ.ДатаОкончания);
ЗамещающийСотрудникДолжностьдп = ?(ЗамещающийСотрудникДолжностьдп = Неопределено, "_________________________ (должность)", ЗамещающийСотрудникДолжностьдп);
ЗамещающийСотрудникФИОдп = ?(ЗамещающийСотрудникФИОдп = Неопределено, "_______________________________________ (ФИО)", ЗамещающийСотрудникФИОдп);
ЗамещаемыйСотрудникДолжностьрп = ?(СтруктураВсегоДокумента.ТекстЗамещаемыйСотрудникДолжностьрп = Неопределено, "_________________________ (должность)", СтруктураВсегоДокумента.ТекстЗамещаемыйСотрудникДолжностьрп);

ТекстСтрокиПриказа = Номер + ". С" + ДатаНачала + " по " + ДатаОкончания + " поручить " + ЗамещающийСотрудникДолжностьдп + ЗамещающийСотрудникФИОдп
+ " исполнение обязанностей " + ЗамещаемыйСотрудникДолжностьрп + " в течение установленной продолжительности рабочего дня наряду с работой, определеённой трудовым договором." + Символы.ПС;

СтруктураВсегоДокумента.Вставить("ТекстСтрокиПриказа" + Номер, ТекстСтрокиПриказа);
КонецЦикла;
_______________________
А дальше не могу сообразить. Вроде же так надо делать:
________
Замена = ШаблонВорд.Content.Find;
Замена.Execute("<Параметр>", Ложь, Истина, Ложь, Ложь, , Истина, , Ложь, "ПОЛУЧИЛОСЬ!", 2);
________
Но. Как мне весь текст отформатировать и нужные слова выделить жирным шрифтом, пока не могу сообразить.
18. v3rter 18.03.20 13:23 Сейчас в теме
(15) Я тоже не силен в VBA. Если есть список нужных слов, то можно их сделать жирными той же заменой, добавив
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Font.Bold = True

.Text = "слово"
.Replacement.Text = ""

и установив в Find.Execute девятый параметр в True, но похоже проблему уже решили другим способом.
6. Aitbay 06.03.20 11:43 Сейчас в теме
не понял суть задачи, но было 1 раз необходимо было в приказ вывести список сотрудников хотя в шаблоне ворда это был 1 параметр, вышел из ситуации заменой стрЗаменить("[ФиоСотрудника]", СтрСоединить(массивФио, ","))
16. ivangrant 10 17.03.20 13:50 Сейчас в теме
Пока получилось вот так:
				Для Каждого Параметр Из СтруктураПараметров.Значение Цикл
					ТекстСтрокиПриказа = Строка(Параметр.Номер) + ". С [ДатаНачала] по [ДатаОкончания] поручить [ЗамещающийСотрудникДолжностьдп] [ЗамещающийСотрудникФИОдп] исполнение обязанностей [ЗамещаемыйСотрудникДолжностьрп] в течение установленной продолжительности рабочего дня наряду с работой, определеённой трудовым договором." + Символы.ПС;
					СсылкаМакет.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инженеру Иванову Ивану Ивановичуначальника отдела
________________________
Что ещё поправить можно?
17. ivangrant 10 18.03.20 07:04 Сейчас в теме
! Решение
Данные помещаются в ТЗ и оттуда выводятся на документ. В документе добавлена только одна закладка ( ТекстСтрокиПриказа ). Остальное выводится программно. Можно конечно было и её выводить программно, но надо было в документе отметить необходимое место, откуда добавлять закладки.
Код:
				Для Каждого Параметр Из СтруктураПараметров.Значение Цикл
					ТекстСтрокиПриказа = Строка(Параметр.Номер) + ". С ";
					СсылкаМакет.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 поручить инженеру Петрову Петру Петровичу исполнение обязанностей начальника отдела в течение установленной продолжительности рабочего дня наряду с работой, определённой трудовым договором.

Всем спасибо за подсказки.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот