Имя: Пароль:
1C
1С v8
Как при выводе в шаблон ворд сделать цикл?
,
0 Мисти
 
27.02.13
23:07
Колонтитулы нашла, весь вывод параметров тоже, осталась одна засада - пункт 2.7 должен быть выведен (3 строчки в нем) последовательно - от 0 до 10 раз (по разным договорам)
Как бы это изобразить?
В ексел - понятно (в смысле, в табличный документ) - строчка в цикле заполняется и выводится, а тут как быть?
1 Classic
 
27.02.13
23:22
Копируй строку
2 sanja26
 
27.02.13
23:36
Док.Paragraphs.Add();
   //Word.Selection.MoveRight(,);
   Табл= Word.Selection.Range;
   //Формируем заголовок:
   Табл.InsertAfter("П/П*Наименование статьи расходов Агента*Стоимость (руб.)");
   Табл.InsertParagraphAfter();
   //сама таблица
   й = 1;
   Для Каждого строка из Услуги Цикл
       Табл.InsertAfter(Строка(й) + "*" + строка.Услуга+"*"+Строка.СуммаOUTСНДС);
       Табл.InsertParagraphAfter();
       й = й + 1;
   КонецЦикла;
3 sanja26
 
27.02.13
23:37
вот так делал таблицу, полный код. можешь урезать

   Word.selection.MoveDown(,12);
   Док.Paragraphs.Add();
   //Word.Selection.MoveRight(,);
   Табл= Word.Selection.Range;
   //Формируем заголовок:
   Табл.InsertAfter("П/П*Наименование статьи расходов Агента*Стоимость (руб.)");
   Табл.InsertParagraphAfter();
   //сама таблица
   й = 1;
   Для Каждого строка из Услуги Цикл
       Табл.InsertAfter(Строка(й) + "*" + строка.Услуга+"*"+Строка.СуммаOUTСНДС);
       Табл.InsertParagraphAfter();
       й = й + 1;
   КонецЦикла;
   
   Табл.InsertAfter("" + "*" + "ИТОГО общая сумма расходов Агента без  НДС:"+"*"+"5");
   Табл.InsertParagraphAfter();
   
   Табл.InsertAfter("" + "*" + "НДС 18%:"+"*"+"5");
   Табл.InsertParagraphAfter();
   
   Табл.InsertAfter("" + "*" + "ИТОГО общая сумма расходов Агента, включая НДС 18%:"+"*"+"5");
   Табл.InsertParagraphAfter();    
   
   Табл.ConvertToTable("*");
   
   //Происходит конвертация строки в таблицу
   
   //не нравятся звездочки - используйте другой символ
   Док.Tables(1).AutoFormat(1);
   Док.Tables(1).Borders(wdBorderBottom).LineStyle = wdLineStyleNone;
   Док.Tables(1).Borders(wdBorderLeft).LineStyle = wdLineStyleNone;
   Док.Tables(1).Borders(wdBorderRight).LineStyle = wdLineStyleNone;
   Док.Tables(1).Borders(wdBorderTop).LineStyle = wdLineStyleNone;
   Док.Tables(1).Borders(wdBorderVertical).LineStyle = wdLineStyleNone;
   Док.Tables(1).Borders(wdBorderHorizontal).LineStyle = wdLineStyleNone;
4 sanja26
 
27.02.13
23:38
й = й + 1 :))
5 Мисти
 
28.02.13
22:20
Спасибо большое!
А я и не верила, что это возможно!
6 mikecool
 
28.02.13
22:25
(5) загугли "Объектная модель Ворд" - кажется первая ссылка дает шикарное описание по свойствам-методам
7 Мисти
 
28.02.13
22:33
Спасибо!
8 ВалераОшкин
 
28.02.13
23:06
Как вариант работы с таблицами в Ворде.        
   // Табличная часть
   ВсегоТЧ = УПН_ОбщиеПроцедуры.ПолучитьКоличествоТЧ(СсылкаНаОбъект);
   Для WordDocTableNuber = 1 По WordDoc.Tables.Count() Цикл
       TC = WordDoc.Tables(WordDocTableNuber);
       
       // Обходим все строки таблицы в документе Ворд
       НомерСтрокиДок = 1;
       Попытка
           СтрокаТаблицы = TC.Rows(НомерСтрокиДок);
       Исключение
           // Есть строки объединеные по вертикали
           Продолжить;
       КонецПопытки;
       //Для Каждого СтрокаТаблицы Из TC.Rows Цикл
       Пока НомерСтрокиДок <= TC.Rows.Count() Цикл
           СтрокаТаблицы = TC.Rows(НомерСтрокиДок);
           // Ищем реквизит ТЧ
           НашлиРеквизитТЧ = Ложь;
           КоличествоПолей = СтрокаТаблицы.Range.Fields.Count;
           Если КоличествоПолей > 0 Тогда
               Для Инд = 1 По КоличествоПолей Цикл
                   Ном = КоличествоПолей - Инд + 1;
                   СтрокаТаблицы.Range.Fields(Ном).Select();
                   ИмяРеквизита = WD.Selection.Text;                        
                   Если ПустаяСтрока(ИмяРеквизита) Тогда
                       Продолжить;
                   КонецЕсли;  
                   // Получим имя ТЧ
                   ПозицияТочки = Найти(ИмяРеквизита, ".");
                   Если ПозицияТочки > 0 Тогда
                       ИмяТЧ = Лев(ИмяРеквизита, ПозицияТочки - 1);
                   Иначе
                       Продолжить;
                   КонецЕсли;
                   Если Не УПН_ОбщиеПроцедуры.ОбъектСодержитТЧ(СсылкаНаОбъект, ИмяТЧ) Тогда
                       Продолжить;
                   Иначе
                       НашлиРеквизитТЧ = Истина;
                   КонецЕсли;
                   //ТабличнаяЧасть = УПН_ОбщиеПроцедуры.ПолучитьТаблицуЗначенийИЗТЧ(СсылкаНаОбъект, ИмяТЧ);
                   Прервать;
               КонецЦикла;                    
           КонецЕсли;
           
           Если Не НашлиРеквизитТЧ Тогда
               НомерСтрокиДок = НомерСтрокиДок + 1;
               Продолжить;
           КонецЕсли;
           
           // Добавляем пустые строки по количеству строк в ТЧ документа
           ПерваяСтрока = Истина;
           КоличествоСтрокТЧ = УПН_ОбщиеПроцедуры.ПолучитьКоличествоСтрокТЧ(СсылкаНаОбъект, ИмяТЧ);
           Если КоличествоСтрокТЧ = 0 Тогда
               Если TC.Rows.Count() = 1 Тогда
               Иначе
                   СтрокаТаблицы.Range.Cut();
               КонецЕсли;
           Иначе
               Для Сч = 1 По КоличествоСтрокТЧ Цикл
                   Если ПерваяСтрока Тогда
                       ПерваяСтрока = Ложь;
                       СтрокаТаблицы.Range.Copy();
                   Иначе    
                       СтрокаТаблицы.Range.Paste();
                   КонецЕсли;    
               КонецЦикла;
           КонецЕсли;
           
           // Обход таблицы документа по столбцам и заполняем строки
           Для Сч = 1 По КоличествоСтрокТЧ Цикл
               НомерСтрокиТЧ = НомерСтрокиДок + Сч - 1;
               СтрокаТаблицы = TC.Rows(НомерСтрокиТЧ);
               КоличествоПолей = СтрокаТаблицы.Range.Fields.Count;
               Если КоличествоПолей > 0 Тогда
                   Для Инд = 1 По КоличествоПолей Цикл
                       Ном = КоличествоПолей - Инд + 1;
                       СтрокаТаблицы.Range.Fields(Ном).Select();
                       ИмяРеквизита = WD.Selection.Text;                        
                       Если ПустаяСтрока(ИмяРеквизита) Тогда
                           Продолжить;
                       КонецЕсли;                                  
                       Если ИмяТЧ = Лев(ИмяРеквизита, СтрДлина(ИмяТЧ)) Тогда // Это реквзит ТЧ
                           ИмяРеквизита = Сред(ИмяРеквизита, СтрДлина(ИмяТЧ) + 2);
                           Значение = УПН_ОбщиеПроцедуры.ПолучитьЗначениеРеквизитаТЧДляWord(СсылкаНаОбъект, ИмяТЧ, Сч, ИмяРеквизита, ПолучитьСсылкуНаЗащищеннуюОбработку());
                           Если Значение <> Неопределено И ЗначениеЗаполнено(Значение) Тогда // ??? изменил 10.12.2012 16:14:25
                               Wd.ActiveWindow.View.ShowFieldCodes = -1;
                               Wd.Selection.Text = Строка(Значение);
                               Wd.ActiveWindow.View.ShowFieldCodes = 0;
                           Иначе
                               Wd.Selection.Font.Color = 255;
                           КонецЕсли;
                       Иначе // Это реквизит документа
                           Значение = УПН_ОбщиеПроцедуры.ПолучитьЗначениеРеквизитаДляWord(СсылкаНаОбъект, ИмяРеквизита, ПолучитьСсылкуНаЗащищеннуюОбработку());
                           Если Значение <> Неопределено И ЗначениеЗаполнено(Значение) Тогда // ??? изменил 10.12.2012 16:14:25
                               Wd.ActiveWindow.View.ShowFieldCodes = -1;
                               Wd.Selection.Text = Строка(Значение);
                               Wd.ActiveWindow.View.ShowFieldCodes = 0;
                           Иначе
                               Wd.Selection.Font.Color = 255;
                           КонецЕсли;
                       КонецЕсли;
                   КонецЦикла;                    
               КонецЕсли;
           КонецЦикла;
           
           НомерСтрокиДок = НомерСтрокиДок + ?(КоличествоСтрокТЧ = 0, 1, КоличествоСтрокТЧ);
           
       КонецЦикла;
   КонецЦикла;
