|
Генерация файлов WORD | ☑ | ||
---|---|---|---|---|
0
Дожа
14.12.16
✎
13:43
|
Здравствуйте.
Подскажите пожалуйста, что то не получается ни как. Есть список сотрудников, обходя которых, заполняю по ним вордовский макет. Потом вывожу. Выводятся кучей документов ворд, равной количеству сотрудников в цикле. Как бы склеить все макеты в 1 файл? Пока ВыборкаДетальныеЗаписи.Следующий() Цикл ПолучитьМакет("Макет"); ОбъектWord = Договор.Получить(); ДокументWord = ОбъектWord.Application.Documents(1); ДокументWord.Activate(); //Тут заполняю макет КонецЦикла; ДокументWord.Application.Visible=Истина; ДокументWord.Activate(); |
|||
1
Cool_Profi
14.12.16
✎
13:44
|
А может, макет получать до цикла, один раз?
Хотя чего это я бред несу... |
|||
2
Дожа
14.12.16
✎
13:45
|
(1) если макет 1 раз, то как его потом заполнять?
ТекстПоиска = "<дата рождения>"; ТекстЗамены = ВыборкаДетальныеЗаписи.Ссылка.Физлицо.ДатаРождения; Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); |
|||
3
Дожа
14.12.16
✎
13:47
|
Есть возможность копировать данные из дока и вставлять их в предыдущий док?
|
|||
4
Дожа
14.12.16
✎
13:55
|
Нашел такую тему:
Макет = ПолучитьМакет("Макет"); // Получить объект из макета. MSWord = Макет.Получить(); Документ = MSWord.Application.Documents(1); Документ.Activate(); // копируем содержимое Документ.Content.Copy(); // встаем в начало документа Документ = MSWord.Range(0,0); Выборка = СформироватьЗапросДляПечати("ПоТабличнойЧастиДокумента").Выбрать(); Индекс = 0; Пока Выборка.Следующий() Цикл Индекс = Индекс + 1; Если Индекс > 1 Тогда // вторая и последующие итерации // встаем в начало документа Документ = MSWord.Range(0,0); // вставляем разрыв страницы Документ.InsertBreak(); //опять встаем в начало документа (перед разрывом) Документ = MSWord.Range(0,0); // вставляем содержимое буфера Документ.Paste(); КонецЕсли; Сотрудник = Выборка.Сотрудник; // заполнение параметров ... КонецЦикла; |
|||
5
Дожа
14.12.16
✎
13:56
|
Но не совсем понятно как тут заполнять параметры....
|
|||
6
Масянька
14.12.16
✎
14:00
|
(5) В шаблоне Word:
[ПечПокупатель], именуемый в дальнейшем Заказчик (это - как пример). В коде заполнения параметров: мПокупатель = СокрЛП(ТекущийЭлемент().Владелец.ЮрФизЛицо.ПолнНаименование); мОбъект.Find.Execute("[ПечПокупатель]",0,0,,,,,,,СокрЛП(мПокупатель),2); |
|||
7
Масянька
14.12.16
✎
14:01
|
+ (6) Код - семерочный.
|
|||
8
Дожа
14.12.16
✎
14:03
|
(6)
У меня реализованно так: ТекстПоиска = "<адрес по прописке>"; ТекстЗамены = ВыборкаДетальныеЗаписи.Представление; Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); Но это при условии что я макет получаю в каждом цикле. А если как я привел пример в сообщении 4, то там такое уже не сработает, но как я понимаю, макеты ворд будут в одном файле. |
|||
9
Дожа
14.12.16
✎
14:22
|
Так как можно получить один макет, перезаполнять его в цикле и потом вывести его в 1 файл?) Есть готовый пример у кого то или хотя бы изложить описанием как реализовать это?
|
|||
10
mikecool
14.12.16
✎
14:26
|
если не получится с одним документом - формируй один док итоговый, шаблоны заполняй по каждому сотруднику, а затем программно копи-пастируй в результирующий док
так может быстрее быть, нежели будешь голову ломать |
|||
11
Nolan
14.12.16
✎
15:26
|
(0) а можешь скинуть полностью текст твоей процедуры?
|
|||
12
Nolan
14.12.16
✎
15:27
|
(11) я сейчас подобную задачу делаю, есть модуль УправлениеПечатьюКлиент там все для работы с ворд, можно с ним попробовать.
|
|||
13
Дожа
14.12.16
✎
15:35
|
(11)
Процедура КнопкаВыполнитьНажатие(Кнопка) Для каждого Строка из ТЧПодразделения цикл Если Строка.Выбран тогда ДатаУвольнения = Дата(1000,01,01,01,01,01); ПодразделениеОрганизации = строка.Подразделения; Вид = справочники.ВидыКонтактнойИнформации.НайтиПоКоду("00002"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ разрешенные | ПаспортныеДанныеФизЛицСрезПоследних.ФизЛицо, | ПаспортныеДанныеФизЛицСрезПоследних.ДокументСерия, | ПаспортныеДанныеФизЛицСрезПоследних.ДокументНомер, | ПаспортныеДанныеФизЛицСрезПоследних.ДокументДатаВыдачи, | ПаспортныеДанныеФизЛицСрезПоследних.ДокументКемВыдан |ПОМЕСТИТЬ ВТПаспорта |ИЗ | РегистрСведений.ПаспортныеДанныеФизЛиц.СрезПоследних КАК ПаспортныеДанныеФизЛицСрезПоследних |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ разрешенные | КонтактнаяИнформация.Представление, | КонтактнаяИнформация.Объект |ПОМЕСТИТЬ ВТАдреса |ИЗ | РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация |ГДЕ | КонтактнаяИнформация.Вид = &Вид |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ разрешенные | СотрудникиОрганизаций.Ссылка, | ВТАдреса.Представление, | ВТПаспорта.ДокументСерия, | ВТПаспорта.ДокументНомер, | ВТПаспорта.ДокументДатаВыдачи, | ВТПаспорта.ДокументКемВыдан |ИЗ | Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций | ЛЕВОЕ СОЕДИНЕНИЕ ВТАдреса КАК ВТАдреса | ПО СотрудникиОрганизаций.Физлицо = ВТАдреса.Объект | ЛЕВОЕ СОЕДИНЕНИЕ ВТПаспорта КАК ВТПаспорта | ПО СотрудникиОрганизаций.Физлицо = ВТПаспорта.ФизЛицо |ГДЕ | СотрудникиОрганизаций.ПодразделениеОрганизации = &ПодразделениеОрганизации | И СотрудникиОрганизаций.ДатаУвольнения < &ДатаУвольнения"; Запрос.УстановитьПараметр("ДатаУвольнения", ДатаУвольнения); Запрос.УстановитьПараметр("ПодразделениеОрганизации", ПодразделениеОрганизации); Запрос.УстановитьПараметр("Вид", Вид); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); ТТЕСТ = ПолучитьМакет("МакетРЕГ"); Индекс = 0; //Получить макет. Если Регионы тогда Договор = ПолучитьМакет("МакетРЕГ"); Иначе Договор = ПолучитьМакет("МакетМСК"); КонецЕсли; ОбъектWord = Договор.Получить(); ДокументWord = ОбъектWord.Application.Documents(1); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Если индекс > 0 тогда ДокументWord.content.Copy(); КонецЕсли; //Получить макет. Если Регионы тогда Договор = ПолучитьМакет("МакетРЕГ"); Иначе Договор = ПолучитьМакет("МакетМСК"); КонецЕсли; ОбъектWord = Договор.Получить(); ДокументWord = ОбъектWord.Application.Documents(1); //ДокументWord.Activate(); //Макет получен. Обрабатываем параметры. ТекстПоиска = "<номер трудового договора>"; ТекстЗамены = ВыборкаДетальныеЗаписи.Ссылка.НомерДоговора; Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); ТекстПоиска = "<дата трудового договора>"; ТекстЗамены = ВыборкаДетальныеЗаписи.Ссылка.ДатаДоговора; Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); ТекстПоиска = "<дата дополнительного соглашения>"; ТекстЗамены = Формат(текущаядата(), "ДЛФ=Д"); Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); //Заполнить 4 фамилии ТекстПоиска = "<фамилия имя отчество сотрудника>"; ТекстЗамены = Строка(ВыборкаДетальныеЗаписи.Ссылка.Физлицо); Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); ТекстПоиска = "<фамилия имя отчество сотрудника>"; ТекстЗамены = Строка(ВыборкаДетальныеЗаписи.Ссылка.Физлицо); Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); ТекстПоиска = "<фамилия имя отчество сотрудника>"; ТекстЗамены = Строка(ВыборкаДетальныеЗаписи.Ссылка.Физлицо); Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); ТекстПоиска = "<фамилия имя отчество сотрудника>"; ТекстЗамены = Строка(ВыборкаДетальныеЗаписи.Ссылка.Физлицо); Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); ТекстПоиска = "<дата рождения>"; ТекстЗамены = ВыборкаДетальныеЗаписи.Ссылка.Физлицо.ДатаРождения; Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); ТекстПоиска = "<адрес по прописке>"; ТекстЗамены = ВыборкаДетальныеЗаписи.Представление; Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); ТекстПоиска = "<серия паспорта>"; ТекстЗамены = ВыборкаДетальныеЗаписи.ДокументСерия; Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); ТекстПоиска = "<номер паспорта>"; ТекстЗамены = ВыборкаДетальныеЗаписи.ДокументНомер; Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); ТекстПоиска = "<дата выдачи паспорта>"; ТекстЗамены = ВыборкаДетальныеЗаписи.ДокументДатаВыдачи; Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); ТекстПоиска = "<орган выдавший паспорт>"; ТекстЗамены = ВыборкаДетальныеЗаписи.ДокументКемВыдан; Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); //Вывод ДокументWord.Paste(); КонецЦикла; КонецЕсли; КонецЦикла; ДокументWord.Application.Visible=Истина; ДокументWord.Activate(); КонецПроцедуры Процедура ЗаполнитьПодразделенияНажатие(Элемент) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ разрешенные | ПодразделенияОрганизаций.Ссылка КАК Подразделения, | ПодразделенияОрганизаций.Владелец КАК Организация |ИЗ | Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций | |УПОРЯДОЧИТЬ ПО | Организация, | Подразделения"; ВТПодразделения = Запрос.Выполнить().Выгрузить(); ТЧПодразделения.Очистить(); ТЧПодразделения.Загрузить(ВТПодразделения); КонецПроцедуры |
|||
14
Дожа
14.12.16
✎
15:36
|
(11) Ой не то...
Тут я уже наколбасил непонятного. Работяющий вариант вот: Процедура КнопкаВыполнитьНажатие(Кнопка) Для каждого Строка из ТЧПодразделения цикл Если Строка.Выбран тогда ДатаУвольнения = Дата(1000,01,01,01,01,01); ПодразделениеОрганизации = строка.Подразделения; Вид = справочники.ВидыКонтактнойИнформации.НайтиПоКоду("00002"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ разрешенные | ПаспортныеДанныеФизЛицСрезПоследних.ФизЛицо, | ПаспортныеДанныеФизЛицСрезПоследних.ДокументСерия, | ПаспортныеДанныеФизЛицСрезПоследних.ДокументНомер, | ПаспортныеДанныеФизЛицСрезПоследних.ДокументДатаВыдачи, | ПаспортныеДанныеФизЛицСрезПоследних.ДокументКемВыдан |ПОМЕСТИТЬ ВТПаспорта |ИЗ | РегистрСведений.ПаспортныеДанныеФизЛиц.СрезПоследних КАК ПаспортныеДанныеФизЛицСрезПоследних |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ разрешенные | КонтактнаяИнформация.Представление, | КонтактнаяИнформация.Объект |ПОМЕСТИТЬ ВТАдреса |ИЗ | РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация |ГДЕ | КонтактнаяИнформация.Вид = &Вид |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ разрешенные | СотрудникиОрганизаций.Ссылка, | ВТАдреса.Представление, | ВТПаспорта.ДокументСерия, | ВТПаспорта.ДокументНомер, | ВТПаспорта.ДокументДатаВыдачи, | ВТПаспорта.ДокументКемВыдан |ИЗ | Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций | ЛЕВОЕ СОЕДИНЕНИЕ ВТАдреса КАК ВТАдреса | ПО СотрудникиОрганизаций.Физлицо = ВТАдреса.Объект | ЛЕВОЕ СОЕДИНЕНИЕ ВТПаспорта КАК ВТПаспорта | ПО СотрудникиОрганизаций.Физлицо = ВТПаспорта.ФизЛицо |ГДЕ | СотрудникиОрганизаций.ПодразделениеОрганизации = &ПодразделениеОрганизации | И СотрудникиОрганизаций.ДатаУвольнения < &ДатаУвольнения"; Запрос.УстановитьПараметр("ДатаУвольнения", ДатаУвольнения); Запрос.УстановитьПараметр("ПодразделениеОрганизации", ПодразделениеОрганизации); Запрос.УстановитьПараметр("Вид", Вид); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); ТТЕСТ = ПолучитьМакет("МакетРЕГ"); Индекс = 0; //Получить макет. Если Регионы тогда Договор = ПолучитьМакет("МакетРЕГ"); Иначе Договор = ПолучитьМакет("МакетМСК"); КонецЕсли; ОбъектWord = Договор.Получить(); ДокументWord = ОбъектWord.Application.Documents(1); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Если индекс > 0 тогда ДокументWord.content.Copy(); КонецЕсли; //Получить макет. Если Регионы тогда Договор = ПолучитьМакет("МакетРЕГ"); Иначе Договор = ПолучитьМакет("МакетМСК"); КонецЕсли; ОбъектWord = Договор.Получить(); ДокументWord = ОбъектWord.Application.Documents(1); //ДокументWord.Activate(); //Макет получен. Обрабатываем параметры. ТекстПоиска = "<номер трудового договора>"; ТекстЗамены = ВыборкаДетальныеЗаписи.Ссылка.НомерДоговора; Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); ТекстПоиска = "<дата трудового договора>"; ТекстЗамены = ВыборкаДетальныеЗаписи.Ссылка.ДатаДоговора; Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); ТекстПоиска = "<дата дополнительного соглашения>"; ТекстЗамены = Формат(текущаядата(), "ДЛФ=Д"); Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); //Заполнить 4 фамилии ТекстПоиска = "<фамилия имя отчество сотрудника>"; ТекстЗамены = Строка(ВыборкаДетальныеЗаписи.Ссылка.Физлицо); Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); ТекстПоиска = "<фамилия имя отчество сотрудника>"; ТекстЗамены = Строка(ВыборкаДетальныеЗаписи.Ссылка.Физлицо); Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); ТекстПоиска = "<фамилия имя отчество сотрудника>"; ТекстЗамены = Строка(ВыборкаДетальныеЗаписи.Ссылка.Физлицо); Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); ТекстПоиска = "<фамилия имя отчество сотрудника>"; ТекстЗамены = Строка(ВыборкаДетальныеЗаписи.Ссылка.Физлицо); Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); ТекстПоиска = "<дата рождения>"; ТекстЗамены = ВыборкаДетальныеЗаписи.Ссылка.Физлицо.ДатаРождения; Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); ТекстПоиска = "<адрес по прописке>"; ТекстЗамены = ВыборкаДетальныеЗаписи.Представление; Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); ТекстПоиска = "<серия паспорта>"; ТекстЗамены = ВыборкаДетальныеЗаписи.ДокументСерия; Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); ТекстПоиска = "<номер паспорта>"; ТекстЗамены = ВыборкаДетальныеЗаписи.ДокументНомер; Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); ТекстПоиска = "<дата выдачи паспорта>"; ТекстЗамены = ВыборкаДетальныеЗаписи.ДокументДатаВыдачи; Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); ТекстПоиска = "<орган выдавший паспорт>"; ТекстЗамены = ВыборкаДетальныеЗаписи.ДокументКемВыдан; Замена = ДокументWord.Content.find; Замена.Execute(ТекстПоиска,Ложь,Истина,Ложь,,,Истина,,Ложь,ТекстЗамены); //Вывод ДокументWord.Paste(); КонецЦикла; КонецЕсли; КонецЦикла; ДокументWord.Application.Visible=Истина; ДокументWord.Activate(); КонецПроцедуры Процедура ЗаполнитьПодразделенияНажатие(Элемент) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ разрешенные | ПодразделенияОрганизаций.Ссылка КАК Подразделения, | ПодразделенияОрганизаций.Владелец КАК Организация |ИЗ | Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций | |УПОРЯДОЧИТЬ ПО | Организация, | Подразделения"; ВТПодразделения = Запрос.Выполнить().Выгрузить(); ТЧПодразделения.Очистить(); ТЧПодразделения.Загрузить(ВТПодразделения); КонецПроцедуры |
|||
15
Базис
naïve
14.12.16
✎
15:39
|
1. Списки можно выводить в excel.
2. Разберись, что у тебя должно выполняться 1 раз, а что - N. |
|||
16
Nolan
14.12.16
✎
15:44
|
(14) спасибо. можно переделать все и попробовать пользоваться типовыми функциями.
ДД - твой макет. Макет = УправлениеПечатьюКлиент.ИнициализироватьМакетОфисногоДокумента(ДД, "DOC", "ПФ_3_11_2"); Область = УправлениеПечатьюКлиент.ОбластьМакета(Макет, Новый Структура("ИмяОбласти, ТипОбласти", "Разрыв", "Общая")); УправлениеПечатьюКлиент.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеЗаполнения, Ложь); УправлениеПечатьюКлиент.ПоказатьДокумент(ПечатнаяФорма); |
|||
17
Nolan
14.12.16
✎
15:47
|
Кто-нибудь знает как получить все параметры указанные в макет? ну т.е не один конкретный, а типо получить все параметры, и чтобы вернулся массив какой-нибудь...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |