Имя: Пароль:
1C
1С v8
Вывод макета из 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 ) , хот срань господню.