Работа с ms word из 1с. Подключение дополнительных внешних печатных форм

Публикация - своего р ода памятка, содержащая примеры кода для:

1. заполнение шаблона Word данными из 1С;
2. заполнение колонтитулов Word данными из 1С;
3. заполнение таблицы в Word данными из 1С;

Начало работы

В большинстве случаев перед нами ставится следующая задача:
Нужно открыть документ Word, заполненный данными из 1С.

Для этого нам нужно подготовить шаблон документа Word. Не путайте это с Word Template, специальные файлы Word, которые содержат настройки документов для многократного использования. Нам нужен обычный вордовский документ с расширениеми *.docx или *.doc. А далее поместить этот документ в макет с двоичными данными.

Попытка //Получаем макет из двоичных данных Шаблон = ПолучитьМакет(ДополнительныеПараметры.ВидДоговора); ИмяФайла = ПолучитьИмяВременногоФайла(".docx"); Шаблон.Записать(ИмяФайла); //Создаем COM-объект для работы с Word ОбъектВорд = Новый COMОбъект("Word.Application"); ОбъектВорд.Documents.add(ИмяФайла); //В Word можно открывать в одном приложении несколько документов, поэтому ОбъектВорд.Application.Documents - это коллекция открытых документов. //В нашем случае документ открыт всегда один ДокументВорд = ОбъектВорд.Application.Documents(1); ДокументВорд.Activate(); Исключение Сообщить("Ошибка при запуске приложения "+ОписаниеОшибки()); КонецПопытки; //Разумеется, получение COM-объекта нужно поместить в попытку. Мало ли, что-то пойдет не так.

Читатель может справедливо заметить, что используется модальный вызов, и погрозить автору пальцем. И будет прав.

//Создадим структуру параметров документа ПараметрыДокумента = ПодготовитьСтрукутруПараметров(); //Заполним структуру параметров документа ЗаполнитьСтруктуруПараметров(ПараметрыДокумента);

Углубимся немножко в принципы работы Word...

Каждый документ Word разделен на разделы, которые состоят из страниц.

Для каждого раздела есть возможность создавать свою нумерацию элементов, уникальные колонтитулы и настройки параметров страницы. Так, например, чтобы повернуть одну из страниц (вывести на печать как альбомную), нужно создать под неё отдельный раздел.

Каждая страница Word разделена на несколько областей:

  • Верхний колонтитул
  • Основной текст
  • Нижний колонтитул

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

//Объект, содержит весь основный текст из всех разделов ДокументВорд.Content //Объект содержит коллекцию разделов документа ДокументВорд.Sections //В каждом разделе есть своя коллекция для верхних колонтитулов ДокументВорд.Sections(1).Headers //И своя коллекция для нижних колонтитулов ДокументВорд.Sections(1).Footers //При этом, если стоит галочка "Уникальный колонтитул для первой страницы", то коллекции Headers и Footers будут содержать два элемента

Заполнение пользовательских параметров

При обращении к этим коллекциям мы можем выполнять в них поиск и получать встроенные объекты, например, таблицы.

Теперь мы более-менее поняли, как обращаться к областям Word, можем в них пошуровать и выполнить замену наших параметров:

//Переберем все параметры и заменим их в документе Для каждого Параметр Из ПараметрыДокумента Цикл ВыполнитьЗамену(ДокументВорд.Content, Параметр.Ключ, Параметр.Значение); //Ищим вхождения параметра в верхнем колонтитуле ВыполнитьЗамену(ДокументВорд.Sections(1).Headers.Item(1).Range(), Параметр.Ключ, Параметр.Значение); //Ищим вхождения параметра в нижнем колонтитуле первой и последующих страниц ВыполнитьЗамену(ДокументВорд.Sections(1).Footers.Item(1).Range(), Параметр.Ключ, Параметр.Значение); ВыполнитьЗамену(ДокументВорд.Sections(1).Footers.Item(2).Range(), Параметр.Ключ, Параметр.Значение); КонецЦикла; //Выполнить поиск и замену Функция ВыполнитьЗамену(знач Object, Параметр, Значение) Object.Find.Execute(Параметр,,Значение,2) КонецФункции

Рассмотри подробнее метод Execute. Его параметры идентичны диалоговуму окну при замене/поиске непоседресвенно из MS Word:

А вот и основные параметры (вольный перевод справки MSDN):

  1. Искомый текст - Строка - Текст для замены. Текст может содержать специальные параметры. Например, ^p - абзац, ^t - табуляция
  2. Чувствительность к регистру - Булево - Если истина, то поиск будет осуществляться с учетом регистра
  3. Слова целиком - Булево - Если истина, то ищутся слова целиком. Вхождение слов не учитываются. Например, при поиске слова дом будет пропущено слово домашний
  4. Использовать подстановочные знаки - Булево - Если истина, то используются встроенные регулярные выражения.
  5. Искать похожие - Булево - Если истина, то результат поиска будет содержать похожие слова
  6. Искать все формы - Булево - Если истина, то результат поиска будет содержать различные формы слов.
  7. Поиск сначала - Булево - Если истина, то будет осуществляться с начала до конца документа
  8. Охват - WdFindWrap - Опредяляет направление поиска
  9. Формат - Format - Формат искомого текста
  10. Строка замены - Строка - Строка, на которую будет заменен исходный текст
  11. Количество замен - WdReplace - Определяет сколько раз выполнять замену
  12. и т.д.

WdReplace - Constant Value:
wdReplaceAll 2
wdReplaceNone 0
wdReplaceOne 1

Данный метод не позволяет получить "Строка замены" как выделенную область, но он работает где-то в 10 раз медленнее. Для получения выделенной области можно воспользоваться немножко откорректированной типовой функцией:

//УправлениеПечатьюMSWordКлиент c незначительными изменениями для конфигурации УПП 1.3 Функция ВыполнитьЗамену(знач Object, Параметр, Значение) СтрокаПоиска = "[" + Параметр + "]"; СтрокаЗамены = Строка(Значение); //Необходимо выделить областей, в которой мы осуществляем замену Object.Select(); //Получаем выделенную область Selection = Object.Application.Selection; //Найдем все вхождения параметра и заменим его на нужное нам значение FindObject = Selection.Find; FindObject.ClearFormatting(); Пока FindObject.Execute(СтрокаПоиска) Цикл Если ПустаяСтрока(СтрокаЗамены) Тогда Selection.Delete(); Иначе Selection.TypeText(СтрокаЗамены); КонецЕсли; КонецЦикла; //Отменим выделение Selection.Collapse(); КонецФункции

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

//Редактирование шрифта Selection.Font //Редактирование цвета Selection.HighlightColorIndex

Также есть второй подход, использующий такой объект Word, как поля. Мне он не очень нравится, т.к. в больших документах, порядка 100 страниц, эти поля начинают глючить (исчезать, не подставлять нужные значения) и прочая ерунда. Ну по крайней мере в Word 2007. Но я его все равно приведу:

При подготовке шаблона в тело документа необходимо навставлять полей с типом DOCVARIABLE (можно вставлять горячими клавишими Ctrl+F9).

Доступ к таким полям можно получить следующим нехитрым образом:

ДокументВорд.Variables.Item(НазваниеПараметра).Values

Заполнение таблиц по шаблону

Итак, мы заполнили параметры в основном тексте документа, заменили параметры в колонтитулах, но у нас еще есть одна неприятность - нужно заполнить таблицу.

Подход, описанный ниже, годится только для таблиц с заранее известным форматом. Т.е. мы можем как угодно отформатировать таблицу и её строки изначально. Но потом изменять довольно-таки проблематично.

К таблицам можно получить доступ через области документа.

//Получаем доступ к первой таблице в основном тексте Таблица = ДокументВорд.Content.Tables(1)

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

//Данные для заполнения ПараметрыТЧ = ПараметрыДокумента.ПриложениеТЧ; //Нужно оставить шапку и первую строку нетронутой Итератор = 2; Таблица = ДокументВорд.Content.Tables(3); Для каждого Строка Из ПараметрыТЧ Цикл //По умолчанию добавляет строку выше первой Таблица.Rows.Add(); ЗаполнитьСтрокуТаблицы(Таблица, Итератор, Строка,"ПП,НоменклатураНаименование,ЕдИзмерения,ЦенаСтрокой",ПараметрыТЧ); Итератор = Итератор + 1; КонецЦикла; //Структура шаблонов содержит Наименование колонок и их порядок Процедура ЗаполнитьСтрокуТаблицы(Таблица, НомерСтроки, ЗначениеЗаполнения, СтруктураШаблонов,ТаблицаЗначений) МассивСтрок = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтруктураШаблонов,","); Итератор = 1; Для каждого Строка Из МассивСтрок Цикл Если ТаблицаЗначений.Колонки.Найти(Строка) = Неопределено И Строка <> "ПП" Тогда Итератор = Итератор + 1; Продолжить; //Не забываем, что Шапка тоже строка, а при нумерации нам нужно её исключить ИначеЕсли Строка = "ПП" Тогда Таблица.Cell(НомерСтроки, Итератор).Range().Text = Строка(НомерСтроки-1); Итератор = Итератор + 1; Продолжить; КонецЕсли; Таблица.Cell(НомерСтроки, Итератор).Range().Text = Строка(ЗначениеЗаполнения[Строка]); Итератор = Итератор + 1; КонецЦикла; КонецПроцедуры

Вот, в принципе, и все. Основные вопросы, возникающие при работе с Word, я постарался осветить. Надеюсь, данный обзор поможет вам в работе =)

Спасибо за советы и комментарии:
,

Критика только приветствуется. Чем больше замечаний, тем лучше будет гайд =)

Публикация - своего р ода памятка, содержащая примеры кода для:

1. заполнение шаблона Word данными из 1С;
2. заполнение колонтитулов Word данными из 1С;
3. заполнение таблицы в Word данными из 1С;

Начало работы

В большинстве случаев перед нами ставится следующая задача:
Нужно открыть документ Word, заполненный данными из 1С.

Для этого нам нужно подготовить шаблон документа Word. Не путайте это с Word Template, специальные файлы Word, которые содержат настройки документов для многократного использования. Нам нужен обычный вордовский документ с расширениеми *.docx или *.doc. А далее поместить этот документ в макет с двоичными данными.

Попытка //Получаем макет из двоичных данных Шаблон = ПолучитьМакет(ДополнительныеПараметры.ВидДоговора); ИмяФайла = ПолучитьИмяВременногоФайла(".docx"); Шаблон.Записать(ИмяФайла); //Создаем COM-объект для работы с Word ОбъектВорд = Новый COMОбъект("Word.Application"); ОбъектВорд.Documents.add(ИмяФайла); //В Word можно открывать в одном приложении несколько документов, поэтому ОбъектВорд.Application.Documents - это коллекция открытых документов. //В нашем случае документ открыт всегда один ДокументВорд = ОбъектВорд.Application.Documents(1); ДокументВорд.Activate(); Исключение Сообщить("Ошибка при запуске приложения "+ОписаниеОшибки()); КонецПопытки; //Разумеется, получение COM-объекта нужно поместить в попытку. Мало ли, что-то пойдет не так.

Читатель может справедливо заметить, что используется модальный вызов, и погрозить автору пальцем. И будет прав.

//Создадим структуру параметров документа ПараметрыДокумента = ПодготовитьСтрукутруПараметров(); //Заполним структуру параметров документа ЗаполнитьСтруктуруПараметров(ПараметрыДокумента);

Углубимся немножко в принципы работы Word...

Каждый документ Word разделен на разделы, которые состоят из страниц.

Для каждого раздела есть возможность создавать свою нумерацию элементов, уникальные колонтитулы и настройки параметров страницы. Так, например, чтобы повернуть одну из страниц (вывести на печать как альбомную), нужно создать под неё отдельный раздел.

Каждая страница Word разделена на несколько областей:

  • Верхний колонтитул
  • Основной текст
  • Нижний колонтитул

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

