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

27.03.10

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

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

Скачать исходный код

Наименование Файл Версия Размер
Обработка - образец
.epf 9,06Kb
152
.epf 9,06Kb 152 Скачать

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

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

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

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

См. также

Перенос данных из Парус 8 в ЗГУ 3

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

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

84000 руб.

19.08.2020    22570    19    1    

22

Перенос данных из Парус 10 в ЗГУ ред.3

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

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

60000 руб.

05.10.2022    9289    9    8    

11

Перенос данных из Парус 7.хх в ЗГУ ред.3

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

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

24000 руб.

24.04.2017    48799    96    163    

86

Перенос данных из Парус 10 (Торнадо) в ЗГУ ред.3 через Excel

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

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

24000 руб.

16.11.2018    30064    20    31    

21

Загрузка спецификаций в УНФ из системы Базис-мебельщик

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

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

7200 руб.

24.06.2021    19271    52    50    

29
Комментарии
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. codewriter 176 21.03.10 19:41 Сейчас в теме
А визуальнно что в итоге получится?
10. Vlad_M 74 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 698 21.07.16 09:20 Сейчас в теме
(11) kapafla, предлагаю копать код. Гарантирую, что у объединенной ячейки есть свойство типа Merged или что-то подобное.
13. advanter 42 01.11.17 14:03 Сейчас в теме
// Выравнивание по левому краю
Row.Cells(1).Range.ParagraphFormat.Alignment = 1;

По верхнему краю (wdCellAlignVerticalTop) - 0
По центру (wdCellAlignVerticalCenter) - 1
По нижнему краю (wdCellAlignVerticalBottom) - 3
14. Nikola23 698 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 698 22.02.18 14:34 Сейчас в теме
(15)
Запустите запись макроса, выполните все необходимые действия по копированию таблицы.
Код который подучится - адаптируйте для 1с.
2. Nikola23 698 21.03.10 20:15 Сейчас в теме
Добавил картинку. Хотя суть примера не в конкретном результате.
3. triera2000 7 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 698 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:
17. Max_Kammirer 04.08.21 15:23 Сейчас в теме
Доброго дня
Подскажите, может кто-то сталкивался, как програмно можно удалить или скрыть отображение Примечаний в Ворд, при выводе на печать через 1С
Оставьте свое сообщение