Кроме прочего в статье присутствует пример создания таблицы с любым количеством колонок и столбцов. Несколько строк с форматированием текста и таблицы. Создание "объединенных" ячеек.
В качестве примера использования можно указать вот такую ситуацию: в зависимости от типа клиента (договора, документа и т.п) формируются разные тексты договоров с разным количеством таблиц. В реальности, конечно должены использоваться и макет и описанные здесь динамические механизмы.
В моем примере я заранее создал новый пустой документ.
Тестировалось на Office 2007.
Исп. переменные: "ПутьКФайлу" — строка. Полное имя файла в формате MSWord.
"Ссылка" — ДокументСсылка (в моем случае — счет).
Вот текст модуля:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
Процедура ВыполнитьОбработку() Экспорт Попытка Объект = ПолучитьCOMОбъект(ПутьКФайлу); // Покажем документ. Для красоты. Объект.Application.Visible = 1; Word = Объект.Application; Doc = Объект.Application.Documents(1); Doc.Activate(); // Готовим переменную в которой будет содержимое нашего документа // (текст, таблицы и проч). Text = Word.S_election; // Очистим документ // Ctrl-A Text.WholeStory(); // Del Text.Delete(1, 1); // Двигаемся на 3 строки ниже. Документ пустой, поэтому добавляем // строки "Переводами коретки" Text.TypeText(Символы.ВК); Text.TypeText(Символы.ВК); Text.TypeParagraph(); // другой вариант того же действия // Выводим текст. Text.TypeText("Обычный текст, набранный первую очередь"); // Курсор в конце строки // Эмулируем нажатие Shift+Home - выделяем строку Text.HomeKey(, 1); // Форматирование выделенной строки Text.Font.Bold = 9999998; Text.Font.Size = 14; Text.Font.Name = "Verdana"; // Сдвигаем курсор. Сдвинуть курсор по строкам возможно, только, // если эти строки уже содержат текст, иначе ничего не произойдет. Text.MoveUp(,2); // вверх на 2 строки //Word.S_election.MoveDown(,числострок); // вниз //Word.S_election.MoveLeft(,числострок); // влево //Word.S_election.MoveRight(,числострок);// вправо // Добавление текста. Текст выводится начиная с текщей позиции // курсора. Text.HomeKey(, 1); Text.TypeText("Обычный текст, набранный во вторую очередь"); Text.MoveDown(,1); // вниз на 2 строки Text.EndKey(); // в конец строки Text.TypeParagraph(); // и в начало следующей строки // Очищаем форматирование Text.ClearFormatting(); // Добавляем таблицу. // Получаем текущую позицию курсора Position = Text.Range(); // Параметры: Позиция, число строк, число колонок, // последние 2 параметра отвечают за автоподбор высоты и отображение // границ таблицы Table = Doc.Tables.Add(Position, 1, 6, 1, 2); // Устанавливаем ширину колонок Table.Columns(1).PreferredWidth=10; Table.Columns(2).PreferredWidth=50; Table.Columns(3).PreferredWidth=10; Table.Columns(4).PreferredWidth=10; Table.Columns(5).PreferredWidth=10; Table.Columns(6).PreferredWidth=10; // Задаем заголовки колонок Row1=Table.Rows(1); Row1.Cells(1).Range.Text="№ п/п"; Row1.Cells(2).Range.Text="Наименование"; Row1.Cells(4).Range.Text="Кол-во"; Row1.Cells(3).Range.Text="Ед. изм."; Row1.Cells(5).Range.Text="Цена,руб."; Row1.Cells(6).Range.Text="Сумма,руб."; // Построчно выводим содержимое таблицы Товары НомерСтроки = 1; Для каждого СтрокаТовары Из Ссылка.Товары Цикл Row=Table.Rows.Add(); Row.Cells(1).Range.Text=НомерСтроки; // Выравнивание по левому краю Row.Cells(1).Range.ParagraphFormat.Alignment = 1; // В качестве текста можно передать только значение "простого" формата // все агрегатные объекты, переданные как текст, что нормально для платформы 1с // вызовут исключение. Row.Cells(2).Range.Text=СтрокаТовары.Номенклатура.Наименование +?(ЗначениеЗаполнено(СтрокаТовары.ХарактеристикаНоменклатуры), " ("+СтрокаТовары.ХарактеристикаНоменклатуры+")",""); Row.Cells(4).Range.Text=Строка(СтрокаТовары.Количество); Row.Cells(4).Range.ParagraphFormat.Alignment = 1; Row.Cells(3).Range.Text=?(ЗначениеЗаполнено(СтрокаТовары.Номенклатура.БазоваяЕдиницаИзмерения) ,СтрокаТовары.Номенклатура.БазоваяЕдиницаИзмерения.Наименование,"-"); Row.Cells(3).Range.ParagraphFormat.Alignment = 1; Row.Cells(5).Range.Text=Формат(СтрокаТовары.Цена,"ЧДЦ=2"); Row.Cells(5).Range.ParagraphFormat.Alignment = 1; Row.Cells(6).Range.Text=Формат(СтрокаТовары.Сумма,"ЧДЦ=2"); Row.Cells(6).Range.ParagraphFormat.Alignment = 1; НомерСтроки=НомерСтроки+1; КонецЦикла; // Задаем форматирование первой строки // Если сделать это сразу, то все новые строки таблицы будут // формироваться с тем же форматом Row1.Range.Font.Bold = 9999998; Row1.Range.Font.Size = 14; Row1.Range.Font.Name = "Verdana"; Row1.Range.ParagraphFormat.Alignment = 1; // Последняя строка... Row = Table.Rows.Add(); Row.Range.Font.Bold = 9999998; Row.Cells(1).Range.Text="Итого:"; Исключение Doc.Save(); Сообщить(ОписаниеОшибки()); Объект.Application.Quit(); Объект = Неопределено; КонецПопытки; Попытка // эта конструкция выдает исключительную ситуацию, но при этом // результат все-равно работает)) // объединяем ячейки в конце таблицы Table.cell(НомерСтроки+1, 1).Merge(Table.cell(НомерСтроки+1, 5)); Исключение КонецПопытки; Попытка Row.Cells(1).Range.ParagraphFormat.Alignment = 3; Row.Cells(2).Range.Text=Формат(Ссылка.Товары.Итог("Сумма"), "ЧДЦ=2"); Row.Cells(2).Range.ParagraphFormat.Alignment = 1; Doc.Save(); Объект.Application.Quit(); Объект = Неопределено; Исключение Doc.Save(); Сообщить(ОписаниеОшибки()); Объект.Application.Quit(); Объект = Неопределено; КонецПопытки; КонецПроцедуры |
Написал Nikola23 — http://infostart.ru/public/67727/