Как открыть файл word программно

Skip to content

Открыть файл из 1С программно (word, excel, pdf и т.д.)

Открыть файл из 1С программно (word, excel, pdf и т. д.)

С помощью данного способа можно открывать любые файлы на компьютере из 1С. Открываться файлы будут с помощью программ/приложений выбранных по умолчанию, для запуска данного типа файла. Например .xls файлы будут запускаться с помощью Excel, .doc — с помощью Word, .pptx — с помощью Power point. Word, excel, power point также должны быть установлены на компьютере.

Пример программного кода:

&НаКлиенте
Процедура ОткрытьФайл(Команда)
	ЗапуститьПриложение("G:Руслан и Людмила.xlsx");
КонецПроцедуры

Файл из данного примера запустится в excel.

Также читайте:

  • Программное чтение, редактирование word;
  • Программное чтение, редактирование excel;

Связанные статьи

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.XPath;
using Word = Microsoft.Office.Interop.Word;
using InfoPath = Microsoft.Office.Interop.InfoPath;
 
namespace MSOffice
{
    public class cWord : cOffice
    {
        Word.Application wordapp;
        Word.Document worddocument;
        DataTable table;
        Word.WdReplace replace = Word.WdReplace.wdReplaceOne;
 
        public cWord()
        {
            //Создаем объект Word - равносильно запуску Word
            wordapp = new Word.Application();
        }
 
        public override void OpenFile(string sTemplate, XmlDocument xmlDoc)
        {
            try
            {
                fProcess process = new fProcess();
 
                XmlNodeList xnl = xmlDoc.SelectNodes("/root[@type="table"]");
                if (xnl.Count != 0)
                {
                    //Делаем его видимым
                    Object template = string.Format("{0}\{1}", Directory.GetCurrentDirectory(), sTemplate);
                    Object newTemplate = false;
                    Object documentType = Word.WdNewDocumentType.wdNewBlankDocument;
                    Object visible = true;
 
                    //Создаем документ
                    worddocument = wordapp.Documents.Add(ref template, ref newTemplate, ref documentType, ref visible);
                    wordapp.Visible = true;
                    int tables = worddocument.Tables.Count;
                    replace = Word.WdReplace.wdReplaceAll;
                    SearchAndReplace("$YN$", DateTime.Now.Year.ToString());
                    replace = Word.WdReplace.wdReplaceOne;
                    if (tables != 0)
                    {
                        //process.Show();
                        for (int idx = 1; idx <= worddocument.Tables.Count; idx++)
                        {
                            xnl = xmlDoc.SelectNodes("//table");
                            for (int index = 0; index < xnl.Count; index++)
                            {
                                XmlNodeList xnl2 = xnl[index].SelectNodes("//row");
                                bool change = false;
                                Word.Range rng = null;
                                for (int i = 0; i < xnl2.Count; i++)
                                {
                                    if (!change)
                                    {
                                        rng = worddocument.Tables[idx].Rows[2].Range;
                                        rng.Font.Size = 12;
                                        rng.Font.Name = "New Time Romand";
                                        rng.Font.Bold = 0;
                                        rng.Select();
                                        rng.Copy();
                                        change = true;
                                    }
                                    object start = worddocument.Tables[idx].Range.End;
                                    object end = worddocument.Tables[idx].Range.End;
                                    rng = worddocument.Range(ref start, ref end);
 
                                    SearchAndReplace("##", (i + 1).ToString());
                                    for (int j = 0; j < xnl2[i].ChildNodes.Count; j++)
                                    {
                                        SearchAndReplace("$" + xnl2[i].ChildNodes[j].Attributes[0].InnerText + "$", xnl2[i].ChildNodes[j].InnerText);
 
                                    }
                                    if (i != (xnl2.Count - 1))
                                        rng.Paste();
                                }
                            }
                        }
                        CloseDoc(worddocument);
                        //process.Close();
                    }
                    xnl = xmlDoc.SelectNodes("//root");
                    for (int i = 0; i < xnl.Count; i++)
                    {
                        for (int j = 0; j < xnl[i].ChildNodes.Count; j++)
                        {
                            if (xnl[i].ChildNodes[j].Name.CompareTo("table") != 0)
                                SearchAndReplace("$" + xnl[i].ChildNodes[j].Name + "$", xnl[i].ChildNodes[j].InnerText);
                        }
                    }
                }
 
                xnl = xmlDoc.SelectNodes("/root[@type="single"]");
 
                if (xnl.Count != 0)
                {
                    xnl = xmlDoc.SelectNodes("//document");
                    process.Show();
                    for (int i = 0; i < xnl.Count; i++)
                    {
                        process.pbProc.Value = (i + 1) * 100 / xnl.Count;
                        //Делаем его видимым
                        Object template = string.Format("{0}\{1}", Directory.GetCurrentDirectory(), sTemplate);
                        Object newTemplate = false;
                        Object documentType = Word.WdNewDocumentType.wdNewBlankDocument;
                        Object visible = true;
 
                        //Создаем документ
                        worddocument = wordapp.Documents.Add(ref template, ref newTemplate, ref documentType, ref visible);
                        wordapp.Visible = true;
 
                        replace = Word.WdReplace.wdReplaceAll;
                        SearchAndReplace("$YN$", DateTime.Now.Year.ToString());
                        replace = Word.WdReplace.wdReplaceOne;
 
                        XmlNodeList xnl2 = xnl[i].SelectNodes("item[@name="fioStudH"]");
                        string name = "";
                        if (xnl2.Count != 0)
                            name = xnl2[0].InnerText;
 
                        for (int j = 0; j < xnl[i].ChildNodes.Count; j++)
                        {
                            if (xnl[i].ChildNodes[j].Attributes[0].Value.CompareTo("SCode") == 0 || xnl[i].ChildNodes[j].Attributes[0].Value.CompareTo("SpecialityC") == 0)
                                replace = Word.WdReplace.wdReplaceAll;
                            else
                                replace = Word.WdReplace.wdReplaceOne;
                            SearchAndReplace("$" + xnl[i].ChildNodes[j].Attributes[0].Value + "$", xnl[i].ChildNodes[j].InnerText);
                        }
                        replace = Word.WdReplace.wdReplaceAll;
                        for (int j = 0; j < xnl[i].ChildNodes.Count; j++)
                        {
                            SearchAndReplace("$" + xnl[i].ChildNodes[j].Attributes[0].Value + "$", "");
                        }
                        xnl2 = xmlDoc.SelectNodes("/root/filename");
                        this.SaveDocument(string.Format("{0} {1}", xnl2[0].Attributes[0].Value, name));
                        CloseDoc(worddocument);
                    }
                    process.Close();
                }
 
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message);
                Close();
                return;
            }
        }
 
        public void AddDocument(string sTemplate, XmlDocument xmlDoc)
        {
 
        }
 
        private void CloseDoc(Word.Document worddocument)
        {
            Object saveChanges = Word.WdSaveOptions.wdPromptToSaveChanges;
            Object originalFormat = Type.Missing;
            Object routeDocument = Type.Missing;
            ((Word._Document)worddocument).Close(ref saveChanges, ref originalFormat, ref routeDocument);
        }
 
        public void SaveDocument(string strFileName)
        {
            Object fileName = string.Format("{1}\Documents\{0}.doc", strFileName, Directory.GetCurrentDirectory());
            Object fileFormat = Type.Missing;
            Object lockComments = Type.Missing;
            Object password = Type.Missing;
            Object addToRecentFiles = Type.Missing;
            Object writePassword = Type.Missing;
            Object readOnlyRecommended = Type.Missing;
            Object embedTrueTypeFonts = Type.Missing;
            Object saveNativePictureFormat = Type.Missing;
            Object saveFormsData = Type.Missing;
            Object saveAsAOCELetter = Type.Missing;
            Object encoding = Type.Missing;
            Object insertLineBreaks = Type.Missing;
            Object allowSubstitutions = Type.Missing;
            Object lineEnding = Type.Missing;
            Object addBiDiMarks = Type.Missing;
 
            worddocument.SaveAs(ref fileName, ref fileFormat, ref lockComments,
            ref password, ref addToRecentFiles, ref writePassword,
            ref readOnlyRecommended, ref embedTrueTypeFonts,
            ref saveNativePictureFormat, ref saveFormsData,
            ref saveAsAOCELetter, ref encoding, ref insertLineBreaks,
            ref allowSubstitutions, ref lineEnding, ref addBiDiMarks);
        }
 
        /// <summary>
        /// Поиск и замена текста
        /// </summary>
        public void SearchAndReplace(string find, string replace)
        {
            try
            {
                // Смещаем выделение к началу документа
                object Start = 0;
                object End = worddocument.Paragraphs[worddocument.Paragraphs.Count].Range.End;
                Word.Range rng = worddocument.Range(ref Start, ref End);
 
                Word.Find fnd = rng.Find;
                fnd.ClearFormatting();
                fnd.Text = find;
                fnd.Replacement.ClearFormatting();
                fnd.Replacement.Text = replace;
                ExecuteReplace(fnd);
            }
            catch (Exception exp)
            {
                System.Windows.Forms.MessageBox.Show(exp.Message);
                return;
            }
        }
 
        private Boolean ExecuteReplace(Word.Find find)
        {
            return ExecuteReplace(find, replace);
        }
 
        private Boolean ExecuteReplace(Word.Find find, Object replaceOption)
        {
            // Простая оболочка Find.Execute:
            Object findText = Type.Missing;
            Object matchCase = Type.Missing;
            Object matchWholeWord = Type.Missing;
            Object matchWildcards = Type.Missing;
            Object matchSoundsLike = Type.Missing;
            Object matchAllWordForms = Type.Missing;
            Object forward = Type.Missing;
            Object wrap = Type.Missing;
            Object format = Type.Missing;
            Object replaceWith = Type.Missing;
            Object replace = replaceOption;
            Object matchKashida = Type.Missing;
            Object matchDiacritics = Type.Missing;
            Object matchAlefHamza = Type.Missing;
            Object matchControl = Type.Missing;
 
            return find.Execute(ref findText, ref matchCase,
            ref matchWholeWord, ref matchWildcards, ref matchSoundsLike,
            ref matchAllWordForms, ref forward, ref wrap, ref format,
            ref replaceWith, ref replace, ref matchKashida,
            ref matchDiacritics, ref matchAlefHamza, ref matchControl);
        }
        //
        public void SetData(DataTable table)
        {
            this.table = table;
        }
 
        public override void EditFile()
        {
            throw new Exception("The method or operation is not implemented.");
        }
 
        public override void SaveFile()
        {
            throw new Exception("The method or operation is not implemented.");
        }
 
        public void Close()
        {
            // Выводим запрос на сохранение изменений
            Object saveChanges = Word.WdSaveOptions.wdPromptToSaveChanges;
            Object originalFormat = Type.Missing;
            Object routeDocument = Type.Missing;
            ((Word._Application)wordapp).Quit(ref saveChanges,
            ref originalFormat, ref routeDocument);
        }
    }
}

В статье рассмотрены основные методы работы с массивами в 1С

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

Для решения этой проблемы достаточно установить пользователя под которым будут выполняться регламентные задания.

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

В тех случаях, когда возникает необходимость отключить авторегистрацию объектов, при записи объекта следует устанавливать дополнительное свойство.

В статье рассмотрено несколько основных алгоритмов удаления строк из табличной части по условию. Каждый из вариантов по своему хорош, вам…

Примеры программного заполнения параметров и отборов для отчетов СКД

Примеры создания простых типов в 1С. Числа, строки ,логические, символы.

Данная функция преобразовывает Фамилию Имя Отчество в Фамилия И.О.

Примеры работы с деревом значений в 1С. Добавление, удаление, перемещение строк, создание копии, сортировка данных и др.

Примеры создания дерева значений, массивов, словарей, списка значений, структуры, таблицы значений

Примеры использования условий отбора в запросе 1С. Отборы по дате, по объектам, по параметрам и др.

   Gossar1C

28.02.13 — 10:40

Здраствуйте! Хочу открыть вордовский файл для начала ( в дальнейшем надо будет записывать туда программно значения и сохранять в pdf)

Модуль формы

&НаКлиенте

Процедура ФайлНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

   
   Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

   Диалог.ПолноеИмяФайла = «»;

   Текст = НСтр(«ru = «»Текст»»; en = «»Text»»»);

   Диалог.Фильтр = НСтр(Текст) + «(*.docx)|*.docx»;

   Диалог.МножественныйВыбор = Истина;

   Диалог.Заголовок = «Выберите файл»;

   
   Если Диалог.Выбрать() Тогда

       МассивФайлов = Диалог.ВыбранныеФайлы;

       Для Каждого ИмяФайла Из МассивФайлов Цикл

           ВыбФайл = Новый Файл(ИмяФайла);

           Объект.Файл = ВыбФайл.ПолноеИмя;

       КонецЦикла;

   Иначе

       Текст = «ru = «»Файл(ы) не выбран!»»; en = «»File(s) not selected!»»»;

       Предупреждение(НСтр(Текст));

   КонецЕсли;

   

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

&НаКлиенте

Процедура ИзменитьОбъект(Команда)

   
   ПередатьОбъектДляИзменения(Объект.Файл);

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

&НаСервере

Процедура ПередатьОбъектДляИзменения(Файл)

   
   Обработки.ОбработкаДоговора.ИзменениеМакета(Файл);

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

Модуль менеджера:

Функция ИзменениеМакета (Файл) Экспорт

   
       
   // Заполняем шаблон  MS Word

   Шаблон = Новый COMОбъект(«Word.Application»);

   Шаблон.Documents.Add(Файл);

   Шаблон.ActiveDocument.Open();

   
   ////Заполнение шаблона заменой

   //Find = Шаблон.ActiveDocument.Range().Find;

   //Find.ClearFormatting();

   //Find.Forward = -1;

       
   
   
   //Find.Execute(«{НомерДоговора}»,,,,,,,,, СокрЛП(Объект.НомерДоговора),2);

   
КонецФункции

Ругается говорит мол файл поврежден, хотя вордом нормально открывается, а в 1ске нифига =(

   Wobland

1 — 28.02.13 — 10:41

это ты хвастаешься?

   Wobland

2 — 28.02.13 — 10:41

а сохранять в пдф без ворда не хочешь?

   Gossar1C

3 — 28.02.13 — 10:42

(2) а ты умеешь программно пдф заполнять? расскажи а?

   Gossar1C

4 — 28.02.13 — 10:43

Есть договор в ворде, его надо будет заполнить, а потом в формате пдф приклеить к отправке на мыло

   Wobland

5 — 28.02.13 — 10:43

(3) ТабДок умеет

   le_

6 — 28.02.13 — 10:44

(3) 8.2 умеет сохранять отчеты в PDF.

   Wobland

7 — 28.02.13 — 10:44

+(5) ну.. не заполнять, допустим, но записывать

   le_

8 — 28.02.13 — 10:46

(0)

Ворд = Новый COMОбъект("Word.Application");
Документ = Ворд.Documents.Open(ПолныйПуть);
   Gossar1C

9 — 28.02.13 — 10:46

Господа! Мне не нужно сохранять таб документ! У меня есть шаблон договора вордовский, в котором мне нужно заполнить поля о клиенте и приклеить вложением к отправке на почту

   Cyberhawk

10 — 28.02.13 — 10:47

Чтобы что-то прикрепить, нужно что-то сохранить :)

   Wobland

11 — 28.02.13 — 10:48

(9) а ты прикреплять что собрался?

   Gossar1C

12 — 28.02.13 — 10:49

(10) так в том то и дело) мне нужно просто напросто внести небольшие изменения в уже существуещий шаблон (Тоесть заполнить информацию о клиенте) и потом уже через bullzip сохранить в пдф и приклеить

   Wobland

13 — 28.02.13 — 10:50

(12) ответь на (2) всё равно

   Gossar1C

14 — 28.02.13 — 10:51

(11) есть ЗаказКлиента когда мы печатаем счет ему и отправляем на мыло счет сохраненный в формате пдф(вот именно счет Печатную форму сохраняет в пдф), и к счету должно быть приложение Доп. Соглашение, которое мне начальник кинул в ворде, и его нужно сохранить в пдф и тоже приклеить предварительно заполнив вордовский шаблон

   le_

15 — 28.02.13 — 10:52

(12) Word 2010, кстати, сам может в PDF сохранять, без bullzip.

   Gossar1C

16 — 28.02.13 — 10:53

(13) мне начальник дал сначала шаблон в формате пдф, но порыскав по этому форуму и получив кучу ответов что никто не знает как редактировать pdf(тобишь заполнить что то данными 1ски) мне советовали wordом редактировать.

   alexei366

17 — 28.02.13 — 10:53

(14) У вас форма счета из 1С сразу в Ворде получается?

   le_

18 — 28.02.13 — 10:53

(14) Можно же сделать из этого вордовского шаблона макет в 1С-ке и заполнять его обычным образом.

   Gossar1C

19 — 28.02.13 — 10:54

(15) пользуюсь тем что есть)

   Gossar1C

20 — 28.02.13 — 10:55

(18) ActiveDocument Загрузить из файла?

   Wobland

21 — 28.02.13 — 10:55

(14) а можно в табличном документе сделать это доп. соглашение

   Cyberhawk

22 — 28.02.13 — 10:56

(0) попробуй так работать с вордом:

   Попытка

       WordАрр = Новый COMОбъект(«Word.Application»);

   Исключение

       Предупреждение(«Возможно не установлено приложение «»Microsoft Word»».»,,»Формирование договора невозможно. «);

       Возврат Неопределено;

   КонецПопытки;    

   Попытка

       ActiveDocument = WordАрр.Application.Documents.Add(ИмяВременногоФайла);

       ActiveDocument.Activate();

   Исключение

       Предупреждение(«Ошибка открытия файла шаблона.»,,»Формирование договора невозможно. «);

       Возврат Неопределено;

   КонецПопытки;

   Gossar1C

23 — 28.02.13 — 10:56

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

   Cyberhawk

24 — 28.02.13 — 10:57

(22) ну и в конце

       ActiveDocument.SaveAS(Каталог + «» + ИмяФайла, ?(РасширениеФайла = «pdf», 17, 16));  //17-pdf   16-docx

       ActiveDocument.Close(0);

       WordАрр.Application.Quit();

   Wobland

25 — 28.02.13 — 10:57

(23) я тоже. но текстом его заполнять я умею

   le_

26 — 28.02.13 — 11:00

(23) Можно воспользоваться универсальным методом Copy&Paste.

   mzelensky

27 — 28.02.13 — 11:01

(0) учитывая:

«Господа! Мне не нужно сохранять таб документ! У меня есть шаблон договора вордовский, в котором мне нужно заполнить поля о клиенте и приклеить вложением к отправке на почту»

и

«есть ЗаказКлиента когда мы печатаем счет ему и отправляем на мыло счет сохраненный в формате пдф(вот именно счет Печатную форму сохраняет в пдф), и к счету должно быть приложение Доп. Соглашение, которое мне начальник кинул в ворде, и его нужно сохранить в пдф и тоже приклеить предварительно заполнив вордовский шаблон»

Не понимаю проблемы автора и гемороя с Вордом?!

Шаблон у тебя есть! Заполнять тебе один хрен из 1С. Так сделай макет этого договора (соглашения) в 1С-ке (как обычный отчетик). Заполняй его, сохраняй в ПДФ (8.2 это умеет) и отправляй куда угодно.

При этом не надо гемороиться с Вордом + работать будет гораздо быстрее + уходят многие подводные камни (на которые ты обязательно наткнешься позже).

   Gossar1C

28 — 28.02.13 — 11:01

(26) а копи паст все сделает ровно?) и фоновый рисунок (лого компании) закрепит также как в ворде?) за текстом

   le_

29 — 28.02.13 — 11:07

(28) Что-то вручную, конечно, поправить придется. И полупрозрачный рисунок вставить возможность есть.

   Gossar1C

30 — 28.02.13 — 11:08

   Gossar1C

31 — 28.02.13 — 11:09

начало)

   mzelensky

32 — 28.02.13 — 11:13

(30)  Это ПДФ-файл сформированный полностью из 1С (без вордов, виртуальных принтеров и т.д.)

http://s005.radikal.ru/i211/1302/c0/2fb1d170c2f5.jpg

П.С. и кстати он тожепотом по почте автоматом отправляется

   Gossar1C

33 — 28.02.13 — 11:14

Ладно. Всем спасибо за советы) буду пытаться их использовать или искать что то другое)

   Gossar1C

34 — 28.02.13 — 11:16

(32) он же ввиде табличного документа был? а потом его сохранили в формате pdf, насчет того как натянуть шаблон на макет я повторюсь, что пока у меня мало знаний для этого…

   le_

35 — 28.02.13 — 11:19

(30) Реализуемо средсвами 1С на 100%.

Вот тебе пример фонового рисунка: http://s017.radikal.ru/i415/1302/9c/22caba3f235f.png

   Gossar1C

36 — 28.02.13 — 11:25

(35) спасибо le_ буду пробовать)

   Gossar1C

37 — 28.02.13 — 11:26

(35) но форматировать придется дофига)

   mzelensky

38 — 28.02.13 — 11:27

(35) у меня с бибишкой красивее :)

   Jaffar

39 — 28.02.13 — 11:28

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

   le_

40 — 28.02.13 — 11:29

(38) У меня красочнее )

   le_

41 — 28.02.13 — 11:30

(37) Ну, иногда в 1С-ке что-то приходится делать вручную.

  

mzelensky

42 — 28.02.13 — 11:41

(40) ща вставлю красный Астон Мартин!

Вставка таблицы в документ 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 превышающий 512 мб
  • Как открыть файл шаблон microsoft word
  • Как открыть файл word под паролем
  • Как открыть файл через vba excel

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии