« «договор из табличного документа… Самописная конфигурация… Менеджерам не удобно сохранять договор в эксель. Клиентам неудобно показывать.» — ну так напишите печатную форму Word для договора. В интернете куча инфы как написать, конфигурация — самописная, ТыжПрограммист :)»
«Делай своё сохраниение в ворд. С бриджем и весёлыми женщинами»
Я знаю, что можно сделать свое сохранение в ворд. Вначале я так и начал. Сделал договор, программно заполнил реквизиты в зависимости от организации и контрагента и все работало хорошо. Но потом договор стали дорабатывать очень сильно. Сам договор большой, плюс десять приложений. Договор отличается в зависимости от того отправляется он почтой или через ЭДО и от настроек контрагента. Во многих местах текст разный из-за настроек. Я этот текст менял программно. Но возникла проблема, что приложение или пункт договора иногда начиналось не с новой страницы. И не понятно почему. Отладка ворда занимает больше времени чем табличного документа. А мне надо было сделать еще 3 таких договора. И я решил сделать в макете. Все работает хорошо больше полгода. А теперь некоторым менеджерам хочется в ворде. Переделывать 4 договора в ворде заново не хочется. Поэтому я и спросил, может как то можно сохранить нормально в ворд.
Цитата: magnifico61 от 01 июн 2018, 11:40
Или как вариант вывести табличный документ в ворд через com.
Уверен, что в Word всё же надо?
Как не крути, но на своём опыте проверил, что 1С (8.2 по крайней мере) нормально сохраняет таб.документы только в 3 формата, один из которых «родной». Это mxl, xls и pdf. Во всех остальных начинаются искажения ширинвысот колонок и прочие визуальные глюки. Одна и та же печатная форма при сохранении в xls выглядит нормально, также как на экране, а в xlsx и docx таблица вытягивается как шея у жирафа, и такого видел немало — чем сложнее макет, тем больше искажений.
Я пытался в одной обработке программно сохранять ТабДок в Word, и это работало, хоть и выглядело некрасиво, но когда дал доступ пользователям, оказалось что при выполнении кода
ТабДок.Сохранить(ПутьКФайлу,ТипФайлаТабличногоДокумента.DOCX)
у многих вообще 1С вылетает! Именно в этот формат, с другими всё в порядке, я проверял.
Всё это у меня напрочь отбило желание с Word связываться.
Если всё ещё есть желание мучаться с DOCX можно попробовать сохранить в HTML и пересохранить через КОМ объект, что-то типа
//ТабДок - твой документ
//ПутьКФайлу - куда нужно сохранить
Врем = ПолучитьИмяВременногоФайла("html");
ТабДок.Сохранить(Врем,ТипФайлаТабличногоДокумента.HTML);
Word = Новый COMОбъект("Word.Application");
Word.Visible = 0;
Word.Documents.Add(Врем);
ТекДок = Word.ActiveDocument;
ТекДок.SaveAs(ПутьКФайлу,16); //16 - формат файла по умолчанию для текущей версии офиса
Word.Application.Quit();
Писал по памяти, могут быть ошибки.
Так у меня работало, но результат, опять же не радовал, т.к. сбивались ширины, «уезжали» картинки и т.д.
2 / 2 / 0 Регистрация: 11.01.2013 Сообщений: 220 |
|
1 |
|
17.01.2022, 15:59. Показов 1198. Ответов 19
Сохраняю табличный документ в ворд. В конце добавляется пустая страница. Как ее убрать?
0 |
262 / 218 / 94 Регистрация: 07.04.2011 Сообщений: 1,347 |
|
17.01.2022, 17:51 |
2 |
Для начала..
0 |
Yulunga 1155 / 702 / 203 Регистрация: 22.04.2013 Сообщений: 5,219 Записей в блоге: 1 |
||||
17.01.2022, 17:56 |
3 |
|||
а если написать
— тоже?
0 |
hawk1 2 / 2 / 0 Регистрация: 11.01.2013 Сообщений: 220 |
||||
18.01.2022, 12:24 [ТС] |
4 |
|||
Yulunga, не помогает.
0 |
1832 / 1249 / 446 Регистрация: 16.01.2015 Сообщений: 5,459 |
|
18.01.2022, 12:35 |
5 |
hawk1, честно говоря, сталкивался с таким, но не разобрался. Помогало одно, сжимал последнюю страницу шаблона, тупо del удалял пробелы внизу страницы и пытался сжать весь текст последней страницы шаблона, чтобы внизу больше пространства оставалось. Понимаю, что «ненаучно», но выручало Добавлено через 1 минуту
0 |
2 / 2 / 0 Регистрация: 11.01.2013 Сообщений: 220 |
|
18.01.2022, 22:51 [ТС] |
6 |
Вот пример выгруженного файла.
0 |
Модератор 3711 / 2907 / 573 Регистрация: 10.03.2011 Сообщений: 11,447 Записей в блоге: 1 |
|
19.01.2022, 05:16 |
7 |
hawk1, у тебя что то с шириной строк в макете, посмотри в документе где заканчивается каждая строка.
0 |
2 / 2 / 0 Регистрация: 11.01.2013 Сообщений: 220 |
|
19.01.2022, 23:27 [ТС] |
8 |
Области исправил но проблема не решилась.
0 |
1155 / 702 / 203 Регистрация: 22.04.2013 Сообщений: 5,219 Записей в блоге: 1 |
|
19.01.2022, 23:58 |
9 |
а самое простое — что табдок двухстраничный, есть вероятность?
0 |
hawk1 2 / 2 / 0 Регистрация: 11.01.2013 Сообщений: 220 |
||||
20.01.2022, 14:37 [ТС] |
10 |
|||
Yulunga, и как это убрать? Добавлено через 31 минуту
выводит 1.
0 |
Модератор 3711 / 2907 / 573 Регистрация: 10.03.2011 Сообщений: 11,447 Записей в блоге: 1 |
|
21.01.2022, 00:50 |
11 |
hawk1, Что бы понять в чем проблема, выведи пустой табДок и сохрани в ворд. Если страницы не будет значит дело в содержимом Табличного документа! Добавлено через 1 минуту Не по теме: (что то ты криво и косо выводишь, что аж майкрософт с тобой работать не хочет)
0 |
1155 / 702 / 203 Регистрация: 22.04.2013 Сообщений: 5,219 Записей в блоге: 1 |
|
21.01.2022, 01:01 |
12 |
судя по вордовскому файлу мне почемушто кажется, что дело в колонтитулах
0 |
262 / 218 / 94 Регистрация: 07.04.2011 Сообщений: 1,347 |
|
21.01.2022, 07:23 |
13 |
А если поставить в Ворде отображения непечатаемые знаков, то что на лишней странице показывается?Есть что-то?
0 |
2 / 2 / 0 Регистрация: 11.01.2013 Сообщений: 220 |
|
21.01.2022, 19:28 [ТС] |
14 |
OverDozero, нет ничего нет.
0 |
Модератор 3711 / 2907 / 573 Регистрация: 10.03.2011 Сообщений: 11,447 Записей в блоге: 1 |
|
22.01.2022, 07:39 |
15 |
Не по теме:
Но каким должно быть соотншение полей и колонтитулов? напоминает передачу «хочу знать всё», уважаемые знатоки что в черном ящике? hawk1, скиньте сюда код который формирует табличный документ (полностью весь)
0 |
2 / 2 / 0 Регистрация: 11.01.2013 Сообщений: 220 |
|
22.01.2022, 15:15 [ТС] |
16 |
Вот сама обработка
0 |
1155 / 702 / 203 Регистрация: 22.04.2013 Сообщений: 5,219 Записей в блоге: 1 |
|
22.01.2022, 15:24 |
17 |
то ли лыжы не едут, то ли я не вижу в макете это точно правильно?
0 |
2 / 2 / 0 Регистрация: 11.01.2013 Сообщений: 220 |
|
22.01.2022, 15:51 [ТС] |
18 |
Yulunga, все области на месте Миниатюры
0 |
Модератор 3711 / 2907 / 573 Регистрация: 10.03.2011 Сообщений: 11,447 Записей в блоге: 1 |
|
23.01.2022, 01:03 |
19 |
hawk1, Даю подсказку. Добавлено через 3 минуты Не по теме: сам там галочек в ТабДоке натыкал, а теперь почему разрыв страницы выводиться))))))
0 |
2 / 2 / 0 Регистрация: 11.01.2013 Сообщений: 220 |
|
24.01.2022, 17:19 [ТС] |
20 |
Попробуй сохранить в word не выводя область подвал Помогло.
0 |
При сохранении печатной формы в docx съезжает вся разметка, т.е. не влазит текст по ширине, не выводится с новой страницы и т.д. Есть ли какие-нибудь универсальные способы для решения данной проблемы?
))парадоксально прав напрямую в ворд сохранить не представляется возможным(парадокс заключается не в правоте а в том что табличные формы не очень дружат с вордом(можно сказать совсем не)), но всегда есть но,если есть острая необходимость сохранить именно в ворде то есть как минимум 2 выхода 1) шаблон в ворде заполнение через com просто со вкусом 2)сохранение в ексель конвертация в хтмл конвертация в ворд не совсем красиво но внешний вид сохраняться прилично сгодиться если разово
можно ли это как-то автоматизировать, что бы это делалось без участия пользователя?
Автоматизировать можно всё при желании.
смотри в сторону вордовского макета с полями
Тэги: 1С 8
Комментарии доступны только авторизированным пользователям
Итак, создадим таблицу Excel.
- Выберите команду меню Вставка ⇒ Таблица ⇒ Таблица Excel (Insert ⇒ Table ⇒ Excel Spreadsheet). При этом лента инструментов Word трансформируется в ленту инструментов Excel.
- Чтобы вернуться назад, нужно щелкнуть по свободной области документа Word.
Вы также можете вставить уже готовую таблицу Excel. Самый простой способ сводится к обычному копированию и последующей вставке таблицы Excel из документа соответствующего табличного редактора в документ Word. Выполните следующие шаги:
- откройте документ Excel и выделите с помощью мыши фрагмент таблицы или всю таблицу целиком, нажав сочетание клавиш Ctrl+A;
- на ленте инструментов Excel на вкладке Главная (Home) щелкните по кнопке Копировать (Copy);
- перейдите к документу Word и установите указатель мыши в том месте, где должна быть вставлена таблица;
- на ленте инструментов Word на вкладке Главная (Home) щелкните мышью по кнопке Вставить (Insert);
- на экране рядом со вставленной таблицей появится всплывающее меню Параметры вставки (Paste Options) (рис. 6.4).
В соответствии с вашими целями выберите один из вариантов форматирования таблицы, щелкнув мышью по одной из пиктограмм.
- Если вы щелкнете по пиктограмме Сохранить исходное форматирование (Keep Source Formatting), то таблица сохранится в том же виде, как она выглядела в табличном редакторе Excel.
- Если вы щелкнете по пиктограмме Использовать стили конечного фрагмента (Use Destination Styles), то таблица будет отформатирована в соответствии с выбранным в программе Word стилем форматирования.
- Если вы щелкнете по пиктограмме Вставить как рисунок (Picture), то таблица будет представлена в виде рисунка. В данном случае вы уже не сможете изменить размеры таблицы или ввести в нее новые данные, но вам также и не придется затрачивать время на то, чтобы края таблицы не выезжали за область документа.
- Если вы щелкнете по пиктограмме Сохранить только текст (Keep Text only), то каждая строка таблицы будет представлена в виде нового абзаца, а данные из разных ячеек будут разделены знаками табуляции.
Мы рассмотрели варианты, которые позволяют вставить таблицу Excel в качестве внедренного объекта, то есть таблица Excel становится частью документа Word. Чтобы данные в таблице обновлялись каждый раз, когда вы вносите изменения в документ Excel, вы можете вставить таблицу в качестве связанного объекта. Для этого:
- в программе Excel выделите полный лист или диапазон ячеек;
- скопируйте выделенный фрагмент, используя сочетание клавиш Ctrl+C.
[box color=primechanie]Вы также можете воспользоваться другими вариантами копирования:
- щелкните по выделению правой кнопкой мыши и выберите в открывшемся контекстном меню команду Копировать (Copy);
- на ленте инструментов табличного редактора Excel на вкладке Главная (Home) выберите команду меню Буфер обмена ⇒ Копировать (Clipboard ⇒ Copy).
[/box]
- переключитесь в документ Word и щелкните мышью в позиции, куда необходимо вставить таблицу;
- на вкладке Главная (Home) выберите команду меню Буфер обмена ⇒ Вставить ⇒ Специальная вставка (Clipboard ⇒ Paste ⇒ Paste special). Откроется диалоговое окно Специальная вставка (Paste special);
- в списке выделите объект Microsoft Office Excel Worksheet (объект) (Microsoft Excel Worksheet Object);
- установите переключатель в положение Связать (Paste link), чтобы связать таблицу Excel с документом Word (рис. 6.5).
Теперь каждый раз при открытии документа Word на экране будет появляться диалоговое окно, содержащее вопрос: нужно ли обновить в документе данные, связанные с другими файлами, то есть в данном случае с документом Excel.
[box color=primechanie]Если для вас нежелательно автоматическое обновление данных, то выберите команду меню Файл ⇒ Параметры (File ⇒ Options). В открывшемся диалоговом окне Параметры Word (Word Options) перейдите в раздел Дополнительно (Advanced) и сбросьте флажок Автоматически обновлять связи при открытии (Update automatic links at open).[/box]
Вставка таблицы в документ Word
Пример вставки таблицы в Word из 1С
//создаем объект для работы с Word Word = Новый COMОбъект("Word.Application"); //создаем новый документ Doc = Word.Documents.Add(); //определяем место вставки Range = Doc.Range(0); //создаем таблицу 2х2 Table = Doc.Tables.Add(Range, 2, 2); Table.Style = "Сетка таблицы"; //определяем ширину столбцов Table.columns(1).Width = 20; Table.columns(2).Width = 50; //заполняем первую строку Table.Cell(1, 1).Select(); Word.Selection.Font.Bold = Истина; Word.Selection.TypeText("1"); Table.Cell(1, 2).Select(); Word.Selection.TypeText("Один"); //заполняем вторую строку Table.Cell(2, 1).Select(); Word.Selection.Font.Bold = Истина; Word.Selection.TypeText("2"); Table.Cell(2, 2).Select(); Word.Selection.TypeText("Два"); //показываем документ на экране Word.Visible = Истина;
Вставка текста в документ Word
Пример вставки текста в документ Word из 1С
//создаем объект для работы с Word Word = Новый COMОбъект("Word.Application"); //добавляем пустой документ Doc = Word.Documents.Add(); //добавляем 10 параграфов Для Н = 1 По 10 Цикл Par = Doc.Paragraphs.Add(); Par.Range.InsertBefore("Параграф №" + Н); КонецЦикла; //вставляем текст в начало докуменета Range = Doc.Range(0); Range.InsertBefore("Начало!" + Символы.ПС); //вставляем текст после 16-го символа Range = Doc.Range(16, 16); Range.InsertAfter("[Вставка]"); //показываем документ на экране Word.Visible = Истина;
Выделение текста
Пример выделения текста в документе Word из 1С
//создаем объект для работы с Word Word = Новый COMОбъект("Word.Application"); //создаем новый документ Doc = Word.Documents.Add(); //добавляем параграф Par = Doc.Paragraphs.Add(); Par.Range.InsertBefore("Выделяемый текст"); //выделяем первое слово Doc.Range(0, 10).Select(); //копируем выделение в буфер обмена Word.Selection.Copy(); //меняем размер шрифта и т.д. Word.Selection.Font.Size = 16; //показываем документ на экране Word.Visible = Истина;
Выравнивание текста
Пример выравнивания текста в документе Word из 1С
//создаем объект для работы с Word Word = Новый COMОбъект("Word.Application"); //создаем новый документ Doc = Word.Documents.Add(); //добавляем параграф Par = Doc.Paragraphs.Add(); Par.Range.InsertBefore("Заголовок"); Par = Doc.Paragraphs.Add(); Par.Range.InsertBefore("Выравниваем этот текст"); //0 - по левому краю //1 - по центру //2 - по правому краю //3 - по ширине //текущей параграф по центру Par.Alignment = 1; //заголовок по правому краю Doc.Paragraphs(1).Alignment = 2; //показываем документ на экране Word.Visible = Истина;
Замена текста в документе Word
Пример замены текста в документе Word из 1С
//создаем объект для работы с Word Word = Новый COMОбъект("Word.Application"); //создаем новый документ Doc = Word.Documents.Add(); //добавляем параграф Par = Doc.Paragraphs.Add(); Par.Range.InsertBefore("Сбербанк ИНН/КПП: [ИНН]/[КПП]"); //заменяем ИНН Word.Selection.Find.Text = "[ИНН]"; Word.Selection.Find.Replacement.Text = "7707083893"; Word.Selection.Find.Execute(, , , , , , , , , , 2); //заменяем КПП Word.Selection.Find.Text = "[КПП]"; Word.Selection.Find.Replacement.Text = "773601001"; Word.Selection.Find.Execute(, , , , , , , , , , 2); //показываем документ на экране Word.Visible = Истина;
Открытие документа Word
Пример открытия документа Word из 1С
//создаем объект для работы с Word Word = Новый COMОбъект("Word.Application"); //открываем документ C:tmp1.docx Word.Documents.Add("C:tmp1.docx"); //показываем документ на экране Word.Visible = Истина;
Для открытия документа можно использовать два метода коллекции Documents. Первый — Open() приведен выше, второй — Add().
Метод Open() открывает файл для редактирования в Ворде, документ остается связанным с этим файлом — в заголовке окна Ворд указывается имя файла. Открыть можно любой файл, поддерживаемый Вордом, формат файла при редактировании не меняется. Например, открыли файл .rtf, отредактировали, сохранили, файл остался .rtf. Открывать непосредственно шаблон из папки, в которой хранятся шаблоны таким способом не стоит. Если что-то произойдет не так, например, сработает автосохранение в Ворде, шаблон будет испорчен. Сначала файл шаблона следует скопировать (при работе в клиент-серверном варианте это само собой разумеющиеся действие), а потом можно открывать.
Метод Add() создает новый документ на основании указанного шаблона. Шаблоном может быть любой файл, не обязательно родные для Ворда .doc или .docx или .dot. Открытый документ с файлом-шаблоном не связывается, в заголовке окна Ворд будет надпись «Документ1 — Word». При этом информация о формате исходного файла не сохраняется. Открывается просто документ Ворд, содержащий в себе всю информацию из указанного файла. При сохранении без явного указания типа файла он будет сохранен как .docx. Единственное исключение — документ, открытый на основе файла .doc, такие документы по умолчанию сохраняются в файлы .doc. Метод Add() можно использовать для создания документов на основании оригинала шаблона, шаблон повредить невозможно даже случайно.
Методы Open() и Add() являются функциями, т.е. возвращают значение. Причем возвращают они ссылку на новый документ. И ловить потом этот документ в коллекции Documents нам не нужно, ссылку можно сразу сохранить в переменной для дальнейшего использования. Таким образом, для открытия используются следующие команды:
Документ = Word.Documents.Open («C:готовые документыфайл.docx»);
Или
Документ = Word.Documents.Add («C:шаблоныфайл.docx»);
Преобразование в таблицу
Пример преобразования документа Word в таблицу из 1С
//создаем объект для работы с Word Word = Новый COMОбъект("Word.Application"); //создаем новый документ Doc = Word.Documents.Add(); //добавляем параграф Par = Doc.Paragraphs.Add(); Par.Range.InsertBefore("Таблица умножения:"); //формируем строку с разделителями Сторока = ""; Для Н1 = 1 По 9 Цикл Для Н2 = 1 По 9 Цикл Сторока = Сторока + Н1 * Н2 + ?( Н2 = 9, "", Символы.Таб); КонецЦикла; Сторока = Сторока + Символы.ПС; КонецЦикла; Par.Range.InsertAfter(Сторока); //переходим на строчку вниз Word.Selection.MoveDown(5, 1, 0); //выделяем таблицу Word.Selection.MoveDown(5, 9, 1); //конвертируем текст в таблицу Word.Selection.ConvertToTable(1, 9, 9, 0); Word.Selection.Tables(1).Style = "Сетка таблицы"; //показываем документ на экране Word.Visible = Истина;
Создание документа Word
Пример создания документа Word из 1С
//создаем объект для работы с Word Word = Новый COMОбъект("Word.Application"); //создаем новый документ Doc = Word.Documents.Add(); //показываем документ на экране Word.Visible = Истина;
Сохранение документа
Пример сохранения документа Word из 1С
//создаем объект для работы с Word Word = Новый COMОбъект("Word.Application"); //создаем новый документ Doc = Word.Documents.Add(); //добавляем параграф Par = Doc.Paragraphs.Add(); Par.Range.InsertBefore("Сохраняемый текст"); //сохраняем документ в файл Doc.SaveAs("C:tmp2.docx"); //закрываем документ Doc.Close(); Word.Quit();
Иногда после сохранения файла нужно узнать его полное имя, т.е. включая путь и расширение. Например, чтобы отправить файл по электронной почте или записать в базу. Если мы сохранили файл методом SaveAs(), то полного имени мы не знаем, ведь расширение к имени файла добавил Ворд. Ну так из Ворда же полное имя можно получить, у документа есть доступное для чтения свойство FullName:
ПолноеИмяФайла = Документ.FullName;
Завершение работы с СОМ-Объектом рекомендуют (неправильно) делать так:
Документ.Close();
Word.Quit(0);
На первый взгляд, можно и не заметить нолик в параметре метода Quit(). А он важен. Это просто константа wdDoNotSaveChanges :-). Закрыться-то Ворд закроется, вместе со всеми файлами, которые пользователь, возможно, открыл и редактирует.
Если мы исходим из предположения, а мы из него исходим, что пользователь может работать интерактивно со своими собственными файлами, которые могут быть открыты в том же экземпляре Ворда, что и наш СОМ-Объект, то торопиться принудительно выгонять пользователей и закрывать экземпляр приложения не стоит. Можно проверить, есть ли еще открытые документы, кроме нашего. Если есть, не закрывать экземпляр Ворда, пусть пользователь спокойно работает, если других документов нет — закрыть:
Документ.Close();
Если (Word.Documents.Count = 0) Тогда
Word.Quit();
КонецЕсли;
Удаление текста из документа Word
Пример удаления текста из документа Word из 1С
//создаем объект для работы с Word Word = Новый COMОбъект("Word.Application"); //создаем новый документ Doc = Word.Documents.Add(); //добавляем параграф Par = Doc.Paragraphs.Add(); Par.Range.InsertBefore("Некоторый текст"); //удаляем слово некоторый и пробел Range = Doc.Range(0, 10); Range.Text = ""; //показываем документ на экране Word.Visible = Истина;
Форматирование текста в документе Word
Пример форматирования текста в документе Word из 1С
//создаем объект для работы с Word Word = Новый COMОбъект("Word.Application"); //создаем новый документ Doc = Word.Documents.Add(); //добавляем параграф Par = Doc.Paragraphs.Add(); Par.Range.InsertBefore("Форматируем этот текст"); //меняем размер шрифта Par.Range.Font.Size = 15; //меняем название шрифта Par.Range.Font.Name = "Verdana"; //выбираем слово "этот" Range = Doc.Range(12, 16); //меняем шрифт на ширный Range.Font.Bold = Истина; //курсив Range.Font.Italic = Истина; //подчеркнутый Range.Font.Underline = Истина; //красный Range.Font.Color = 13311; //показываем документ на экране Word.Visible = Истина;
Чтение текста документа Word
Пример чтения текста из документа Word из 1С
//создаем объект для работы с Word Word = Новый COMОбъект("Word.Application"); //открываем документ C:tmp1.docx Doc = Word.Documents.Open("C:tmp1.docx"); //читаем весь текст документа Text = doc.Content.Text; Сообщить(Text); //читаем с 6-го по 10-й символ From = 6; To = 10; Range = Doc.Range(From, To); Text = Range.Text; Сообщить(Text); //закрыть документ Doc.Close(); Word.Quit();
Вставка картинок
Все картинки в документе Ворд делятся на два вида — вставленные как символ в текст и произвольно расположенные в графическом слое документа (текст их может либо обтекать, либо нет, зависит от параметров каждого объекта). Первый вид картинок представляется объектом InlineShape и доступен в коллекции InlineShapes. Второй вид — объектом Shape и доступен в коллекции Shapes документа. Для деловых документов возиться с размещением картинок в графическом слое нет смысла, достаточно объектов InlineShape.
Принцип прост, находим соответствующий якорь и заменяем его картинкой:
Range = Документ.Range();
Range.Find.Execute(«$[ЯкорьКартинки]$»);
Range.Text = «»;
Документ.InlineShapes.AddPicture (ИмяФайлаКартинки,,, Range);
/// Как создать документ Word на основе шаблона из 1с 8.3, 8.2 &НаКлиенте Функция КакСоздатьДокументWordНаОсновеШаблона(ПутьКШаблону) // В шаблоне уже расставлены поля с определенными // именами, например, org_name, inn, kpp и т.д. // Наша задача - заполнить эти поля и сохранить // этот шаблон в виде вордовкского файла с // расширением docx; // Сам шаблон мы создали по инструкции отсюда: // helpme1s.ru/kak-sozdavat-shablony-word-dlya-ispolzovaniya-v-1s // Или взяли готовым отсюда: // helpme1s.ru/files/ref/bill.dotx ПриложениеВорд = Новый COMОбъект("Word.Application"); ОбъектШаблон = ПриложениеВорд.Documents.Add(ПутьКШаблону); Для Каждого Поле Из ОбъектШаблон.Fields Цикл ПолноеИмяПоля = Поле.Code.Text; // Наши предопределенные поля имеют такой // вид: " MERGEFIELD org_name * MERGEFORMAT". // Наша задача - вытащить из этой конструкции org_name // (ну или другое имя, которое мы задали в ворде). Если (Найти(ПолноеИмяПоля, " MERGEFIELD") = 1) Тогда ПозицияСлеша = Найти(ПолноеИмяПоля, "*"); КороткоеИмяПоля = СокрЛП(Сред(ПолноеИмяПоля, 12, ПозицияСлеша - 12)); ЗначениеПоля = ""; Если КороткоеИмяПоля = "id" Тогда ЗначениеПоля = "1"; ИначеЕсли КороткоеИмяПоля = "bill_date" Тогда ЗначениеПоля = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy"); ИначеЕсли КороткоеИмяПоля = "org_name" Тогда ЗначениеПоля = "ООО ""Ромашка"""; ИначеЕсли КороткоеИмяПоля = "inn" Тогда ЗначениеПоля = "1234567890"; ИначеЕсли КороткоеИмяПоля = "kpp" Тогда ЗначениеПоля = "123456789"; Иначе // ... и так все нужные поля КонецЕсли; Если ЗначениеПоля <> "" Тогда Поле.Select(); ОбъектШаблон.Application.Selection.TypeText(ЗначениеПоля); КонецЕсли; КонецЕсли; КонецЦикла; // Запишем файл в папку "Мои документы" пользователя ФайлДляЗаписи = КаталогДокументов() + "helpme1c_ru_word_test.docx"; // Если такой файл уже существует - удалим его. УдалитьФайлы(ФайлДляЗаписи); // Сохраняем шаблон как документ Word с расширением docx. ОбъектШаблон.SaveAs(ФайлДляЗаписи); // Не забываем закрыть приложение Word. ОбъектШаблон.Application.Quit(); Возврат ФайлДляЗаписи; КонецФункции
Особенности работы с колонтитулами
Перебор всех колонтитулов выполняется так:
WdReplaceAll = 2; Для Каждого Section Из Документ.Sections Цикл Для Каждого Header Из Section.Headers Цикл Range = Header.Range; Range.Find.Execute("$(якорь)$",,,,,,,,, "значение", wdReplaceAll); КонецЦикла; Для Каждого Footer Из Section.Footers Цикл Range = Footer.Range; Range.Find.Execute("$(якорь)$",,,,,,,,, "значение", wdReplaceAll); КонецЦикла КонецЦикла;
Более лаконичное решение заключается в использовании коллекции StoryRanges. Эта коллекция содержит диапазоны (range) всех блоков(?), частей(?) (в справке используется термин story) документа. Тело документа, это главный блок (main story), тоже есть в этой коллекции. Т.е. необязательно искать якоря отдельно в теле документа, отдельно в колонтитулах, все можно сделать одним циклом:
Для Каждого Range Из Документ.StoryRanges Цикл Range.Find.Execute("$(якорь)$",,,,,,,,, "значение", wdReplaceAll); КонецЦикла;
Объектная модель Ворд
Ворд, запущенный в качестве СОМ-Объекта, предоставляет доступ к множеству объектов приложения. Понятие «объект» такое же как везде — программная абстракция, имеющая методы и свойства. Методы могут быть как процедурами, так и функциями, при этом функции можно вызывать как процедуры, игнорируя возвращаемое значение. Свойства могут быть либо объектами, либо обычными (скалярными, примитивными) данными, такими как число, строка, логический тип.
Среди объектов особо выделяются специальные объекты-контейнеры, называемые коллекциями. Каждая коллекция предназначена для хранения ссылок на группу однотипных объектов. Например, коллекция Documents хранит ссылки на объекты Document, коллекция Tables хранит ссылки на объекты Table и т.д. Все коллекции именованы во множественном числе, а обычные объекты в единственном. Нумерация объектов в коллекции начинается с единицы. Коллекции Ворд можно перебирать циклом «Для каждого» языка программирования 1С.
Полный список объектов можно, и нужно, смотреть в справочной системе Ворд (раздел справки по Вижуал Бейсику (VBA)). Для старых версий справка откроется локально на компьютере пользователя. Новые версии отправят на сайт Майкрософт: https://docs.microsoft.com/ru-ru/office/vba/api/overview/word/object-model Текст переведен с английского автоматически и местами понять написанное невозможно. Переключение на английский оригинал делается очень просто, достаточно нажать кнопочку «почитать на английском» в правом верхнем углу страницы. Или в адресе ссылки «ru-ru» заменить на «en-us»: https://docs.microsoft.com/en-us/office/vba/api/overview/word/object-model
Многие методы объектов Ворда в качестве параметров принимают числовые значения. Для того, чтобы не путаться в числовых значениях, в Вижуал Бейсике предусмотрены именованные константы. Например, константа wdFormatRTF соответствует числу 6. В Вижуал Бейсике можно писать код так:
Document.SaveAs («имя файла», wdFormatRTF)
Вне VBA именованные константы недоступны, поэтому код 1С будет таким:
Document.SaveAs («имя файла», 6)
Или, без “магических” чисел, таким:
wdFormatRTF = 6;
Document.SaveAs («имя файла», wdFormatRTF);
Я предпочитаю последний вариант.
Значения всех констант нужно смотреть в справочной системе, там они объединены в смысловые группы, называемые «перечисления» (Enumerations): https://docs.microsoft.com/ru-ru/office/vba/api/word(enumerations)
Смотрите также:
Электронный учебник по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Игра «Кто хочет стать миллионером?» с вопросами на определенную тематику (язык программирования JavaScript, английские, немецкие, французские, испанские, португальские, нидерландские, итальянские слова, электробезопасность, промышленная безопасность, бокс и т.п.), написанная на 1С
Программирование в 1С 8.3 с нуля — краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки