При сохранении табличного документа в word

« «договор из табличного документа… Самописная конфигурация… Менеджерам не удобно сохранять договор в эксель. Клиентам неудобно показывать.» — ну так напишите печатную форму Word для договора. В интернете куча инфы как написать, конфигурация — самописная, ТыжПрограммист :)»

«Делай своё сохраниение в ворд. С бриджем и весёлыми женщинами»

Я знаю, что можно сделать свое сохранение в ворд. Вначале я так и начал. Сделал договор, программно заполнил реквизиты в зависимости от организации и контрагента и все работало хорошо. Но потом договор стали дорабатывать очень сильно. Сам договор большой, плюс десять приложений. Договор отличается в зависимости от того отправляется он почтой или через ЭДО и от настроек контрагента. Во многих местах текст разный из-за настроек. Я этот текст менял программно. Но возникла проблема, что приложение или пункт договора иногда начиналось не с новой страницы. И не понятно почему. Отладка ворда занимает больше времени чем табличного документа. А мне надо было сделать еще 3 таких договора. И я решил сделать в макете. Все работает хорошо больше полгода. А теперь некоторым менеджерам хочется в ворде. Переделывать 4 договора в ворде заново не хочется. Поэтому я и спросил, может как то можно сохранить нормально в ворд.

Цитата: magnifico61 от 01 июн 2018, 11:40
Или как вариант вывести табличный документ в ворд через com.

Уверен, что в Word всё же надо?
Как не крути, но на своём опыте проверил, что 1С (8.2 по крайней мере) нормально сохраняет таб.документы только в 3 формата, один из которых «родной». Это mxl, xls и pdf. Во всех остальных начинаются искажения ширинвысот колонок и прочие визуальные глюки. Одна и та же печатная форма при сохранении в xls выглядит нормально, также как на экране, а в xlsx и docx таблица вытягивается как шея у жирафа, и такого видел немало — чем сложнее макет, тем больше искажений.
Я пытался в одной обработке программно сохранять ТабДок в Word, и это работало, хоть и выглядело некрасиво, но когда дал доступ пользователям, оказалось что при выполнении кода

ТабДок.Сохранить(ПутьКФайлу,ТипФайлаТабличногоДокумента.DOCX) у многих вообще 1С вылетает! Именно в этот формат, с другими всё в порядке, я проверял.
Всё это у меня напрочь отбило желание с Word связываться.

Если всё ещё есть желание мучаться с DOCX можно попробовать сохранить в HTML и пересохранить через КОМ объект, что-то типа

//ТабДок - твой документ
//ПутьКФайлу - куда нужно сохранить
Врем = ПолучитьИмяВременногоФайла("html");
ТабДок.Сохранить(Врем,ТипФайлаТабличногоДокумента.HTML);
Word = Новый COMОбъект("Word.Application");
Word.Visible = 0;
Word.Documents.Add(Врем);
ТекДок = Word.ActiveDocument;
ТекДок.SaveAs(ПутьКФайлу,16); //16 - формат файла по умолчанию для текущей версии офиса
Word.Application.Quit();

Писал по памяти, могут быть ошибки.
Так у меня работало, но результат, опять же не радовал, т.к. сбивались ширины, «уезжали» картинки и т.д.

2 / 2 / 0

Регистрация: 11.01.2013

Сообщений: 220

1

17.01.2022, 15:59. Показов 1198. Ответов 19


Студворк — интернет-сервис помощи студентам

Сохраняю табличный документ в ворд. В конце добавляется пустая страница. Как ее убрать?



0



262 / 218 / 94

Регистрация: 07.04.2011

Сообщений: 1,347

17.01.2022, 17:51

2

Для начала..
1.а как сохраняете?
2.В самом табдоке нет пустышки?



0



Yulunga

1155 / 702 / 203

Регистрация: 22.04.2013

Сообщений: 5,219

Записей в блоге: 1

17.01.2022, 17:56

3

а если написать

1C
1
вывестигоризонтальныйразделительстраниц()

— тоже?



0



hawk1

2 / 2 / 0

Регистрация: 11.01.2013

Сообщений: 220

18.01.2022, 12:24

 [ТС]

4

Yulunga, не помогает.
OverDozero, OverDozero, сохраняю вот так

1C
1
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.DOCX);



0



1832 / 1249 / 446

Регистрация: 16.01.2015

Сообщений: 5,459

18.01.2022, 12:35

5

hawk1, честно говоря, сталкивался с таким, но не разобрался. Помогало одно, сжимал последнюю страницу шаблона, тупо del удалял пробелы внизу страницы и пытался сжать весь текст последней страницы шаблона, чтобы внизу больше пространства оставалось. Понимаю, что «ненаучно», но выручало

Добавлено через 1 минуту
а, пардон. Речь не о выводе в макет ворд, а о сохранении ТД в ворд. ошибся



0



2 / 2 / 0

Регистрация: 11.01.2013

Сообщений: 220

18.01.2022, 22:51

 [ТС]

6

Вот пример выгруженного файла.



0



Модератор

Эксперт 1С

3711 / 2907 / 573

Регистрация: 10.03.2011

Сообщений: 11,447

Записей в блоге: 1

19.01.2022, 05:16

7

hawk1, у тебя что то с шириной строк в макете, посмотри в документе где заканчивается каждая строка.
Исправляй области по вертикали



0



2 / 2 / 0

Регистрация: 11.01.2013

Сообщений: 220

19.01.2022, 23:27

 [ТС]

8

Области исправил но проблема не решилась.



0



1155 / 702 / 203

Регистрация: 22.04.2013

Сообщений: 5,219

Записей в блоге: 1

19.01.2022, 23:58

9

а самое простое — что табдок двухстраничный, есть вероятность?
табдок.КоличествоСтраниц (PageCount)



0



hawk1

2 / 2 / 0

Регистрация: 11.01.2013

Сообщений: 220

20.01.2022, 14:37

 [ТС]

10

Yulunga, и как это убрать?

Добавлено через 31 минуту

1C
1
Сообщить(ТабДок.КоличествоСтраниц());

выводит 1.



0



Модератор

Эксперт 1С

3711 / 2907 / 573

Регистрация: 10.03.2011

Сообщений: 11,447

Записей в блоге: 1

21.01.2022, 00:50

11

hawk1, Что бы понять в чем проблема, выведи пустой табДок и сохрани в ворд.
Заполни один символ и сохрани в табДок

Если страницы не будет значит дело в содержимом Табличного документа!

Добавлено через 1 минуту

Не по теме:

(что то ты криво и косо выводишь, что аж майкрософт с тобой работать не хочет)



0



1155 / 702 / 203

Регистрация: 22.04.2013

Сообщений: 5,219

Записей в блоге: 1

21.01.2022, 01:01

12

судя по вордовскому файлу мне почемушто кажется, что дело в колонтитулах



0



262 / 218 / 94

Регистрация: 07.04.2011

Сообщений: 1,347

21.01.2022, 07:23

13

А если поставить в Ворде отображения непечатаемые знаков, то что на лишней странице показывается?Есть что-то?



0



2 / 2 / 0

Регистрация: 11.01.2013

Сообщений: 220

21.01.2022, 19:28

 [ТС]

14

OverDozero, нет ничего нет.
Yulunga, тоже думал об этом. Но каким должно быть соотншение полей и колонтитулов?



0



Модератор

Эксперт 1С

3711 / 2907 / 573

Регистрация: 10.03.2011

Сообщений: 11,447

Записей в блоге: 1

22.01.2022, 07:39

15

Не по теме:

Цитата
Сообщение от hawk1
Посмотреть сообщение

Но каким должно быть соотншение полей и колонтитулов?

напоминает передачу «хочу знать всё», уважаемые знатоки что в черном ящике?

hawk1, скиньте сюда код который формирует табличный документ (полностью весь)



0



2 / 2 / 0

Регистрация: 11.01.2013

Сообщений: 220

22.01.2022, 15:15

 [ТС]

16

Вот сама обработка



0



1155 / 702 / 203

Регистрация: 22.04.2013

Сообщений: 5,219

Записей в блоге: 1

22.01.2022, 15:24

17

то ли лыжы не едут, то ли я не вижу в макете
ДоговорПоставкиОборудованияПриложение
областей
ШапкаПриложения
и
СпецификацияЗаголовок

это точно правильно?



0



2 / 2 / 0

Регистрация: 11.01.2013

Сообщений: 220

22.01.2022, 15:51

 [ТС]

18

Yulunga, все области на месте

Миниатюры

Сохранение табличного документа в word пустая страница в конце
 



0



Модератор

Эксперт 1С

3711 / 2907 / 573

Регистрация: 10.03.2011

Сообщений: 11,447

Записей в блоге: 1

23.01.2022, 01:03

19

hawk1, Даю подсказку.
Попробуй сохранить в word не выводя область подвал

Добавлено через 3 минуты

Не по теме:

сам там галочек в ТабДоке натыкал, а теперь почему разрыв страницы выводиться))))))



0



2 / 2 / 0

Регистрация: 11.01.2013

Сообщений: 220

24.01.2022, 17:19

 [ТС]

20

Цитата
Сообщение от Dethmontt
Посмотреть сообщение

Попробуй сохранить в word не выводя область подвал

Помогло.
Осталось понять что не так с подвалом.



0



При сохранении печатной формы в docx съезжает вся разметка, т.е. не влазит текст по ширине, не выводится с новой страницы и т.д. Есть ли какие-нибудь универсальные способы для решения данной проблемы?

))парадоксально    прав напрямую в ворд сохранить не представляется возможным(парадокс заключается не в правоте а в том что табличные формы не очень дружат с вордом(можно сказать совсем не)), но всегда есть но,если есть острая необходимость сохранить именно в ворде то есть как минимум 2 выхода 1) шаблон в ворде заполнение через com просто со вкусом 2)сохранение в ексель конвертация в хтмл конвертация в ворд не совсем красиво но внешний вид сохраняться прилично сгодиться если разово

можно ли это как-то автоматизировать, что бы это делалось без участия пользователя?

Автоматизировать можно всё при желании.

смотри в сторону вордовского макета с полями

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

Итак, создадим таблицу Excel.

  1. Выберите команду меню Вставка ⇒ Таблица ⇒ Таблица Excel (Insert ⇒ Table ⇒ Excel Spreadsheet). При этом лента инструментов Word трансформируется в ленту инструментов Excel.
  2. Чтобы вернуться назад, нужно щелкнуть по свободной области документа Word.

Вы также можете вставить уже готовую таблицу Excel. Самый простой способ сводится к обычному копированию и последующей вставке таблицы Excel из документа соответствующего табличного редактора в документ Word. Выполните следующие шаги:

  1. откройте документ Excel и выделите с помощью мыши фрагмент таблицы или всю таблицу целиком, нажав сочетание клавиш Ctrl+A;
  2. на ленте инструментов Excel на вкладке Главная (Home) щелкните по кнопке Копировать (Copy);
  3. перейдите к документу Word и установите указатель мыши в том месте, где должна быть вставлена таблица;
  4. на ленте инструментов Word на вкладке Главная (Home) щелкните мышью по кнопке Вставить (Insert);
  5. на экране рядом со вставленной таблицей появится всплывающее меню Параметры вставки (Paste Options) (рис. 6.4).

В соответствии с вашими целями выберите один из вариантов форматирования таблицы, щелкнув мышью по одной из пиктограмм.

  • Если вы щелкнете по пиктограмме Сохранить исходное форматирование (Keep Source Formatting), то таблица сохранится в том же виде, как она выглядела в табличном редакторе Excel.
  • Если вы щелкнете по пиктограмме Использовать стили конечного фрагмента (Use Destination Styles), то таблица будет отформатирована в соответствии с выбранным в программе Word стилем форматирования.
  • Если вы щелкнете по пиктограмме Вставить как рисунок (Picture), то таблица будет представлена в виде рисунка. В данном случае вы уже не сможете изменить размеры таблицы или ввести в нее новые данные, но вам также и не придется затрачивать время на то, чтобы края таблицы не выезжали за область документа.
  • Если вы щелкнете по пиктограмме Сохранить только текст (Keep Text only), то каждая строка таблицы будет представлена в виде нового абзаца, а данные из разных ячеек будут разделены знаками табуляции.

Мы рассмотрели варианты, которые позволяют вставить таблицу Excel в качестве внедренного объекта, то есть таблица Excel становится частью документа Word. Чтобы данные в таблице обновлялись каждый раз, когда вы вносите изменения в документ Excel, вы можете вставить таблицу в качестве связанного объекта. Для этого:

  1. в программе Excel выделите полный лист или диапазон ячеек;
  2. скопируйте выделенный фрагмент, используя сочетание клавиш Ctrl+C.

    [box color=primechanie]Вы также можете воспользоваться другими вариантами копирования:

    • щелкните по выделению правой кнопкой мыши и выберите в открывшемся контекстном меню команду Копировать (Copy);
    • на ленте инструментов табличного редактора Excel на вкладке Главная (Home) выберите команду меню Буфер обмена ⇒ Копировать (Clipboard ⇒ Copy).

    [/box]

  3. переключитесь в документ Word и щелкните мышью в позиции, куда необходимо вставить таблицу;
  4. на вкладке Главная (Home) выберите команду меню Буфер обмена ⇒ Вставить ⇒ Специальная вставка (Clipboard ⇒ Paste ⇒ Paste special). Откроется диалоговое окно Специальная вставка (Paste special);
  5. в списке выделите объект Microsoft Office Excel Worksheet (объект) (Microsoft Excel Worksheet Object);
  6. установите переключатель в положение Связать (Paste link), чтобы связать таблицу Excel с документом Word (рис. 6.5).

Рис. 6.5. Диалоговое окно Специальная вставка

Теперь каждый раз при открытии документа Word на экране будет появляться диалоговое окно, содержащее вопрос: нужно ли обновить в документе данные, связанные с другими файлами, то есть в данном случае с документом Excel.

[box color=primechanie]Если для вас нежелательно автоматическое обновление данных, то выберите команду меню Файл ⇒ Параметры (File ⇒ Options). В открывшемся диалоговом окне Параметры Word (Word Options) перейдите в раздел Дополнительно (Advanced) и сбросьте флажок Автоматически обновлять связи при открытии (Update automatic links at open).[/box]

Вставка таблицы в документ Word

Пример вставки таблицы в Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//определяем место вставки
Range = Doc.Range(0);
//создаем таблицу 2х2
Table = Doc.Tables.Add(Range, 2, 2);
Table.Style = "Сетка таблицы";

//определяем ширину столбцов
Table.columns(1).Width = 20;
Table.columns(2).Width = 50;

//заполняем первую строку
Table.Cell(1, 1).Select();
Word.Selection.Font.Bold = Истина;
Word.Selection.TypeText("1");
Table.Cell(1, 2).Select();
Word.Selection.TypeText("Один");

//заполняем вторую строку
Table.Cell(2, 1).Select();
Word.Selection.Font.Bold = Истина;
Word.Selection.TypeText("2");
Table.Cell(2, 2).Select();
Word.Selection.TypeText("Два");

//показываем документ на экране
Word.Visible = Истина;
Вставка текста в документ Word

Пример вставки текста в документ Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//добавляем пустой документ
Doc = Word.Documents.Add();

//добавляем 10 параграфов
Для Н = 1 По 10 Цикл
    Par = Doc.Paragraphs.Add();
    Par.Range.InsertBefore("Параграф №" + Н);
КонецЦикла;

//вставляем текст в начало докуменета
Range = Doc.Range(0);
Range.InsertBefore("Начало!" + Символы.ПС);

//вставляем текст после 16-го символа
Range = Doc.Range(16, 16);
Range.InsertAfter("[Вставка]");

//показываем документ на экране
Word.Visible = Истина;
Выделение текста

Пример выделения текста в документе Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Выделяемый текст");

//выделяем первое слово
Doc.Range(0, 10).Select();

//копируем выделение в буфер обмена
Word.Selection.Copy();

//меняем размер шрифта и т.д.
Word.Selection.Font.Size = 16;

//показываем документ на экране
Word.Visible = Истина;
Выравнивание текста

Пример выравнивания текста в документе Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Заголовок");
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Выравниваем этот текст");

//0 - по левому краю
//1 - по центру
//2 - по правому краю
//3 - по ширине
//текущей параграф по центру
Par.Alignment = 1;
//заголовок по правому краю
Doc.Paragraphs(1).Alignment = 2;

//показываем документ на экране
Word.Visible = Истина;
Замена текста в документе Word

Пример замены текста в документе Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Сбербанк ИНН/КПП: [ИНН]/[КПП]");

//заменяем ИНН
Word.Selection.Find.Text = "[ИНН]";
Word.Selection.Find.Replacement.Text = "7707083893";
Word.Selection.Find.Execute(, , , , , , , , , , 2);

//заменяем КПП
Word.Selection.Find.Text = "[КПП]";
Word.Selection.Find.Replacement.Text = "773601001";
Word.Selection.Find.Execute(, , , , , , , , , , 2);

//показываем документ на экране
Word.Visible = Истина;
Открытие документа Word

Пример открытия документа Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//открываем документ C:tmp1.docx
Word.Documents.Add("C:tmp1.docx");

//показываем документ на экране
Word.Visible = Истина;

Для открытия документа можно использовать два метода коллекции Documents. Первый — Open() приведен выше, второй — Add().

Метод Open() открывает файл для редактирования в Ворде, документ остается связанным с этим файлом — в заголовке окна Ворд указывается имя файла. Открыть можно любой файл, поддерживаемый Вордом, формат файла при редактировании не меняется. Например, открыли файл .rtf, отредактировали, сохранили, файл остался .rtf. Открывать непосредственно шаблон из папки, в которой хранятся шаблоны таким способом не стоит. Если что-то произойдет не так, например, сработает автосохранение в Ворде, шаблон будет испорчен. Сначала файл шаблона следует скопировать (при работе в клиент-серверном варианте это само собой разумеющиеся действие), а потом можно открывать.

Метод Add() создает новый документ на основании указанного шаблона. Шаблоном может быть любой файл, не обязательно родные для Ворда .doc или .docx или .dot. Открытый документ с файлом-шаблоном не связывается, в заголовке окна Ворд будет надпись «Документ1 — Word». При этом информация о формате исходного файла не сохраняется. Открывается просто документ Ворд, содержащий в себе всю информацию из указанного файла. При сохранении без явного указания типа файла он будет сохранен как .docx. Единственное исключение — документ, открытый на основе файла .doc, такие документы по умолчанию сохраняются в файлы .doc. Метод Add() можно использовать для создания документов на основании оригинала шаблона, шаблон повредить невозможно даже случайно.

Методы Open() и Add() являются функциями, т.е. возвращают значение. Причем возвращают они ссылку на новый документ. И ловить потом этот документ в коллекции Documents нам не нужно, ссылку можно сразу сохранить в переменной для дальнейшего использования. Таким образом, для открытия используются следующие команды:

Документ = Word.Documents.Open («C:готовые документыфайл.docx»);

Или

Документ = Word.Documents.Add («C:шаблоныфайл.docx»);

Преобразование в таблицу

Пример преобразования документа Word в таблицу из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Таблица умножения:");

//формируем строку с разделителями
Сторока = "";
Для Н1 = 1 По 9 Цикл
    Для Н2 = 1 По 9 Цикл
        Сторока = Сторока + Н1 * Н2 + ?(
            Н2 = 9, "", Символы.Таб);
    КонецЦикла;
    Сторока = Сторока + Символы.ПС;
КонецЦикла;
Par.Range.InsertAfter(Сторока);

//переходим на строчку вниз
Word.Selection.MoveDown(5, 1, 0);
//выделяем таблицу
Word.Selection.MoveDown(5, 9, 1);

//конвертируем текст в таблицу
Word.Selection.ConvertToTable(1, 9, 9, 0);
Word.Selection.Tables(1).Style = "Сетка таблицы";

//показываем документ на экране
Word.Visible = Истина;
Создание документа Word

Пример создания документа Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//показываем документ на экране
Word.Visible = Истина;
Сохранение документа

Пример сохранения документа Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Сохраняемый текст");

//сохраняем документ в файл
Doc.SaveAs("C:tmp2.docx");

//закрываем документ
Doc.Close();
Word.Quit();

Иногда после сохранения файла нужно узнать его полное имя, т.е. включая путь и расширение. Например, чтобы отправить файл по электронной почте или записать в базу. Если мы сохранили файл методом SaveAs(), то полного имени мы не знаем, ведь расширение к имени файла добавил Ворд. Ну так из Ворда же полное имя можно получить, у документа есть доступное для чтения свойство FullName:

ПолноеИмяФайла = Документ.FullName;

Завершение работы с СОМ-Объектом рекомендуют (неправильно) делать так:

Документ.Close();
Word.Quit(0);

На первый взгляд, можно и не заметить нолик в параметре метода Quit(). А он важен. Это просто константа wdDoNotSaveChanges :-). Закрыться-то Ворд закроется, вместе со всеми файлами, которые пользователь, возможно, открыл и редактирует.

Если мы исходим из предположения, а мы из него исходим, что пользователь может работать интерактивно со своими собственными файлами, которые могут быть открыты в том же экземпляре Ворда, что и наш СОМ-Объект, то торопиться принудительно выгонять пользователей и закрывать экземпляр приложения не стоит. Можно проверить, есть ли еще открытые документы, кроме нашего. Если есть, не закрывать экземпляр Ворда, пусть пользователь спокойно работает, если других документов нет — закрыть:

Документ.Close();
Если (Word.Documents.Count = 0) Тогда
Word.Quit();
КонецЕсли;

Удаление текста из документа Word

Пример удаления текста из документа Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Некоторый текст");

//удаляем слово некоторый и пробел
Range = Doc.Range(0, 10);
Range.Text = "";

//показываем документ на экране
Word.Visible = Истина;
Форматирование текста в документе Word

Пример форматирования текста в документе Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//создаем новый документ
Doc = Word.Documents.Add();

//добавляем параграф
Par = Doc.Paragraphs.Add();
Par.Range.InsertBefore("Форматируем этот текст");
//меняем размер шрифта
Par.Range.Font.Size = 15;
//меняем название шрифта
Par.Range.Font.Name = "Verdana";

//выбираем слово "этот"
Range = Doc.Range(12, 16);
//меняем шрифт на ширный
Range.Font.Bold = Истина;
//курсив
Range.Font.Italic = Истина;
//подчеркнутый
Range.Font.Underline = Истина;
//красный
Range.Font.Color = 13311;

//показываем документ на экране
Word.Visible = Истина;
Чтение текста документа Word

Пример чтения текста из документа Word из 1С

//создаем объект для работы с Word
Word = Новый COMОбъект("Word.Application");

//открываем документ C:tmp1.docx
Doc = Word.Documents.Open("C:tmp1.docx");

//читаем весь текст документа
Text = doc.Content.Text;
Сообщить(Text);

//читаем с 6-го по 10-й символ
From = 6;
To = 10;
Range = Doc.Range(From, To);
Text = Range.Text;
Сообщить(Text);

//закрыть документ
Doc.Close();
Word.Quit();

Вставка картинок

Все картинки в документе Ворд делятся на два вида — вставленные как символ в текст и произвольно расположенные в графическом слое документа (текст их может либо обтекать, либо нет, зависит от параметров каждого объекта). Первый вид картинок представляется объектом InlineShape и доступен в коллекции InlineShapes. Второй вид — объектом Shape и доступен в коллекции Shapes документа. Для деловых документов возиться с размещением картинок в графическом слое нет смысла, достаточно объектов InlineShape.

Принцип прост, находим соответствующий якорь и заменяем его картинкой:

Range = Документ.Range();
Range.Find.Execute(«$[ЯкорьКартинки]$»);
Range.Text = «»;
Документ.InlineShapes.AddPicture (ИмяФайлаКартинки,,, Range);

/// Как создать документ Word на основе шаблона из 1с 8.3, 8.2
 
&НаКлиенте
Функция КакСоздатьДокументWordНаОсновеШаблона(ПутьКШаблону)
 
    // В шаблоне уже расставлены поля с определенными
    // именами, например, org_name, inn, kpp и т.д.
    // Наша задача - заполнить эти поля и сохранить
    // этот шаблон в виде вордовкского файла с
    // расширением docx;
 
    // Сам шаблон мы создали по инструкции отсюда:
    // helpme1s.ru/kak-sozdavat-shablony-word-dlya-ispolzovaniya-v-1s
 
    // Или взяли готовым отсюда:
    // helpme1s.ru/files/ref/bill.dotx
 
    ПриложениеВорд = Новый COMОбъект("Word.Application");
    ОбъектШаблон = ПриложениеВорд.Documents.Add(ПутьКШаблону);
 
    Для Каждого Поле Из ОбъектШаблон.Fields Цикл
        ПолноеИмяПоля = Поле.Code.Text;
 
        // Наши предопределенные поля имеют такой
        // вид: " MERGEFIELD  org_name  * MERGEFORMAT".
        // Наша задача - вытащить из этой конструкции org_name
        // (ну или другое имя, которое мы задали в ворде).
 
        Если (Найти(ПолноеИмяПоля, " MERGEFIELD") = 1) Тогда
            ПозицияСлеша = Найти(ПолноеИмяПоля, "*");
            КороткоеИмяПоля = СокрЛП(Сред(ПолноеИмяПоля, 12, ПозицияСлеша - 12));
 
            ЗначениеПоля = "";
 
            Если КороткоеИмяПоля = "id" Тогда
                ЗначениеПоля = "1";
            ИначеЕсли КороткоеИмяПоля = "bill_date" Тогда
                ЗначениеПоля = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
            ИначеЕсли КороткоеИмяПоля = "org_name" Тогда
                ЗначениеПоля = "ООО ""Ромашка""";
            ИначеЕсли КороткоеИмяПоля = "inn" Тогда
                ЗначениеПоля = "1234567890";
            ИначеЕсли КороткоеИмяПоля = "kpp" Тогда
                ЗначениеПоля = "123456789";
            Иначе
                // ... и так все нужные поля
            КонецЕсли;
 
            Если ЗначениеПоля <> "" Тогда
                Поле.Select();
                ОбъектШаблон.Application.Selection.TypeText(ЗначениеПоля);
            КонецЕсли;            
        КонецЕсли;
    КонецЦикла;
 
    // Запишем файл в папку "Мои документы" пользователя
    ФайлДляЗаписи = КаталогДокументов() + "helpme1c_ru_word_test.docx";
 
    // Если такой файл уже существует - удалим его.
    УдалитьФайлы(ФайлДляЗаписи);
    // Сохраняем шаблон как документ Word с расширением docx.
    ОбъектШаблон.SaveAs(ФайлДляЗаписи);
    // Не забываем закрыть приложение Word.
    ОбъектШаблон.Application.Quit();
 
    Возврат ФайлДляЗаписи;
 
КонецФункции

Особенности работы с колонтитулами

Перебор всех колонтитулов выполняется так:

