В данной статье рассмотрим достаточно простой и удобный способ формирования документов Word из 1С. Сама по себе 1С формировать документы Word “не умеет”, и для работы с такими документами используется собственно MS Word. Поэтому вначале нужно определенным образом подготовить документ, а после загрузить его в макет двоичных данных в 1С.
Для корректной работы данного способа необходимо, чтобы на компьютере, где происходит формирование документа, был установлен MS Office. Также, документ формируется на клиенте, с тем чтобы вывести его на экран пользователю. Но возможно формирование и на сервере, если на сервере установлен Word – например, для прикрепления файлов к справочникам.
Подготовка шаблона Word
В документе Word можно вставлять поля специального типа DocVariables. Это можно сделать либо вставив соответствующий фрагмент текста, либо через графический интерфейс. На примере Word 2016, это делается через меню Вставка / Экспресс блоки/ Поле. В списке доступных полей нас интересует DocVariable. Указываем нужное имя и жмем ОК.
Для скрытия / отображения кодов полей в документе, жмем Alt + F9. Для экономии времени, можно просто копировать нужные поля и вставлять в нужные места документа. Чтобы создать новую переменную документа, достаточно просто в кавычках заменить имя.
Формирование документа Word из 1С
После того, как шаблон готов, его нужно загрузить в виде макета с типом “Двоичные данные”. Это можно сделать в обработке, в общем макете, в справочнике и т.д. Рассмотрим на примере хранения макета в обработке.
Сперва нужно создать ComОбъект Word, сохранить файл из макета во временный файл, и прочитать его в Word. Далее мы переходим к заполнению переменных DocVariablе любым удобным способом – можно явно указывать нужные имена переменных и их значения, а можно заранее подготовить структуру данных и в цикле заполнить по этой структуре. Далее необходимо обновить поля в документе Word, скрыть коды полей, если вдруг они включены, и отобразить документ. Для доступа к конкретному полю DocVariable используется код вида ComОбъектWord.Variables(“СтроковоеИмяПеременной”).Value. Делаем это в попытке, на случай, если поля с таким именем в Word нет.
&НаКлиенте Процедура ВывестиДокументWord(Команда) МакетШаблонWord = ПолучитьМакетНаСервере(); ОбъектWord = Новый COMОбъект("Word.Application"); ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); МакетШаблонWord.Записать(ИмяВременногоФайла); ДокументWord = ОбъектWord.Documents.Add(ИмяВременногоФайла); //Удобнее всего заполнять через структуру СтруктураДанных = Новый структура("ДатаДокумента, ТекстИз1С", Формат(ТекущаяДата(),"ДЛФ=DD"), "Какой-то текст из 1С"); Для Каждого КлючИЗначение Из СтруктураДанных Цикл Попытка ДокументWord.Variables(КлючИЗначение.Ключ).Value = КлючИЗначение.Значение; Исключение КонецПопытки; КонецЦикла; ДокументWord.Fields.Update(); ОбъектWord.ActiveWindow.View.ShowFieldCodes = False; ОбъектWord.Visible = True; КонецПроцедуры &НаСервере Функция ПолучитьМакетНаСервере() Возврат РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет"); КонецФункции
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 |
object objMissing = System.Reflection.Missing.Value; object objEndofDocument = "\endofdoc"; Microsoft.Office.Interop.Word._Application appobj; Microsoft.Office.Interop.Word.Document docobj; Microsoft.Office.Interop.Word.Table tableObj; //здесь документ заполняется и выводится в таблицу. private void печатьToolStripMenuItem_Click(object sender, EventArgs e) { appobj = new Microsoft.Office.Interop.Word.Application(); appobj.Visible = true; docobj = appobj.Documents.Add(ref objMissing, ref objMissing, ref objMissing, ref objMissing); Microsoft.Office.Interop.Word.Range rangeObj = docobj.Bookmarks.get_Item(ref objEndofDocument).Range; tableObj = docobj.Tables.Add(rangeObj, g+1, 3, ref objMissing, ref objMissing); tableObj.Range.ParagraphFormat.SpaceAfter = 8; for (int j = 0; j <= 3; j++) { if (j == 1) { tableObj.Cell(0, j).Range.Text = "Подача"; } if (j == 2) { tableObj.Cell(0, j).Range.Text = "Радиус"; } if (j == 3) { tableObj.Cell(0, j).Range.Text = "Диаметр"; } } int count = 0; for(int i = 1; i <= g; i++) { tableObj.Cell(i+1, 1).Range.Text = (rezec * count).ToString(); count++; } for (int i = 1; i <= g; i++) { tableObj.Cell(i+1, 2).Range.Text = (Math.Round(mas[i-1], 3)).ToString(); } for (int i = 1; i <= g; i++) { tableObj.Cell(i+1, 3).Range.Text = (Math.Round(mas[i-1], 3)*2).ToString(); } tableObj.Rows[1].Range.Font.Bold = 1; tableObj.Borders.Enable = 1; } //здесь документ тоже заполняется и он должен сохраниться с помощью SaveFileDialog private void сохранитьToolStripMenuItem_Click(object sender, EventArgs e) { SaveFileDialog save = new SaveFileDialog(); save.DefaultExt = ".doc"; save.Filter = "Текстовые файлы | *.doc"; save.AddExtension = true; save.Title = "Сохранение файла"; if (save.ShowDialog() == DialogResult.OK) { object saves = "C:\Users\Виталий\Desktop\rez.doc"; appobj = new Microsoft.Office.Interop.Word.Application(); appobj.Visible = true; docobj = appobj.Documents.Add(ref objMissing, ref objMissing, ref objMissing, ref objMissing); Microsoft.Office.Interop.Word.Range rangeObj = docobj.Bookmarks.get_Item(ref objEndofDocument).Range; tableObj = docobj.Tables.Add(rangeObj, g + 1, 3, ref objMissing, ref objMissing); tableObj.Range.ParagraphFormat.SpaceAfter = 8; for (int j = 0; j <= 3; j++) { if (j == 1) { tableObj.Cell(0, j).Range.Text = "Подача"; } if (j == 2) { tableObj.Cell(0, j).Range.Text = "Радиус"; } if (j == 3) { tableObj.Cell(0, j).Range.Text = "Диаметр"; } } int count = 0; for (int i = 1; i <= g; i++) { tableObj.Cell(i + 1, 1).Range.Text = (rezec * count).ToString(); count++; } for (int i = 1; i <= g; i++) { tableObj.Cell(i + 1, 2).Range.Text = (Math.Round(mas[i - 1], 3)).ToString(); } for (int i = 1; i <= g; i++) { tableObj.Cell(i + 1, 3).Range.Text = (Math.Round(mas[i - 1], 3) * 2).ToString(); } tableObj.Rows[1].Range.Font.Bold = 1; tableObj.Borders.Enable = 1; appobj.Documents.Save(ref saves, ref objMissing); } } |
1С сохранить табличный документ в pdf, xlsx, docx, txt, html файл программно
Пример процедуры
&НаСервере Процедура СохранитьВPDFНаСервере() ТабДок = Новый ТабличныйДокумент; Макет = Обработки.ТабличныйДокументСохранитьВPDF.ПолучитьМакет("Макет"); ОбластьМакета = Макет.ПолучитьОбласть("Шапка"); ТабДок.Вывести(ОбластьМакета); МестоположениеФайла = "G:ProverkaZapisiТест.pdf"; ТабДок.Записать(МестоположениеФайла , ТипФайлаТабличногоДокумента.PDF); //Запись в Excel //МестоположениеФайла = "G:ProverkaZapisiТест.XLSX"; //ТабДок.Записать(МестоположениеФайла , ТипФайлаТабличногоДокумента.XLSX); //Запись в Word //МестоположениеФайла = "G:ProverkaZapisiТест.docx"; //ТабДок.Записать(МестоположениеФайла , ТипФайлаТабличногоДокумента.DOCX); //Прочие форматы //ТипФайлаТабличногоДокумента поддерживает множество форматов //html5, mxl, txt, ods, можете поэксперементировать с различными форматами Сообщить("Файл успешно сохранен"); КонецПроцедуры
Обратите внимание, если возникла ошибка (нет доступа для записи в папку, при этом с правами у данного пользователя windows все в порядке) при выполнении строки с кодом «ТабДок.Записать ()». Выполните данную строку кода «&НаКлиенте».
Перед запуском обработки убедитесь, что на вашем компьютере существует директория «G:ProverkaZapisiТест.pdf»
Связанные статьи
1С
В статье рассмотрены основные методы работы с массивами в 1С
1С
В данной статье рассмотрен пример передачи данных из табличной части документа в параметр.
1С
Для решения этой проблемы достаточно установить пользователя под которым будут выполняться регламентные задания.
1С
Функция пропорционально распределяет сумму на необходимое количество
1С
В тех случаях, когда возникает необходимость отключить авторегистрацию объектов, при записи объекта следует устанавливать дополнительное свойство.
1С
В статье рассмотрено несколько основных алгоритмов удаления строк из табличной части по условию. Каждый из вариантов по своему хорош, вам…
1С
Примеры программного заполнения параметров и отборов для отчетов СКД
1С
Примеры создания простых типов в 1С. Числа, строки ,логические, символы.
1С
Данная функция преобразовывает Фамилию Имя Отчество в Фамилия И.О.
1С
Примеры работы с деревом значений в 1С. Добавление, удаление, перемещение строк, создание копии, сортировка данных и др.
1С
Примеры создания дерева значений, массивов, словарей, списка значений, структуры, таблицы значений
1С
Примеры использования условий отбора в запросе 1С. Отборы по дате, по объектам, по параметрам и др.
Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.
2017-12-19T18:36:38+00:00<<< XML ZIP WORD DBF HTTP FTP ТекстовыйДокумент ТабличныйДокумент
Скачать эти примеры в виде тестовой базы (как загрузить, как исследовать)
Скачать шаблон bill.dotx, который используется в примерах ниже.
Как создавать такие шаблоны самому.
Оглавление (нажмите, чтобы раскрыть)
/// Как создать документ 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(); Возврат ФайлДляЗаписи; КонецФункции /// Скачать и выполнить эти примеры на компьютере
Скачать эти примеры в виде тестовой базы (как загрузить, как исследовать)
Скачать шаблон bill.dotx, который используется в примерах ниже.
Как создавать такие шаблоны самому.
Работа с Word в языке 1С 8.3, 8.2 (в примерах)
<<< XML ZIP WORD DBF HTTP FTP ТекстовыйДокумент ТабличныйДокумент
С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).
Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.
Нажмите одну из кнопок, чтобы поделиться: