Как программно сохранить word

В данной статье рассмотрим достаточно простой и удобный способ формирования документов Word из 1С. Сама по себе 1С формировать документы Word “не умеет”, и для работы с такими документами используется собственно MS Word. Поэтому вначале нужно определенным образом подготовить документ, а после загрузить его в макет двоичных данных в 1С.
Для корректной работы данного способа необходимо, чтобы на компьютере, где происходит формирование документа, был установлен MS Office. Также, документ формируется на клиенте, с тем чтобы вывести его на экран пользователю. Но возможно формирование и на сервере, если на сервере установлен Word – например, для прикрепления файлов к справочникам.

Подготовка шаблона Word

В документе Word можно вставлять поля специального типа DocVariables. Это можно сделать либо вставив соответствующий фрагмент текста, либо через графический интерфейс. На примере Word 2016, это делается через меню Вставка / Экспресс блоки/ Поле. В списке доступных полей нас интересует DocVariable. Указываем нужное имя и жмем ОК.

1С напечатать Word DocVariables

Для скрытия / отображения кодов полей в документе, жмем Alt + F9. Для экономии времени, можно просто копировать нужные поля и вставлять в нужные места документа. Чтобы создать новую переменную документа, достаточно просто в кавычках заменить имя.

1С сформировать Word

Формирование документа 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);
             }
        }
Skip to content

1С сохранить табличный документ в pdf, xlsx, docx, txt, html файл программно

Сохранить табличный документ в 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С.

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С программистов и разработчик обновлятора).

Владимир Милькин

Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.

Нажмите одну из кнопок, чтобы поделиться:

Like this post? Please share to your friends:
  • Как программно прочитать excel
  • Как программно запустить word
  • Как программно записать документы excel в один документ
  • Как программно закрыть word
  • Как программно закрыть excel 1с