Интернет Windows Android

1с activex для word обычное приложение. Создание внешней печатной формы "Договор"

Доброго времени суток!

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

Подключение дополнительных внешних печатных форм

Запускаем 1С:Предприятие. Открываем справочник «Дополнительные внешние печатные формы» через меню «Сервис» - «Дополнительные отчеты и обработки».

Нажмем кнопку «Добавить», затем зарегистрируем новую печатную форму, нажав «Заменить файл внешней обработки». Автоматически заполнится принадлежность печатной формы документу «Реализация товаров и услуг». Выбираем «Договор» в колонке «Заменяемая печатная форма», чтобы стандартная печатная форма более не использовалась.

Запускаем 1С:Предприятие, открываем справочник "Контрагенты", выбираем контрагента, для которого будет печататься наш договор и по кнопке "Файлы" переходим в справочник "Хранилище дополнительной информации", загружаем в него шаблон для договора и,обязательно, называем его "Договор", как показано на рисунке ниже, иначе программа не сможет найти макет для печатной формы.

Теперь открываем любой документ "Реализация товаров и услуг" и нажимаем кнопку «Печать» - «Договор». Откроется документ Microsoft Word с договором.

Внешнюю печатную форму "Договор" и макет к ней можно скачать по ссылкам ниже.

Макет трудового договора в формате Microsoft Word

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

1. В документе Word создаются опорные фразы, например, "[НомерДоговора]", затем, в модуле обработки производится поиск и замена значений.

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

3. В документе Word добавляются служебные поля, например, «DocVariable» или «Author». Используя DocVariable можно обращаться к переменной по имени, например, «ДокументВорд.Variables.Add(ИмяПеременной, ЗначениеПеременной);», но ее не видно в шаблоне. Поле «Author» отображается в шаблоне, но обращаться к нему придется в цикле по индексу: «ДокументВорд.Fields.item(Индекс).Result.Text = Значение;».

На мой взгляд, первый способ является самым оптимальным. Шаблон документа легко редактируется, опорные фразы видны в тексте. Поэтому шаблон создаём этим способом.

Открываем программу Microsoft Office. Для примера добавляем пару строк, как показано на рисунке ниже и сохраняем шаблон.

Создание внешней печатной формы "Договор"

Запускаем 1С:Предприятие в режиме «Конфигуратор» и через меню «Файл» - «Новый» создаём внешнюю обработку. Добавляем реквизит "Ссылка на объект" и макет "Параметры_Авторегистрации" с типом "Табличный документ". Тип реквизита "Ссылка на объект" зависит от того, для каких объектов будет использоваться печатная форма, в нашем случае печатная форма будет использовать для документа "Реализация товаров и услуг", поэтому указываем тип "ДокументСсылка.РеализацияТоваровУслуг".

Разработка процедуры печати

В настоящее время мы с 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 - применение данного способа может вызвать затруднения. К счастью, нам в этом плане повезло.

ВНИМАНИЕ! При использовании кодов описанных ниже, уберите символ _
Давайте рассмотрим на примерах как это делается! =) Мне известно 2 способа:
1. Путем замены шаблонного текста в макете Wordа.
2. Путем вставки текста с помощью закладок в Wordе,

В первом случае сразу скажу, что длина строки передаваемая в функцию замены, довольно небольшая 255 символов, да и расстановка шаблонных выражений в макете Word занимает довольно много времени. Через процедуру Content.Find.Execute.

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

И так, для начала необходимо добавить Word макет к документу. Добавляем макет с помощью конструктора макетов указав Active document и выбрав соответствующий макет.

Называем его Акт. Открываем макет в 1Ске, ставим курсор в нужном месте, переходим в меню Вставка закладка нажимаем добавить закладку к примеру у меня это НарушенияТекст

Теперь кидаем на форму документа кнопку Сформировать и по нажатию на нее пишем код который открывает наш макет Word ищем закладку по имени и вставляет туда текст:
Код 1C v 8.х //инициализация часть 1
СсылкаМакет = ПолучитьМакет(Акт);
MSWord = СсылкаМакет.Получить();
Попытка
СсылкаМакет = MSWord.Application.Documents(1);
СсылкаМакет.Activate();
//выгружаем табличную часть с нарушениями в строку часть 2
str = Новый COMОбъект(ADODB.Stream);
str.Open();
СтрочкаТаблицы = ЭлементыФормы.Нарушения.ТекущиеДанные;
Для Каждого СтрочкаТаблицы Из Нарушения Цикл
str.WriteText(+ СтрочкаТаблицы.Описание + Нарушены требования СНИПФЗГОСТ: + СтрочкаТаблицы.СНИПФЗГОСТ + Статья: + СтрочкаТаблицы.ЧастьСтатья + Символ(13),0);
КонецЦикла;
str.Position = 0;
НарушенияТекст = str.readText();

//вставляем в закладку текст с нарушениями часть 3
MSWord.Bookmarks(НарушенияТекст).S_elect();
MSWord.Application.S_election.TypeText(НарушенияТекст);

СсылкаМакет.Activate();
Исключение
//если ошибка
Сообщить(ОписаниеОшибки());
MSWord.Application.Quit();
КонецПопытки;
Это пример вывода множества строчек из табличной части одной строкой, если нужно просто выгрузить какой-то реквизит то можно пропустить часть 2 и перейти к части 3.

Для выгрузки табличной части в форме таблицы можно использовать функцию автоформата, примеру код выгрузки табличной части документа Предписание:
Код 1C v 8.х Word = MSWord.Application;
Документ = Word.ActiveDocument();
//Переместиться вниз на 22 строк
Word.S_election.MoveDown(,22);
Документ.Paragraphs.Add();
//подготовка таблицы:
Rng = Word.S_election.Range;
//Формируем заголовок:
Rng.I_nsertAfter(№ п/п*Установленные нарушения и меры по их устранению*Основания);
Rng.I_nsertParagraphAfter();
//сама таблица
СтрочкаТаблицы = ЭлементыФормы.НарушенияПредписание.ТекущиеДанные;
Для Каждого СтрочкаТаблицы из НарушенияПредписание Цикл
Rng.I_nsertAfter(Строка(СтрочкаТаблицы.НомерСтроки)+*+СтрочкаТаблицы.Описание + ; + СтрочкаТаблицы.Предписание +* + СтрочкаТаблицы.СНИПФЗГОСТ + + СтрочкаТаблицы.ЧастьСтатья);
Rng.I_nsertParagraphAfter();
КонецЦикла;
Rng.ConvertToTable(*);
Документ.Tables(1).AutoFormat(17); //номер таблицы в шаблоне
Word.Visible = Истина;
Ну вот и все =)

Еще способ Active document
В Конфигураторе Макеты - правый клик - Добавить
Тип макета: Active document
Создать новый - Документ Microsoft Word

Меню Вставка - Поле - Автоматизация - DocVariable
Написать имя поля в графе "Новое имя:" ДатаПриказа

В модуле формы документа создаем кнопку, и в ее обработчике пишем:



КомОбъект.Variables.Item("ДатаПриказа").Value="24.01.2007";
КомОбъект.Fields.UpDate();

КомОбъект.PrintOut(); //распечатать документ

//Ожидание окончания отправки на печать...
Пока objWord.Application.BackgroundPrintingStatus<>0 Цикл
Предупреждение("Ожидание",1);
КонецЦикла;

КомОбъект.Application.Quit(); //закрыть Word
КомОбъект = 0;
КонецПроцедуры

2) добавляем не поле, а Закладку
Меню Вставка - Закладка и далее указываем ее имя ("ИмяЗакл")
Код 1C v 8.х Процедура ОсновныеДействияФормыWord(Кнопка)
АктивныйДокумент = ПолучитьМакет("Макет");
КомОбъект = АктивныйДокумент.Получить();
КомОбъект.Application.Visible=1;
КомОбъект.Bookmarks(СокрЛП("ИмяЗакл")).S_elect();
КомОбъект.Application.S_election.TypeText(СокрЛП("тест проверка"));
КонецПроцедуры

Код 1C v 8.2 УП // Параметры договора обозначены в тексте переменными вида "[%НомерДоговора%]"
Функция ПечатьДокумента() Экспорт

Договор = ПолучитьМакет("ActiveDocument_ДоговорПоставки"); // получим макет-ActiveDocument
MSWord = Договор.Получить();
Попытка
Doc = MSWord.Application.Documents(1);
Doc.Activate();
Replace = Doc.Content.Find;

FindText = "{НомерДоговора}"; // что искать - имя_шаблона
MatchCase = Ложь; // использовать регулярные выражения
MatchWholeWord = Истина; // искать слово целиком
MatchWildcards = Ложь; // испоьзовать регулярные выражения
MatchSoundsLike = Неопределено; // искать созвучные
MatchAllWordForms = Неопределено; // искать все формы слова
Forward = Истина; // искать вперед
Wrap = Неопределено; // что должен вернуть Find-объект
Format_ = Ложь; // использовать форматирование
ReplaceWith = "N777"; // текст, на который надо заменить имя_шаблона

// кратко:
//Replace.Execute(FindText,Ложь,Истина,Ложь,Истина,Ложь,НомерДоговора);

Replace.Execute(
FindText,
MatchCase,
MatchWholeWord,
MatchWildcards,
MatchSoundsLike,
MatchAllWordForms,
Forward,
Wrap,
Format_,
НомерДоговора);

MSWord.Application.Visible = Истина;
MSWord.Activate();
Исключение
Сообщить(ОписаниеОшибки());
MSWord.Application.Quit();
КонецПопытки;

Возврат 0;

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

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С:Предприятие 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.