Создание документа без использования макета

Источники: http://infostart.ru/public/67727/

В качестве примера использования можно указать вот такую ситуацию: в зависимости от типа клиента (договора, документа и т.п) формируются разные тексты договоров с разным количеством таблиц. В реальности, конечно должны использоваться и макет и описанные здесь динамические механизмы.

В моем примере я заранее создал новый пустой документ.

Тестировалось на Office 2007.

Исп. переменные: "ПутьКФайлу" - строка. Полное имя файла в формате MSWord.

"Ссылка" - ДокументСсылка (в моем случае - счет).

Вот текст модуля:

Процедура ВыполнитьОбработку() Экспорт

Попытка Объект = ПолучитьCOMОбъект(ПутьКФайлу); // Покажем документ. Для красоты. Объект.Application.Visible = 1; Word = Объект.Application; Doc = Объект.Application.Documents(1); Doc.Activate(); // Готовим переменную в которой будет содержимое нашего документа // (текст, таблицы и проч). Text = Word.Selection; // Очистим документ // 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.Selection.MoveDown(,числострок); // вниз //Word.Selection.MoveLeft(,числострок); // влево //Word.Selection.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(); Объект = Неопределено; КонецПопытки; КонецПроцедуры