//Объект, содержит весь основный текст из всех разделов ДокументВорд.Content //Объект содержит коллекцию разделов документа ДокументВорд.Sections //В каждом разделе есть своя коллекция для верхних колонтитулов ДокументВорд.Sections(1).Headers //И своя коллекция для нижних колонтитулов ДокументВорд.Sections(1).Footers //При этом, если стоит галочка "Уникальный колонтитул для первой страницы", то коллекции Headers и Footers будут содержать два элемента

Заполнение пользовательских параметров

При обращении к этим коллекциям мы можем выполнять в них поиск и получать встроенные объекты, например, таблицы.

Теперь мы более-менее поняли, как обращаться к областям Word, можем в них пошуровать и выполнить замену наших параметров:

//Переберем все параметры и заменим их в документе Для каждого Параметр Из ПараметрыДокумента Цикл ВыполнитьЗамену(ДокументВорд.Content, Параметр.Ключ, Параметр.Значение); //Ищим вхождения параметра в верхнем колонтитуле ВыполнитьЗамену(ДокументВорд.Sections(1).Headers.Item(1).Range(), Параметр.Ключ, Параметр.Значение); //Ищим вхождения параметра в нижнем колонтитуле первой и последующих страниц ВыполнитьЗамену(ДокументВорд.Sections(1).Footers.Item(1).Range(), Параметр.Ключ, Параметр.Значение); ВыполнитьЗамену(ДокументВорд.Sections(1).Footers.Item(2).Range(), Параметр.Ключ, Параметр.Значение); КонецЦикла; //Выполнить поиск и замену Функция ВыполнитьЗамену(знач Object, Параметр, Значение) Object.Find.Execute(Параметр,,Значение,2) КонецФункции

Рассмотри подробнее метод Execute. Его параметры идентичны диалоговуму окну при замене/поиске непоседресвенно из MS Word:

А вот и основные параметры (вольный перевод справки MSDN):

  1. Искомый текст - Строка - Текст для замены. Текст может содержать специальные параметры. Например, ^p - абзац, ^t - табуляция
  2. Чувствительность к регистру - Булево - Если истина, то поиск будет осуществляться с учетом регистра
  3. Слова целиком - Булево - Если истина, то ищутся слова целиком. Вхождение слов не учитываются. Например, при поиске слова дом будет пропущено слово домашний
  4. Использовать подстановочные знаки - Булево - Если истина, то используются встроенные регулярные выражения.
  5. Искать похожие - Булево - Если истина, то результат поиска будет содержать похожие слова
  6. Искать все формы - Булево - Если истина, то результат поиска будет содержать различные формы слов.
  7. Поиск сначала - Булево - Если истина, то будет осуществляться с начала до конца документа
  8. Охват - WdFindWrap - Опредяляет направление поиска
  9. Формат - Format - Формат искомого текста
  10. Строка замены - Строка - Строка, на которую будет заменен исходный текст
  11. Количество замен - WdReplace - Определяет сколько раз выполнять замену
  12. и т.д.

WdReplace - Constant Value:
wdReplaceAll 2
wdReplaceNone 0
wdReplaceOne 1

Данный метод не позволяет получить "Строка замены" как выделенную область, но он работает где-то в 10 раз медленнее. Для получения выделенной области можно воспользоваться немножко откорректированной типовой функцией:

//УправлениеПечатьюMSWordКлиент c незначительными изменениями для конфигурации УПП 1.3 Функция ВыполнитьЗамену(знач Object, Параметр, Значение) СтрокаПоиска = "[" + Параметр + "]"; СтрокаЗамены = Строка(Значение); //Необходимо выделить областей, в которой мы осуществляем замену Object.Select(); //Получаем выделенную область Selection = Object.Application.Selection; //Найдем все вхождения параметра и заменим его на нужное нам значение FindObject = Selection.Find; FindObject.ClearFormatting(); Пока FindObject.Execute(СтрокаПоиска) Цикл Если ПустаяСтрока(СтрокаЗамены) Тогда Selection.Delete(); Иначе Selection.TypeText(СтрокаЗамены); КонецЕсли; КонецЦикла; //Отменим выделение Selection.Collapse(); КонецФункции

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

//Редактирование шрифта Selection.Font //Редактирование цвета Selection.HighlightColorIndex

Также есть второй подход, использующий такой объект Word, как поля. Мне он не очень нравится, т.к. в больших документах, порядка 100 страниц, эти поля начинают глючить (исчезать, не подставлять нужные значения) и прочая ерунда. Ну по крайней мере в Word 2007. Но я его все равно приведу:

При подготовке шаблона в тело документа необходимо навставлять полей с типом DOCVARIABLE (можно вставлять горячими клавишими Ctrl+F9).

Доступ к таким полям можно получить следующим нехитрым образом:

ДокументВорд.Variables.Item(НазваниеПараметра).Values

Заполнение таблиц по шаблону

Итак, мы заполнили параметры в основном тексте документа, заменили параметры в колонтитулах, но у нас еще есть одна неприятность - нужно заполнить таблицу.

Подход, описанный ниже, годится только для таблиц с заранее известным форматом. Т.е. мы можем как угодно отформатировать таблицу и её строки изначально. Но потом изменять довольно-таки проблематично.

К таблицам можно получить доступ через области документа.

//Получаем доступ к первой таблице в основном тексте Таблица = ДокументВорд.Content.Tables(1)

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

//Данные для заполнения ПараметрыТЧ = ПараметрыДокумента.ПриложениеТЧ; //Нужно оставить шапку и первую строку нетронутой Итератор = 2; Таблица = ДокументВорд.Content.Tables(3); Для каждого Строка Из ПараметрыТЧ Цикл //По умолчанию добавляет строку выше первой Таблица.Rows.Add(); ЗаполнитьСтрокуТаблицы(Таблица, Итератор, Строка,"ПП,НоменклатураНаименование,ЕдИзмерения,ЦенаСтрокой",ПараметрыТЧ); Итератор = Итератор + 1; КонецЦикла; //Структура шаблонов содержит Наименование колонок и их порядок Процедура ЗаполнитьСтрокуТаблицы(Таблица, НомерСтроки, ЗначениеЗаполнения, СтруктураШаблонов,ТаблицаЗначений) МассивСтрок = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтруктураШаблонов,","); Итератор = 1; Для каждого Строка Из МассивСтрок Цикл Если ТаблицаЗначений.Колонки.Найти(Строка) = Неопределено И Строка <> "ПП" Тогда Итератор = Итератор + 1; Продолжить; //Не забываем, что Шапка тоже строка, а при нумерации нам нужно её исключить ИначеЕсли Строка = "ПП" Тогда Таблица.Cell(НомерСтроки, Итератор).Range().Text = Строка(НомерСтроки-1); Итератор = Итератор + 1; Продолжить; КонецЕсли; Таблица.Cell(НомерСтроки, Итератор).Range().Text = Строка(ЗначениеЗаполнения[Строка]); Итератор = Итератор + 1; КонецЦикла; КонецПроцедуры

Вот, в принципе, и все. Основные вопросы, возникающие при работе с Word, я постарался осветить. Надеюсь, данный обзор поможет вам в работе =)

Спасибо за советы и комментарии:
,

Критика только приветствуется. Чем больше замечаний, тем лучше будет гайд =)

В этом уроке мы научимся создавать шаблоны Word с предопределенными именованными полями, которые можно в дальнейшем заполнять программно из 1С ().

Что это означает на практике?

К примеру, у нас есть типовая форма счёта на оплату, который мы выставляем покупателям.

Так вот - мы можем один раз создать шаблон такого счёта, прописать в нём поля id, date, organization, inn, kpp... и т.д. и затем программным способом готовые для отправки покупателям счета на оплату.

Сейчас мы вместе в Word 2007 создадим такой шаблон, вернее я покажу сам принцип.

1. Первым делом создаём обычной документ Word.

2. Оформляем его как обычно.

3. Затем устанавливаем курсор в место, куда будет вставляться значение программно (пусть это будет номер счёта):

4. Переходим на закладку "Вставка" и выбираем "Экспресс-блоки"-"Поле...":

5. В открывшемся диалоге выбираем тип поля "MergeField" и пишем имя поля (по которому мы его будем находит в 1с программно) - "number":

6. Нажимаем "Ок" и в документ вставляется поля типа "MergeField" с именем "number":

Отлично! Это то что надо

7. Оформляем весь документ в этом же стиле (вставляя нужные поля):

И, наконец, сохраняем этот документ в виде шаблона Word (с расширением dotx):

Полученный файл с расширением dotx для программного создания документов.

С уважением, Владимир Милькин (преподаватель и разработчик ).

Очень полезная внешняя обработка для всех типовых конфигураций 1С:Предприятие 8.3, позволяет формировать файл Word по выбранному шаблону из справочников и документов системы. С ее помощью вы можете распечатывать из 1С различные спецификации, трудовые договоры и договоры с контрагентами, гарантийные талоны и прочее прочее. Имея под рукой Word нужной структуры и чуть доработав его, вы получите возможность формировать его прямо из 1с с заполнением всех нужных параметров.

Принцип работы обработки следующий:

  • выбираем Word нужной структуры,
  • в тех местах файла, где необходимо вставить информацию из 1С, делаем закладки,
  • после подготовки шаблона добавляем его в 1С (справочник Файлы),
  • настраиваем заполнение шаблона печати в 1С,
  • печатаем нужные документы/справочники, выбрав созданный шаблон.

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

Для демонстрации работы обработки настроим печать спецификации к договору из документа Реализация товаров и услуг. Допустим, у нас есть такой Word:

Из него будем формировать полноценную спецификацию. Начинаем с того, что вставляем закладки в тех местах, где необходимо подставлять информацию из базы:



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

При печати также будем заполнять таблицу товаров. Чтобы она сформировалась красиво, оставим шапку и одну пустую строку:


Сохраняем Word, закрываем.

Настройка заполнения шаблона

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


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

В открывшемся окне настроек первым делом создадим новый файл в программе (имеется в виду элемент справочника Файлы ) и привяжем к нему наш Word:


В открывшемся окне выбираем Добавить файл :


Затем выбираем его в настройках шаблона. После этого заполняется таблица закладок, нам нужно выбрать источники заполнения данных в этих закладках:


В качестве источника используются реквизиты самого документа продажи, а также производные от этих реквизитов:

При печати можно использовать также дополнительные реквизиты справочников и документов.

Список доступных реквизитов очень большой, удобно воспользоваться быстрым вводом:


В результате выбора источника таблица примет следующий вид:


Для значения к строках таблицы доступно склонение по падежам, а также сокращение ФИО:


Для печати таблицы в Word выберем исходную таблицу документа:


После выбора таблицы появляется справка с именами тех реквизитов, которые можно использовать для вывода таблицы в Word. Нам остается перечислить нужные реквизиты через запятую (в порядке следования колонок файла). Допускается оставлять пустое значение в колонке или писать туда произвольный текст:


Все ОК, теперь можем печатать нужный Word.

Печать по настроенному шаблону доступна теперь для всех, т.е. пользователям не нужно каждому настраивать печать самостоятельно.



Можем печатать как один документ, так и список:


На форме настроек печати помимо создания новых шаблонов можно редактировать имеющиеся:


В том случае, если для объекта настроено несколько шаблонов Word, то при выборе команды печати откроется окно с выбором нужного:


Во избежание коллизий с правами доступа пользователей к справочнику Файлы вам необходимо установить помимо самой обработки печати в Word еще и расширение для 1С (находится в одном архиве с обработкой), которое предоставит пользователям доступ на чтение справочника.

Если у вас есть вопросы/замечания/предложения по данной обработке, буду рад ответить.

Релиз 1.1.2.2 от 15.12.2018

Для вывода даты при печати шаблона добавлена возможность выбора формата, в табличной части помимо номенклатуры теперь можно указывать артикул и единицу измерения:


Теперь можно удалять ненужные шаблоны:


Релиз 1.1.2.3 от 29.01.2019

Появилась возможность выводить части даты по отдельности - день, месяц (номер или название) и год:


Для физических лиц (и контрагентов с типом физлицо) теперь можно выводить паспортные данные:


Релиз 1.1.2.4 от 12.03.2019

При печати в Word табличной части документов товародвижения появилась возможность использовать не только реквизиты этой табличной части, но и любые реквизиты номенклатуры:


Релиз 1.1.2.5 от 12.07.2019

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


По окончании процедуры печати откроется форма присоединенного файла.


Из этой формы можно при необходимости открыть на просмотр/редактирование заполненный шаблон Word.

В настоящее время мы с Lord of fear трудимся над одним интересным проектом - разрабатываем решение на базе платформы 1С:Предприятие 8.2 для одной крупной компании. Для поставленных задач, возможностей 1C’ски более, чем предостаточно и мы ничуть не жалеем о нашем выборе. Собственно дальше речь пойдет не о великой и могучей платформе 1С:Предприятие.

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

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

Подумали мы подумали и решили отказаться от типичных макетов типа “Табличный документ”, а заюзать возможности MS Word. Идея была примерно такой:

1. Создать шаблоны необходимых документов. Все файлы шаблонов создавались именно как шаблоны для MS Word. Кто не в курсе, шаблоны - это файлы с расширением dot. На их основе можно создавать новые документы.

2. При помощи технологии OLE производить создание документов и замену псевдо-переменных на нужный текст. Псевдо-переменные оформлялись в виде: [ИмяПеременной].

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

Сложностей в принципе никаких нет, но до этого дня нам обоим не приходилось работать из “1С:Предприятие” с MS Word. В основном все создаваемые мной макеты печатных форм базировались на табличных документах, поэтому опыта в передачи данных из платформы, скажем в MS Word/Excel у меня не было. Считыванием данных из Excel приходилось заниматься частенько, а вот передавать - никогда.

Исполнив пару треков под гитару, мы решили отложить многострадальный инструмент и приступить к работе. Немного покумекав и почитав хелпы, нами был набросан вот такой примерчик:

//Создаем новый объекта типа Word.Application WordApplication = Новый COMОбъект("WORD.Application"); //Создаем новый документ на основе шаблона //В переменной ПутьКШаблону указываем полный путь к созданному //нами шаблону (файл с расширешением dot) НовыйДокумент = WordApplication .Documents.Add(ПутьКШаблону); //Готовимся к поиску ЗаменаКонтента = НовыйДокумент.content.Find; //Заменяем текст //В первый параметр метода Execute передаем строку которую требуется заменить //В девятый - строку, на которую будет производится заменя //т.е. в ЧтоЗаменяем мы будем передавать имя переменной (например, [ИмяПользователя]) //а в последний - ее значение ЗаменаКонтента.Execute(ЧтоЗаменяем,Ложь,Истина,Ложь,Истина,Ложь,Строка(ЧемЗаменяем)); //Дальше все зависит от наших хотелок //Сохранение документа НовыйДокумент.SaveAs(ПутьДляСохранения); //Печать документа НовыйДокумент.PrintOut(); //По окончанию работы требуется закрыть документ и сам Winword. Делается это так //Для метода Quit я передаю значение Ложь. Это говорит о том, что нам не требуется сохранять заполненный документ. WordApplication.application.Quit(Ложь); WordApplication = 0;

Результаты работы

Вариант использования MS Word для генерации изящных печатных форм нас полностью устроил. Мы потратили пару часиков для написания процедур-оберток, а также переделали ранее созданные формы под шаблоны MS Word. Результатом мы остались более, чем довольны. Все работает шустро и наш заказчик без проблем может самостоятельно изменить шаблоны выходных документов. На случай косяков (ну, если заказчик случайно дропнет имеющиеся шаблоны) мы предусмотрели возможность восстановления оригинальных файлов-шаблонов.

Если ты решишься применять данных подход в своих проектах, то будь предельно осторожен. Применение всех этих няшек требует наличия на компе пользователя MS Word. Учитывая, что сегодня многие компании переходят на ужасный (ИМХО) OpenOffice - применение данного способа может вызвать затруднения. К счастью, нам в этом плане повезло.



Просмотров