![]() |
|
Вывод макета из 1С в Word через ActiveDocume: для каждой строки ТЧ - отдельный макет. Как? | ☑ | ||
---|---|---|---|---|
0
DenYuliya
11.11.21
✎
22:21
|
Доброго всем вечера.
подскажите пожалуйста, как реализовать следующее: Вывожу ПФ из 1С в Word через ActiveDocument. У меня сейчас вот так, работает нормально, но выводится либо первая строка ТЧ. если она всего одна, либо последняя, если строк ТЧ - несколько. Я так понимаю, надо впендюрить куда-то Цикл. создать таблицу и что-то еще? &НаКлиенте Процедура Печать(ИдентификаторКоманды,ОбъектыНазначения) Экспорт //вместо ПечатьУведомлениеОЗадолженности(Команда) СтруктураДляЗаполнения = ПолучитьСтруктуруДляЗаполнения(); Попытка ОбъектВорд = Новый COMОбъект("Word.Application"); Исключение Сообщить("Ошибка при запуске Microsoft Word: " + ОписаниеОшибки(), СтатусСообщения.Внимание); КонецПопытки; ОбъектВорд.Documents.Add("\\serv8\ftp\Шаблоны исков\Юр блок Колпино\Уведомление о задолженности.docx"); Док = ОбъектВорд.ActiveDocument; //заполнение закладки ПолноеНаименованиеОрганизации Док.Bookmarks("ПолноеНаименованиеОрганизации").Select(); Док.Application.Selection.TypeText(СтруктураДляЗаполнения.ПолноеНаименованиеОрганизации); //заполнение закладки ИОДолжник Док.Bookmarks("ИОДолжник").Select(); Док.Application.Selection.TypeText(СтруктураДляЗаполнения.ИОДолжник); //заполнение закладки АдресДомаДолжника Док.Bookmarks("АдресДомаДолжника").Select(); Док.Application.Selection.TypeText(СтруктураДляЗаполнения.АдресДомаДолжника); //заполнение закладки СуммаЗадолженности Док.Bookmarks("СуммаЗадолженности").Select(); Док.Application.Selection.TypeText(СтруктураДляЗаполнения.СуммаЗадолженности); //заполнение закладки СрокПогашения Док.Bookmarks("СрокПогашения").Select(); Док.Application.Selection.TypeText(СтруктураДляЗаполнения.СрокПогашения); ОбъектВорд.Application.Visible=1; ОбъектВорд.Activate(); ОбъектВорд = 0; ЭтаФорма.Закрыть(); КонецПроцедуры |
|||
1
mikecool
11.11.21
✎
22:47
|
вообще не вижу таблицы, она в шаблоне?
|
|||
2
DenYuliya
11.11.21
✎
23:10
|
(1)я вообще не понимаю, как ее создать и в какой момент((((. Ее нет.
Как это сделать через ТабДок -знаю. А тут нет(((( |
|||
3
DenYuliya
11.11.21
✎
23:17
|
(1) сцуко, я страшный тупень. Вопрос -то вообще по другому надо было задать, наверное.
У меня 2 задачи в голове в кашу просто((((. Мне не ТАБЛИЦА нужна. А вывода каждой из строк табличной части в цикле. Как бы Для Каждой Строка Из СтруктураДляЗаполнения Цикл ///формируем новый макет ActiveDocument с новыми реквизитами, содержащимися в строке Цикл Ну есть у вас документ, в документе ТЧ. Строка 1: Петя Строка 2:Вася Строка 3: Сережа. Вот каждому из них должно создаться по макету. Отдельному. В первом - "Для Пети", во втором "Для Васи".... А у меня только одна выводится.Ну понятно, потому что цикла то нет. А как его зафигачить? Скорее: в какой момент? |
|||
4
DenYuliya
12.11.21
✎
01:02
|
(1) в общем, в продолжение (3)
Вот тут в параметр СтруктураДляЗаполнения возвращается структура, заполненная данными строки ТЧ. &НаКлиенте Процедура Печать(ИдентификаторКоманды,ОбъектыНазначения) Экспорт //вместо ПечатьУведомлениеОЗадолженности(Команда) СтруктураДляЗаполнения = ПолучитьСтруктуруДляЗаполнения(); //// дальше идет заполнение параметров Word КонецПроцедуры; В функции ПолучитьСтруктуруДляЗаполнения() запрос к ТЧ документа Функция ПолучитьСтруктуруДляЗаполнения() ///ТУТ запрос ТЗ_Документа = Запрос.Выполнить().Выгрузить(); ДляКаждого Строка Из ТЗ_Документа Цикл СтруктураДляЗаполнения = Новый Структура; СтруктураДляЗаполнения.Вставить("СуммаЗадолженности", СуммаЗадолженности); СтруктураДляЗаполнения.Вставить("ИОДолжник", Должник); ///и так далее Возврат СтруктураДляЗаполнения; КонецЦикла; КонецФункции; В процедуре Печать() получается первая строка, печатается - и на этом все. Как бы мне зафигачить в клиентскую процедуру Печать() цикл, обходящий все строки ТабличнойЧасти объекта и для каждой из них вызывающий печать? Или может как-то поэлегантнее можно сделать это? Запрос на клиенте я создать не могу... Клиентскую процедуру серверной тоже сделать не могу, потому что на сервере нет ворда... Как извратиться-то? что то я уже вообще по кругу бегаю. |
|||
5
Сергиус
12.11.21
✎
01:18
|
(4)Формируй на сервере массив структур из данных таблицы, возвращай на клиента и обходи его как хочешь
|
|||
6
Сергиус
12.11.21
✎
01:20
|
+(5) У тебя в функции ПолучитьСтруктуруДляЗаполнения() нет массива, куда можно добавить данные по всем строкам, а не только по одной. Что то из серии МассивСтр.Добавить(СтруктураДляЗаполнения). Потом этот массив и возвращай
|
|||
7
DenYuliya
12.11.21
✎
10:38
|
(5) короче сама сделала, всем спасибо! До 3 ночи сидела, что-то я залипла с этим вопросом, первый раз с ActiveDocument сталкиваюсь так плотно, если честно. На случай,если вдруг пригодится кому на будущее:
Есть документ, в нем есть ТЧ с данными контрагентов. Для каждого из контрагентов в ТЧ надо было сформировать отдельный макет в WORD. Самый большой "затык" был в том, что - на сервере нет WORD, соответственно, процедура формирования/заполнения макета должна быть на клиенте. - не понятно было, как реализовать цикл на клиенте - не понятно было, в какой момент формирования WORD начинать и прерывать цикл, чтобы макеты не затирались, а выводились один за другим. 1) В модуле формы кнопка вызывает клиентскую Процедуру "Печать1". &НаКлиенте Процедура Печать1(Команда); Должники = ПолучитьДолжников(); Печать(" ",Должники); КонецПроцедуры 2) Из нее вызываю серверную процедуру. На сервере в массив выгружаю колонку "должники" ТЧ объекта. Строки данной колонки ссылочного типа, но в массив выгружается строка! Данный этап нужен для дальнейшей передачи с клиента в клиентскую же процедуру "Печать" и задания там цикла для построчной печати макета (для каждой строки ТЧ - свой макет WORD) &НаСервере Функция ПолучитьДолжников() ЗначениеОбъекта = Объект.СсылкаНаОбъект.ПолучитьОбъект(); МассивДолжников = ЗначениеОбъекта.Должники.ВыгрузитьКолонку("Должник"); Возврат МассивДолжников; КонецФункции 3) Вызываю клиентскую проц Печать("", Должники); передаю в нее массив со значениям строк ТЧ, выгруженными на этапе 2. 4) В процедуре печать задаю цикл. Цикл задается с самого начала, и завершается на моменте между: ОбъектВорд.Application.Visible=1; КонецЦикла; ////!!! ОбъектВорд.Activate(); ОбъектВорд = 0; Если цикл завершить позже, макет будет перезатираться! Для каждой строки массива вызываю получение СтруктурыДляЗаполнения. СтруктураДляЗаполнения - это вызов серверной Функции, в которой формируется запрос (с переданными в него параметрами СсылкаНаОбъект и строкой тч "Должник". Должник - это строка, из нашего массива, по которому строится цикл в процедуре печати. &НаКлиенте Процедура Печать(ИдентификаторКоманды,мДолжники) Экспорт ПредупреждениеДок = Объект.СсылкаНаОбъект; Для Каждого СтрДолжник Из мДолжники Цикл СтруктураДляЗаполнения = ПолучитьСтруктуруДляЗаполнения(ПредупреждениеДок, СтрДолжник); Попытка ОбъектВорд = Новый COMОбъект("Word.Application"); Исключение Сообщить("Ошибка при запуске Microsoft Word: " + ОписаниеОшибки(), СтатусСообщения.Внимание); КонецПопытки; ОбъектВорд.Documents.Add("\\serv8\ftp\Шаблоны исков\Уведомление о задолженности.docx"); Док = ОбъектВорд.ActiveDocument; //заполнение закладки ПолноеНаименованиеОрганизации Док.Bookmarks("ПолноеНаименованиеОрганизации").Select(); Док.Application.Selection.TypeText(СтруктураДляЗаполнения.ПолноеНаименованиеОрганизации); //заполнение закладки РеквизитыДолжника Док.Bookmarks("РеквизитыДолжника").Select(); Док.Application.Selection.TypeText(СтруктураДляЗаполнения.РеквизитыДолжника); //заполнение закладки ИОДолжник Док.Bookmarks("ИОДолжник").Select(); Док.Application.Selection.TypeText(СтруктураДляЗаполнения.ИОДолжник); //заполнение закладки АдресДомаДолжника Док.Bookmarks("АдресДомаДолжника").Select(); Док.Application.Selection.TypeText(СтруктураДляЗаполнения.АдресДомаДолжника); ///и другая куча параметров ОбъектВорд.Application.Visible=1; КонецЦикла; //!!! тут завершаем цикл ОбъектВорд.Activate(); ОбъектВорд = 0; КонецПроцедуры &НаСервере Функция ПолучитьСтруктуруДляЗаполнения(ПредупреждениеДок,Должник) СтруктураДляЗаполнения = Новый Структура; /// здесь запрос и заполнение структуры для дальнейшего заполнение из нее непосредственно макета Word Возврат СтруктураДляЗаполнения; КонецФункции |
|||
8
PLUT
12.11.21
✎
10:45
|
(7) говнокод детектед
ОбъектВорд.Documents.Add("\\serv8\ftp\Шаблоны исков\Уведомление о задолженности.docx"); |
|||
9
DenYuliya
12.11.21
✎
12:13
|
(8) копипаст с ранее созданного не мною).
А не знаете, возможно же как-то сделать, чтобы илитненько выводить условно "5 макетов на 5 листах одного документа", а не 5 разных макетов? Какое-нибудь "Присоединить страницу"? |
|||
10
ИУБиПовиц
12.11.21
✎
13:05
|
Я делал - сохранял во временные файлы, пути запихивал в список значений. Затем создавал новый общий ворд документ, и в него через Selection.Range.InsertFile ...iNSERTbREAK() Для новой страницы. Ну если я правильно понял Вас.
|
|||
11
DenYuliya
12.11.21
✎
14:28
|
(10) мне кажется не правильно. Или я не правильно понимаю, как работает то, что делаете вы :)
Я имею в виду: вот есть у меня документ с ТЧ. В ТЧ 5 строк (5 контрагентов). Сейчас при печати выводится 5 разных макетов WORD, по 1 макету из 1 страницы на каждую из строк. Но это 5 разных экземпляров "документ WORD". Возможно ли как-то сделать, чтобы это был 1 экземпляр "документ WORD" из 5 страниц (листов, или как правильно сказать)? |
|||
12
ИУБиПовиц
12.11.21
✎
15:38
|
:) ну может и не правильно. Но работает точно так как и вы хотите в Итоге:).
1. Формируется 5 разных экземпляров word. 2. Сохраняется во временные папки - запоминается путь, пользователю Не показывается. 3. Формируется общий пустой файл, в него методами Selection.Range.InsertFile ...iNSERTbREAK() я добавляю те сформированные файлы (в п1,2). 4. Полученный один файл ворда - состоящий из 5 страниц (ну или сколько ранее сформировалось) показывается пользователю. |
|||
13
DenYuliya
12.11.21
✎
17:08
|
(12) спасибо, если 5 разных документов забракуют - попробую повторить)))
|
|||
14
DenYuliya
16.11.21
✎
18:31
|
(10) а вы через ActiveDocument делали?
|
|||
15
sitex
naïve
16.11.21
✎
20:21
|
(0) Вообще дичь какая то. Создай, засунь в шаблон свой чтою его можно было найти Пример >>>>>( Таб = Doc.Tables(2); потом в цикле туда добавляй , Таб.Rows.Add();Таб.Cell(сч+1, 1).Range.Text ) , хот срань господню.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |