Открыть файл из 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С
Для решения этой проблемы достаточно установить пользователя под которым будут выполняться регламентные задания.
1С
Функция пропорционально распределяет сумму на необходимое количество
1С
В тех случаях, когда возникает необходимость отключить авторегистрацию объектов, при записи объекта следует устанавливать дополнительное свойство.
1С
В статье рассмотрено несколько основных алгоритмов удаления строк из табличной части по условию. Каждый из вариантов по своему хорош, вам…
1С
Примеры программного заполнения параметров и отборов для отчетов СКД
1С
Примеры создания простых типов в 1С. Числа, строки ,логические, символы.
1С
Данная функция преобразовывает Фамилию Имя Отчество в Фамилия И.О.
1С
Примеры работы с деревом значений в 1С. Добавление, удаление, перемещение строк, создание копии, сортировка данных и др.
1С
Примеры создания дерева значений, массивов, словарей, списка значений, структуры, таблицы значений
1С
Примеры использования условий отбора в запросе 1С. Отборы по дате, по объектам, по параметрам и др.
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ске нифига =(
1 — 28.02.13 — 10:41
это ты хвастаешься?
2 — 28.02.13 — 10:41
а сохранять в пдф без ворда не хочешь?
3 — 28.02.13 — 10:42
(2) а ты умеешь программно пдф заполнять? расскажи а?
4 — 28.02.13 — 10:43
Есть договор в ворде, его надо будет заполнить, а потом в формате пдф приклеить к отправке на мыло
5 — 28.02.13 — 10:43
(3) ТабДок умеет
6 — 28.02.13 — 10:44
(3) 8.2 умеет сохранять отчеты в PDF.
7 — 28.02.13 — 10:44
+(5) ну.. не заполнять, допустим, но записывать
8 — 28.02.13 — 10:46
(0)
Ворд = Новый COMОбъект("Word.Application");
Документ = Ворд.Documents.Open(ПолныйПуть);
9 — 28.02.13 — 10:46
Господа! Мне не нужно сохранять таб документ! У меня есть шаблон договора вордовский, в котором мне нужно заполнить поля о клиенте и приклеить вложением к отправке на почту
10 — 28.02.13 — 10:47
Чтобы что-то прикрепить, нужно что-то сохранить 
11 — 28.02.13 — 10:48
(9) а ты прикреплять что собрался?
12 — 28.02.13 — 10:49
(10) так в том то и дело) мне нужно просто напросто внести небольшие изменения в уже существуещий шаблон (Тоесть заполнить информацию о клиенте) и потом уже через bullzip сохранить в пдф и приклеить
13 — 28.02.13 — 10:50
(12) ответь на (2) всё равно
14 — 28.02.13 — 10:51
(11) есть ЗаказКлиента когда мы печатаем счет ему и отправляем на мыло счет сохраненный в формате пдф(вот именно счет Печатную форму сохраняет в пдф), и к счету должно быть приложение Доп. Соглашение, которое мне начальник кинул в ворде, и его нужно сохранить в пдф и тоже приклеить предварительно заполнив вордовский шаблон
15 — 28.02.13 — 10:52
(12) Word 2010, кстати, сам может в PDF сохранять, без bullzip.
16 — 28.02.13 — 10:53
(13) мне начальник дал сначала шаблон в формате пдф, но порыскав по этому форуму и получив кучу ответов что никто не знает как редактировать pdf(тобишь заполнить что то данными 1ски) мне советовали wordом редактировать.
17 — 28.02.13 — 10:53
(14) У вас форма счета из 1С сразу в Ворде получается?
18 — 28.02.13 — 10:53
(14) Можно же сделать из этого вордовского шаблона макет в 1С-ке и заполнять его обычным образом.
19 — 28.02.13 — 10:54
(15) пользуюсь тем что есть)
20 — 28.02.13 — 10:55
(18) ActiveDocument Загрузить из файла?
21 — 28.02.13 — 10:55
(14) а можно в табличном документе сделать это доп. соглашение
22 — 28.02.13 — 10:56
(0) попробуй так работать с вордом:
Попытка
WordАрр = Новый COMОбъект(«Word.Application»);
Исключение
Предупреждение(«Возможно не установлено приложение «»Microsoft Word»».»,,»Формирование договора невозможно. «);
Возврат Неопределено;
КонецПопытки;
Попытка
ActiveDocument = WordАрр.Application.Documents.Add(ИмяВременногоФайла);
ActiveDocument.Activate();
Исключение
Предупреждение(«Ошибка открытия файла шаблона.»,,»Формирование договора невозможно. «);
Возврат Неопределено;
КонецПопытки;
23 — 28.02.13 — 10:56
Увы на таб документ я еще не умею натягивать вордовские шаблоны, а насчет актив и загрузить из файла так он вообще не загружает его кнопку жмешь а конструктору все непочем
24 — 28.02.13 — 10:57
(22) ну и в конце
ActiveDocument.SaveAS(Каталог + «» + ИмяФайла, ?(РасширениеФайла = «pdf», 17, 16)); //17-pdf 16-docx
ActiveDocument.Close(0);
WordАрр.Application.Quit();
25 — 28.02.13 — 10:57
(23) я тоже. но текстом его заполнять я умею
26 — 28.02.13 — 11:00
(23) Можно воспользоваться универсальным методом Copy&Paste.
27 — 28.02.13 — 11:01
(0) учитывая:
«Господа! Мне не нужно сохранять таб документ! У меня есть шаблон договора вордовский, в котором мне нужно заполнить поля о клиенте и приклеить вложением к отправке на почту»
и
«есть ЗаказКлиента когда мы печатаем счет ему и отправляем на мыло счет сохраненный в формате пдф(вот именно счет Печатную форму сохраняет в пдф), и к счету должно быть приложение Доп. Соглашение, которое мне начальник кинул в ворде, и его нужно сохранить в пдф и тоже приклеить предварительно заполнив вордовский шаблон»
Не понимаю проблемы автора и гемороя с Вордом?!
Шаблон у тебя есть! Заполнять тебе один хрен из 1С. Так сделай макет этого договора (соглашения) в 1С-ке (как обычный отчетик). Заполняй его, сохраняй в ПДФ (8.2 это умеет) и отправляй куда угодно.
При этом не надо гемороиться с Вордом + работать будет гораздо быстрее + уходят многие подводные камни (на которые ты обязательно наткнешься позже).
28 — 28.02.13 — 11:01
(26) а копи паст все сделает ровно?) и фоновый рисунок (лого компании) закрепит также как в ворде?) за текстом
29 — 28.02.13 — 11:07
(28) Что-то вручную, конечно, поправить придется. И полупрозрачный рисунок вставить возможность есть.
30 — 28.02.13 — 11:08
31 — 28.02.13 — 11:09
начало)
32 — 28.02.13 — 11:13
(30) Это ПДФ-файл сформированный полностью из 1С (без вордов, виртуальных принтеров и т.д.)
http://s005.radikal.ru/i211/1302/c0/2fb1d170c2f5.jpg
П.С. и кстати он тожепотом по почте автоматом отправляется
33 — 28.02.13 — 11:14
Ладно. Всем спасибо за советы) буду пытаться их использовать или искать что то другое)
34 — 28.02.13 — 11:16
(32) он же ввиде табличного документа был? а потом его сохранили в формате pdf, насчет того как натянуть шаблон на макет я повторюсь, что пока у меня мало знаний для этого…
35 — 28.02.13 — 11:19
(30) Реализуемо средсвами 1С на 100%.
Вот тебе пример фонового рисунка: http://s017.radikal.ru/i415/1302/9c/22caba3f235f.png
36 — 28.02.13 — 11:25
(35) спасибо le_ буду пробовать)
37 — 28.02.13 — 11:26
(35) но форматировать придется дофига)
38 — 28.02.13 — 11:27
(35) у меня с бибишкой красивее 
39 — 28.02.13 — 11:28
первый раз вижу, чтоб одинэсники pdf-ками мерялись…
40 — 28.02.13 — 11:29
(38) У меня красочнее )
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-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки
