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

27.03.10

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Обработка - образец
.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 Управляемые формы Анализ и прогнозирование 1C:Бухгалтерия Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

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

28500 руб.

15.11.2022    22090    23    49    

39

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

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

84000 руб.

24.04.2017    52099    104    165    

91

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

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

120000 руб.

19.08.2020    25963    25    1    

27

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

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

84000 руб.

05.10.2022    11372    13    8    

15

Внешние источники данных Платформа 1С v8.3 1C:Бухгалтерия Платные (руб)

Готовая интеграция для управляемых форм. Встраивается в вашу 1С как расширение. Реализует автоматический обмен данными между 1С (1С:Фитнес клуб и аналогов) и СКУД RusGuard, автоматизирует бизнес-процессы по созданию и учету сотрудников в СКУД. Значительно упрощает работу специалистов отдела кадров и отдела безопасности: избавляет от двойного ввода информации в 1С и СКУД.

94999 руб.

11.07.2024    1080    1    0    

3

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

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

120000 руб.

07.06.2021    13528    2    3    

3

Розничная торговля Внешние источники данных Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Бухгалтерский учет 1С:Бухгалтерия 3.0 Фармацевтика, аптеки Россия Бухгалтерский учет Платные (руб)

Внешняя обработка загрузки данных из файла-выгрузки, сформированного в программе F3 TAIL версии 3.4 (и выше) или еФарма версии 2.1, в базу конфигурации 1С: Бухгалтерия предприятия 8, ред. 3.0 (базовая, ПРОФ, КОРП, ФРЕШ).

13200 руб.

19.12.2016    47973    90    105    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. codewriter 185 21.03.10 19:41 Сейчас в теме
А визуальнно что в итоге получится?
10. Vlad_M 78 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 706 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 706 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 706 22.02.18 14:34 Сейчас в теме
(15)
Запустите запись макроса, выполните все необходимые действия по копированию таблицы.
Код который подучится - адаптируйте для 1с.
2. Nikola23 706 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 706 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 706 06.06.24 10:28 Сейчас в теме
(9) запишите макрос в котором меняете размеры строки, посмотрите какими командами это делается
17. Max_Kammirer 04.08.21 15:23 Сейчас в теме
Доброго дня
Подскажите, может кто-то сталкивался, как програмно можно удалить или скрыть отображение Примечаний в Ворд, при выводе на печать через 1С
18. user640247 06.06.24 10:21 Сейчас в теме
добрый день.
а как изменить высоту строки?
19. Nikola23 706 06.06.24 10:28 Сейчас в теме
(18) запишите макрос в котором меняете размеры строки, посмотрите какими командами это делается
Оставьте свое сообщение