Пример работы с Word через OLE. Часть 1. Создание документа без использования макетов.

27.03.10

Интеграция - Внешние источники данных

Кроме прочего в статье присутствует пример создания таблицы с любым количеством колонок и столбцов. Несколько строк с форматированием текста и таблицы. Создание "объединенных" ячеек.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование SM По подписке [?] Купить один файл
Обработка - образец
.epf 9,06Kb
152
152
1 SM
Скачать Купить за 1 850 руб.

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

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

Тестировалось на 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();
       
Объект = Неопределено;
    КонецПопытки;

КонецПроцедуры

См. также

Внешние источники данных Программист Бизнес-аналитик Пользователь Платформа 1С v8.3 Управляемые формы Анализ и прогнозирование Конфигурации 1cv8 Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.

15.11.2022    16740    17    SQV0    48    

35

Зарплата Внешние источники данных Бюджетный учет Системный администратор Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    23327    21    1    

24

Внешние источники данных Загрузка и выгрузка в Excel Зарплата Бюджетный учет Системный администратор Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате из Парус 10(Торнадо) учреждений через файлы Excel в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ). В принципе, обработка может быть использована для загрузки из файлов Excel, полученных из любых информационных систем.

48000 руб.

16.11.2018    30316    21    31    

22

Производство готовой продукции (работ, услуг) Внешние источники данных Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 Лесное и деревообрабатывающее хозяйство Россия Управленческий учет Платные (руб)

Обработка предназначена для загрузки файлов, выгруженных из системы Базис-мебельщик, в справочник 1С "Спецификации" для последующих процессов учета и диспетчирования полуфабрикатов и изделий.

10200 руб.

24.06.2021    19839    53    53    

31
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. codewriter 182 21.03.10 19:41 Сейчас в теме
А визуальнно что в итоге получится?
10. Vlad_M 76 12.09.11 16:08 Сейчас в теме
Вот в таком варианте объединение ячеек не вызывает исключения:
Row.Cells(1).Merge(Row.Cells(5));
11. kapafla 20.07.16 15:37 Сейчас в теме
        // объединяем ячейки в конце таблицы
        Table.cell(НомерСтроки+1, 1).Merge(Table.cell(НомерСтроки+1, 5));

Скажите, а как в документе наоборот найти объединенные ячейки, или просто установить факт того, что например Документ.Tables(1) содержит объединенные ячейки.... Мне просто нужно прервать цикл загрузки документа, если в таблице есть объединенные ячейки
Спасибо заранее...
12. Nikola23 702 21.07.16 09:20 Сейчас в теме
(11) kapafla, предлагаю копать код. Гарантирую, что у объединенной ячейки есть свойство типа Merged или что-то подобное.
13. advanter 43 01.11.17 14:03 Сейчас в теме
// Выравнивание по левому краю
Row.Cells(1).Range.ParagraphFormat.Alignment = 1;

По верхнему краю (wdCellAlignVerticalTop) - 0
По центру (wdCellAlignVerticalCenter) - 1
По нижнему краю (wdCellAlignVerticalBottom) - 3
14. Nikola23 702 01.11.17 14:16 Сейчас в теме
(13) Вероятно, с годами константы изменились. Разработка велась лет много назад. Офис был по-моему 2010.
15. sulitckaja 22.02.18 06:20 Сейчас в теме
Может сможет подсказать кто, как в документе Word скопировать и вставить ниже уже существующую таблицу.
Делаю так:
Шаблон = Новый COMОбъект("Word.Application");
Шаблон.Documents.Open(ИмяФайлаПолное);
Шаблон.Application.Documents(1).Content.Tables(1).Range.Copy();
Шаблон.Application.Documents(1).Content.InsertParagraphAfter();
Шаблон.Application.Documents(1).Content.Paste();

В результате таблица копируется но весь текст и предыдущая таблица исчезает.

Заранее благодарна.
16. Nikola23 702 22.02.18 14:34 Сейчас в теме
(15)
Запустите запись макроса, выполните все необходимые действия по копированию таблицы.
Код который подучится - адаптируйте для 1с.
2. Nikola23 702 21.03.10 20:15 Сейчас в теме
Добавил картинку. Хотя суть примера не в конкретном результате.
3. triera2000 8 24.03.10 09:09 Сейчас в теме
ЗдОрово, буду пользовать, спасибо!
4. ZiZu 08.05.10 18:02 Сейчас в теме
Word.Selection.MoveDown(,числострок); // вниз
Word.Selection.MoveLeft(,числострок); // влево
Word.Selection.MoveRight(,числострок);// вправо
У меня с параметрами не ругаются.
Опустил курсор тупо в цикле Word.Selection.MoveDown()
5. ZiZu 08.05.10 18:04 Сейчас в теме
Правда Офис тот что с виндой)) :idea:
6. Nikola23 702 08.05.10 20:48 Сейчас в теме
У меня с параметрами не ругаются.

В каком смысле? Я вроде не писал, что с параметрами ругаются...
7. mike2005 06.10.10 09:40 Сейчас в теме
:?:Есть предположения как в выведенной строке (у конкретной ячейки, строки убрать границу полностью или установить кокретную), т.е. нарисовать линии так как необходимо
8. evg61 19.10.10 12:32 Сейчас в теме
Здравствуйте, Nikola23!
Спасибо за представленный материал! Очень много полезных ньюансов! Когда начал пробовать чтото добавить возникли вопросы, например:
То что можно в файле Word записать макрос и разобрать код понятно. Вопрос в том, как его правильно перенести в среду 1с8.1 Можете подсказать источник, где бы этот вопрос был подробно расписан?
А еще столкнулся с такой проблемой. Может быть поможете... Вставляю картинку в Файл Word. При выполнении Объект.Application.Visible = 1 он отображается в масштабе 75%. Я вставляю в него картинку. Сохраняюю Все получается. При открытии этого файла в масштабе 100% картинка увеличивается в размерах. Как корректно выполнять вставку картинки?
Спасибо!
9. Мария_19 27.01.11 16:17 Сейчас в теме
(0) Формула для объединения ячеек в таблице Table.cell(i+1,3).merge(Table.cell(i+1,4));
Не подскажите, а какая для разбиения?
Или где искать? :oops:
20. Nikola23 702 06.06.24 10:28 Сейчас в теме
(9) запишите макрос в котором меняете размеры строки, посмотрите какими командами это делается
17. Max_Kammirer 04.08.21 15:23 Сейчас в теме
Доброго дня
Подскажите, может кто-то сталкивался, как програмно можно удалить или скрыть отображение Примечаний в Ворд, при выводе на печать через 1С
18. user640247 06.06.24 10:21 Сейчас в теме
добрый день.
а как изменить высоту строки?
19. Nikola23 702 06.06.24 10:28 Сейчас в теме
(18) запишите макрос в котором меняете размеры строки, посмотрите какими командами это делается
Оставьте свое сообщение