WdReplaceAll = 2; Для Каждого Section Из Документ.Sections Цикл Для Каждого Header Из Section.Headers Цикл Range = Header.Range; Range.Find.Execute("$(якорь)$",,,,,,,,, "значение", wdReplaceAll); КонецЦикла; Для Каждого Footer Из Section.Footers Цикл Range = Footer.Range; Range.Find.Execute("$(якорь)$",,,,,,,,, "значение", wdReplaceAll); КонецЦикла КонецЦикла;

Более лаконичное решение заключается в использовании коллекции StoryRanges. Эта коллекция содержит диапазоны (range) всех блоков(?), частей(?) (в справке используется термин story) документа. Тело документа, это главный блок (main story), тоже есть в этой коллекции. Т.е. необязательно искать якоря отдельно в теле документа, отдельно в колонтитулах, все можно сделать одним циклом:

Для Каждого Range Из Документ.StoryRanges Цикл Range.Find.Execute("$(якорь)$",,,,,,,,, "значение", wdReplaceAll); КонецЦикла;

Объектная модель Ворд

Ворд, запущенный в качестве СОМ-Объекта, предоставляет доступ к множеству объектов приложения. Понятие «объект» такое же как везде — программная абстракция, имеющая методы и свойства. Методы могут быть как процедурами, так и функциями, при этом функции можно вызывать как процедуры, игнорируя возвращаемое значение. Свойства могут быть либо объектами, либо обычными (скалярными, примитивными) данными, такими как число, строка, логический тип.

Среди объектов особо выделяются специальные объекты-контейнеры, называемые коллекциями. Каждая коллекция предназначена для хранения ссылок на группу однотипных объектов. Например, коллекция Documents хранит ссылки на объекты Document, коллекция Tables хранит ссылки на объекты Table и т.д. Все коллекции именованы во множественном числе, а обычные объекты в единственном. Нумерация объектов в коллекции начинается с единицы. Коллекции Ворд можно перебирать циклом «Для каждого» языка программирования 1С.

Полный список объектов можно, и нужно, смотреть в справочной системе Ворд (раздел справки по Вижуал Бейсику (VBA)). Для старых версий справка откроется локально на компьютере пользователя. Новые версии отправят на сайт Майкрософт: https://docs.microsoft.com/ru-ru/office/vba/api/overview/word/object-model Текст переведен с английского автоматически и местами понять написанное невозможно. Переключение на английский оригинал делается очень просто, достаточно нажать кнопочку «почитать на английском» в правом верхнем углу страницы. Или в адресе ссылки «ru-ru» заменить на «en-us»: https://docs.microsoft.com/en-us/office/vba/api/overview/word/object-model

Многие методы объектов Ворда в качестве параметров принимают числовые значения. Для того, чтобы не путаться в числовых значениях, в Вижуал Бейсике предусмотрены именованные константы. Например, константа wdFormatRTF соответствует числу 6. В Вижуал Бейсике можно писать код так:

Document.SaveAs («имя файла», wdFormatRTF)

Вне VBA именованные константы недоступны, поэтому код 1С будет таким:

Document.SaveAs («имя файла», 6)

Или, без “магических” чисел, таким:

wdFormatRTF = 6;
Document.SaveAs («имя файла», wdFormatRTF);

Я предпочитаю последний вариант.

Значения всех констант нужно смотреть в справочной системе, там они объединены в смысловые группы, называемые «перечисления» (Enumerations): https://docs.microsoft.com/ru-ru/office/vba/api/word(enumerations)

Смотрите также:
Электронный учебник по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Игра «Кто хочет стать миллионером?» с вопросами на определенную тематику (язык программирования JavaScript, английские, немецкие, французские, испанские, португальские, ни­дер­ландские, итальянские слова, электробезопасность, промышленная безопасность, бокс и т.п.), написанная на 1С
Программирование в 1С 8.3 с нуля — краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

Понравилась статья? Поделить с друзьями:
  • При сохранении табличного документа в excel
  • При экспорте документа в редактор word с помощью кнопки пиктографического меню необходимо чтобы
  • При сохранении рабочая книга excel получает расширение по умолчанию
  • При формулы в строке формул таблицы excel
  • При сохранении документов в word допустимы расширения имен файлов