9 Мисти
 
04.03.13
19:40
А сохранить как потом получившееся?
10 Mikeware
 
04.03.13
19:42
(6) Это же франч.
11 Мисти
 
04.03.13
19:47
(10) А ты знаешь ответ?
Я там почитала - что нашла. Всего очень много, "сохранить" - не видать.
12 Мисти
 
04.03.13
20:05
SaveAs( - и сразу путь, что ли?
13 Мисти
 
04.03.13
20:10
Про цикл:
Что должно быть в шаблоне ворда, чтобы моя таблица встала в нужное место?
14 KAO111
 
04.03.13
20:10
15 Мисти
 
04.03.13
20:11
Word.selection.MoveDown(,12); - вот это, что ли? 12 - от чего? От верха?
Я пляшу от общеизвестного (уже 10 штук нашла таких в сети) -
   MSWord = Шаблон.Получить();    
   //Попытка      
   Документ = MSWord.Application.Documents(1);
   Документ.Activate();
   // колонтитулы
   MSWord.Sections(1).Headers(1).Range.Text = "Договор лизинга №"+НомерДоговора+ " от " +Формат(ДатаДоговора,"ДФ='дд ММММ гггг'")
   + " между "+СокрЛП(Лизингодатель.НаименованиеСокращенное)+" и "+СокрЛП(НаименованиеЛизингополучателя.НаименованиеПолное);
   Замена = Документ.Content.Find;
   Для каждого СтрокаПараметров Из ТаблицаПараметров Цикл
       // Заменить заранее определенные ключевые конструкции на требуемый текст.
       Замена.Execute("[" + СтрокаПараметров.Имя + "]",,,,,,,,, СтрокаПараметров.Значение, 2);
       Сообщить( СтрокаПараметров.Имя);
   КонецЦикла;
16 Мисти
 
04.03.13
20:18
Сохранилось!!
Уря.
Осталось с циклом разобраться!
Предположим, мне нужно вывести все-то
Покупатель1
Покупатель2
Покупатель3
17 Мисти
 
04.03.13
21:20
Очень надо!!
18 Мисти
 
04.03.13
21:22
Просто параметр - это [пер]
А как сказать, что у меня это таблица!
19 Мисти
 
04.03.13
21:49
Выборка = Ворд.Selection;
Выборка.GoTo(-1,,,ИмяЗакладки) - это я нашла.
Как задать ИмяЗакладки? Это ж не параметр?
20 Мисти
 
04.03.13
22:27
Закладку тоже нашла.
Выборка = Ворд.Selection;  - как это привязать к моим переменным?
21 Мисти
 
04.03.13
22:29
http://www.abelov.com/kuban/169919.html - вот там, кстати, всё прям у человека получилось!
22 Мисти
 
04.03.13
22:43
Табл= Word.Selection.Range; - кто такой тут Word?
Я так понимаю, что у меня и  в нужных мне примерах файл открывается разными способами.
У меня -
Шаблон = ПолучитьМакет("ШаблонWord");  
MSWord = Шаблон.Получить();        
Документ = MSWord.Application.Documents(1);
Документ.Activate();
23 Мисти
 
04.03.13
22:45
А в примере -
MSWord=CreateObject("Word.Application"); Документ=MSWord.Documents.Open("c:\aaa.doc");
MSWord.Selection.TypeText("BEGIN");
А как скрестить ужа с ежом?
24 Мисти
 
05.03.13
00:34
Это самое важное!
25 sanja26
 
05.03.13
01:09
(24)а в чем проблема-то?
26 sanja26
 
05.03.13
01:12
Word.selection.MoveDown(,12);
   Док.Paragraphs.Add();
   //Word.Selection.MoveRight(,);
   Табл= Word.Selection.Range;
   //Формируем заголовок:
   Табл.InsertAfter("П/П*Наименование статьи расходов Агента*Стоимость (руб.)");
   Табл.InsertParagraphAfter();
   //сама таблица
   й = 1;
   Для Каждого строка из Услуги Цикл
       Табл.InsertAfter(Строка(й) + "*" + строка.Услуга+"*"+Строка.СуммаOUTСНДС);
       Табл.InsertParagraphAfter();
       й = й + 1;
   КонецЦикла;
   
   Табл.InsertAfter("" + "*" + "ИТОГО общая сумма расходов Агента без  НДС:"+"*"+"5");
   Табл.InsertParagraphAfter();
   
   Табл.InsertAfter("" + "*" + "НДС 18%:"+"*"+"5");
   Табл.InsertParagraphAfter();
   
   Табл.InsertAfter("" + "*" + "ИТОГО общая сумма расходов Агента, включая НДС 18%:"+"*"+"5");
   Табл.InsertParagraphAfter();    
   
   Табл.ConvertToTable("*");
   
   //Происходит конвертация строки в таблицу
   
   //не нравятся звездочки - используйте другой символ
   Док.Tables(1).AutoFormat(1);
   Док.Tables(1).Borders(wdBorderBottom).LineStyle = wdLineStyleNone;
   Док.Tables(1).Borders(wdBorderLeft).LineStyle = wdLineStyleNone;
   Док.Tables(1).Borders(wdBorderRight).LineStyle = wdLineStyleNone;
   Док.Tables(1).Borders(wdBorderTop).LineStyle = wdLineStyleNone;
   Док.Tables(1).Borders(wdBorderVertical).LineStyle = wdLineStyleNone;
   Док.Tables(1).Borders(wdBorderHorizontal).LineStyle = wdLineStyleNone;
27 sanja26
 
05.03.13
01:13
Word.selection.MoveDown(,12);
   Док.Paragraphs.Add();
   //Word.Selection.MoveRight(,);
   Табл= Word.Selection.Range;
   //Формируем заголовок:
   Табл.InsertAfter("П/П*Наименование статьи расходов Агента*Стоимость (руб.)");
   Табл.InsertParagraphAfter();
   //сама таблица
   й = 1;
   Для Каждого строка из Услуги Цикл
       Табл.InsertAfter(Строка(й) + "*" + строка.Услуга+"*"+Строка.СуммаOUTСНДС);
       Табл.InsertParagraphAfter();
       й = й + 1;
   КонецЦикла;
   
   Табл.ConvertToTable("*");
   
   //Происходит конвертация строки в таблицу
   
   //не нравятся звездочки - используйте другой символ
   Док.Tables(1).AutoFormat(1);
   Док.Tables(1).Borders(wdBorderBottom).LineStyle = wdLineStyleNone;
   Док.Tables(1).Borders(wdBorderLeft).LineStyle = wdLineStyleNone;
   Док.Tables(1).Borders(wdBorderRight).LineStyle = wdLineStyleNone;
   Док.Tables(1).Borders(wdBorderTop).LineStyle = wdLineStyleNone;
   Док.Tables(1).Borders(wdBorderVertical).LineStyle = wdLineStyleNone;
   Док.Tables(1).Borders(wdBorderHorizontal).LineStyle = wdLineStyleNone;
28 Мисти
 
05.03.13
07:53
(27) Спасибо! Этот код вселяет оптимизм!
Если у меня ворд определен как
Шаблон = ПолучитьМакет("ШаблонWord");  
MSWord = Шаблон.Получить();        
Документ = MSWord.Application.Documents(1);
Документ.Activate();

То к чему можно привязать
Word.selection.MoveDown(,12); ?
Мне говорят - нет такого метода!
29 Wobland
 
05.03.13
07:56
(28) вас там двое? v8: Помогите с Word шаблоном
30 Мисти
 
05.03.13
08:28
Видела я эту тему!
Если б я нашла описание - к какому объекту какой метод применяется, или как в 1С - точку ставишь, а тебе - подсказку, а так я не могу понять, как соединить мое с примером. У меня готовый шаблон (макет), туда вставляются параметры и, в частности, надо вставить несколько табличных частей.
31 sanja26
 
05.03.13
12:25
(28) http://infostart.ru/public/143838/ тут глянь

MSWord.selection.MoveDown(,12);
32 sanja26
 
05.03.13
12:27
Word = MSWord.Application;
Документ = Word.Documents(1);
Word.selection.MoveDown(,12);
33 Мисти
 
17.03.13
16:05
В 32 - это то, чего мне не хватало.
Теперь цикл выводится.
Как сделать, чтобы в табличку попадало?
Шапка есть, как сделать, чтобы строка соответствовала шапке?
34 Мисти
 
17.03.13
17:38
Табл.ConvertToTable("*");
Почему этот фокус мог не отработать?
35 Мисти
 
17.03.13
17:43
wdLineStyleNone - ругается.
36 Мисти
 
17.03.13
18:02
wdBorderBottom = -3;// Нижняя грань таблицы
wdBorderLeft = -2; // Левая грань таблицы
wdBorderRight = -4; //Правая
wdBorderTop = -1; // нижняя
wdBorderVertical = -6; //Вертикальная (видимо смежная)
О!! Что нашла!
37 acsent
 
17.03.13
18:11
почему бы не взять методологию из бсп?
38 Мисти
 
17.03.13
18:12
Сделать хотел грозу, а получил....
Почему-то границы зеленые!!
39 Мисти
 
17.03.13
18:12
бсп - это что?
40 Мисти
 
17.03.13
18:28
Осталась мелочь!
Промежуточной горизонтальной линии нет.
Поможите люди-добрые!!
41 sanja26
 
17.03.13
20:28
insertparagrafafter в цикле забыла
42 Мисти
 
18.03.13
14:50
ТабДокумент = Новый ТабличныйДокумент;
    Шаблон = ПолучитьМакет("АктВводВагон");
    // Получить объект из макета.
    MSWord = Шаблон.Получить();    
    //Попытка      
    Документ = MSWord.Application.Documents(1);
    Документ.Activate();
    // колонтитулы
    MSWord.Sections(1).Headers(1).Range.Text = "Договор лизинга №"+НомерДоговора+ " от " +Формат(ДатаДоговора,"ДФ='дд ММММ гггг'")
    + " между "+СокрЛП(Лизингодатель.НаименованиеСокращенное)+" и "+СокрЛП(НаименованиеЛизингополучателя.НаименованиеПолное);
    Замена = Документ.Content.Find;
    Для каждого СтрокаПараметров Из ТаблицаПараметров Цикл
        // Заменить заранее определенные ключевые конструкции на требуемый текст.
        Замена.Execute("[" + СтрокаПараметров.Имя + "]",,,,,,,,, СтрокаПараметров.Значение, 2);
        Сообщить( СтрокаПараметров.Имя);
    КонецЦикла;
    MSWord.Application.Selection.GoTo(-1,,,"Строка1");    
    Табл= MSWord.Application.Selection.Range;
    //Формируем заголовок:
    й=1;
    Табл.InsertAfter("№ п/п "+ "*" + "Производитель"+"*"
    +"Наименование"+"*"+ "Идентификационный номер (заводской номер)"+"*"+"Сетевой номер"+"*"+ "Год постройки");    
    Табл.InsertParagraphAfter();    
    Для Каждого СтрНом из  СписокНоменклатуры Цикл
        Если СтрНом.Исп  Тогда
            Табл.InsertAfter(Строка(й) + "*" + СтрНом.Номенклатура.ПТС.Производитель+"*"
            +СтрНом.Номенклатура.ПТС.Наименование+"*"+СтрНом.Номенклатура.ПТС.ИД+"*"+ СтрНом.Номенклатура.ПТС.СетевойНомер+"*"+ СтрНом.Номенклатура.ПТС.ГодИзготовления);    
            Табл.InsertParagraphAfter();    
            //         MSWord.Application.Selection.InsertBreak(7);
            //         MSWord.Application.Selection.Paste();
            //         MSWord.Application.Selection.TypeParagraph();
            //         MSWord.Application.Selection.TypeText(СтрокаТекста);
            //MSWord.Application.Selection.TypeParagraph();
            й=й+1;
        КонецЕсли;        
    КонецЦикла;
    Табл.ConvertToTable("*");
    wdBorderBottom = -3;// Нижняя грань таблицы
    wdBorderLeft = -2; // Левая грань таблицы
    wdBorderRight = -4; //Правая
    wdBorderTop = -1; // нижняя
    wdBorderVertical = -6; //Вертикальная (видимо смежная)    
    Документ.Tables(1).AutoFormat(1);
    Документ.Tables(1).Borders(wdBorderBottom).LineStyle = 1;
    Документ.Tables(1).Borders(wdBorderLeft).LineStyle = 1;  //wdLineStyleNone
    Документ.Tables(1).Borders(wdBorderRight).LineStyle = 1;  //wdLineStyleNone
    Документ.Tables(1).Borders(wdBorderTop).LineStyle = 1;  //wdLineStyleNone
    Документ.Tables(1).Borders(wdBorderVertical).LineStyle = 1;  //wdLineStyleNone

Ничего не забыла!
У меня 3 дефекта - нет промежуточных линий, основные линии почему-то зеленые, а во втором месте, куда я вставляю всё точно так же (дубль, по сути!) - линий нет вообще.
Почему?