Внешняя печатная форма 1с с макетом документа Word
-

Внешняя печатная форма 1с с макетом документа Word

38
86207
12.02.2021 Игорь Торба

Содержание:

1.       Чек-лист разработки для создания внешней печатной формы

2.       Пример разработки в 1С 8.3 Зарплата и управление персоналом


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


Весь принцип реализации строиться на использовании расширения. Причем, добавлять в расширение объекты основной конфигурации практически не нужно. Это очень удобно для дальнейших обновлений конфигураций с расширениями. Возникает вопрос: «А при чем здесь внешняя печатная форма, ведь это расширение?». Дело в том, что расширение легко устанавливается в программу в пользовательском режиме. А если еще ее объекты обособленны от объектов основной конфигурации, то, я думаю, можно называть ее внешней.


Пожалуй, единственным ограничением является наличие в конфигурации Библиотеки стандартных подсистем (далее – БСП). Данный метод «активно» использует механизмы этой библиотеки, поэтому БСП должно быть интегрировано в конфигурацию информационной базы (далее – ИБ). Но здесь особо беспокоиться не нужно, т.к. БСП сейчас присутствует практически во всех типовых конфигурациях.


Перед тем как продемонстрировать пример разработки, предлагаю ознакомиться с чек-листом и представить общую последовательность действий.  


1. Чек-лист разработки для создания внешней печатной формы


1.Создать расширение в конфигурации ИБ

2.В расширении добавить новую обработку (далее Обработка)

3.Обработку включить в подсистему ПодключаемыеОтчетыИОбработки

4.Создать шаблон (документ в формате MS Word) с необходимым содержанием и установить параметры

5.В обработку добавить макет и загрузить в него файл шаблона, созданного в пункте 4

6.В обработку добавить форму и в модуле формы создать функцию:

·         ВыполнитьКомандуПечати – экспортная, пользовательская

7.В модуле менеджера обработки создать 3 процедуры и 4 функции:

·         ПриОпределенииНастроек - экспортная, предопределенная БСП

·         ДобавитьКомандыПечати - экспортная, предопределенная БСП

·         Печать - экспортная, предопределенная БСП

·         ПолучитьДанныеПечати - экспортная, предопределенная БСП

·         ПолучитьДанныеОбъекта – пользовательская

·         ОбластиМакетаОфисногоДокумента – пользовательская

·         НапечататьДокумент– пользовательская  


2. Пример разработки в 1С 8.3 Зарплата и управление персоналом


Давайте рассмотрим этот процесс на примере создания печатной формы дополнительного соглашения к трудовому договору в формате файла MS Word. В качестве информационной базы я буду использовать конфигурацию 1C 8.3 Зарплата и управление персоналом версии 3.1.14.183, установленную на платформе 1С:Предприятие 8.3 (8.3.17.1496). В данной конфигурации используется БСП версии 3.1.2.469.


1.Создаем расширение в конфигурации ИБ.


Запускаем 1С:Предприятие в режиме конфигуратора. Открываем список расширений с помощью команды «Расширения конфигурации» пункта меню «Конфигурация» и добавляем новое расширение. После добавления расширения в список, необходимо будет снять флажок «Безопасный режим» как это показано на Рис.1. Если безопасный режим оставить включенным, то при печати нашей формы программа будет «ругаться».


Расширение конфигурации в 1С 8.3 ЗУП

Рис. 1 Расширение конфигурации в 1С 8.3 Зарплата и управление персоналом


2.Добавляем в расширение новую обработку.


Делаем двойной клик по строке списка с нашим расширением и открываем конфигурацию расширения. В дереве конфигурации находим «Обработки» … выделяем … правая клавиша мышки … Добавить. Я назвал обработку «Расш1_ПечатьWord».


3. Включаем обработку в подсистему ПодключаемыеОтчетыИОбработки.


Для этого необходимо добавить в расширение подсистему ПодключаемыеОтчетыИОбработки из основной конфигурации. Переходим в окно основной конфигурации, находим подсистему ПодключаемыеОтчетыИОбработки в дереве, выделяем и через контекстное меню жмем команду «Добавить в расширение» (см. Рис.2)


Добавление в расширение в 1С 8.3 Зарплата и управление персоналом

Рис. 2 Добавление в расширение в 1С 8.3 Зарплата и управление персоналом


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


4.Создаем шаблон-документ Word с необходимым содержанием и параметрами.


На этом этапе берем шаблон доп. соглашения – документ в формате MS Word c расширением .docx, устанавливаем разделители областей вывода, а в местах, где необходимо подставить значения из базы 1С устанавливаем маркеры параметров.


Разделитель области предназначен для того, чтобы «именовать» части документа-шаблона для дальнейшего вывода средствами встроенного языка 1С. Разделители представляют собой пару - открывающий тэг {v8 Область.<Имя области>} в самом начале области документа и закрывающий тэг {/v8 Область.<Имя области>} в самом конце области документа.


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


Маркеры параметров выполняют такую же роль, как и параметры стандартных печатных макетов, и имеют следующий формат {v8 <Имя параметра>}


Документ в формате MS Word

Рис. 3 Документ в формате MS Word


5. Добавляем в обработку макет и загружаем в него файл шаблона.


Добавляем в обработку макет. Тип макета – двоичные данные. Название должно начинаться с префикса ПФ_DOC_ Для этого примера я назвал его «ПФ_DOC_ДопСоглашение».


Далее кликаем по макету печатной формы и открывается форма с кнопкой «Загрузить из файла». Загружаем наш шаблон .docx, созданный ранее(пункт 4).


6. В обработку добавляем форму.


Теперь в нашей обработке «Расш1_ПечатьWord» создаем форму. Форма должна быть основной, поэтому при создании формы важно, чтобы флажок «Назначить форму основной» был установлен.


В модуль формы копируем функцию с Рис.4


 Команда печати в 1С 8.3 Зарплата и управление персоналом

Рис. 4 Функция модуля формы в 1С 8.3 Зарплата и управление персоналом

 

7. В модуле менеджера обработки создадим необходимые процедуры и функции.


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


7.1 ПриОпределенииНастроек


Данная процедура является предопределенной БСП, поэтому название нужно сохранить. Изменить можно размещение (подчеркнуто красным). В моем примере команда печати должна располагаться в справочнике сотрудники.


 Команда печати в 1С 8.3 Зарплата и управление персоналом

Рис. 5 Команда печати в 1С 8.3 Зарплата и управление персоналом


7.2 ДобавитьКомандыПечати


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


печать в 1С 8.3 Зарплата и управление персоналом

Рис. 6 Добавление команды печати в 1С 8.3 Зарплата и управление персоналом


7.3 Печать


Данная процедура является предопределенной БСП поэтому название нужно сохранить. В переменную ИдентификаторКоманды и ИмяМенеджераПечати устанавливаем имя идентификатора и менеджера печати из процедуры ДобавитьКомандуПечати (пункт 7.2).


Процедура печати в 1С 8.3 Зарплата и управление персоналом

Рис. 7 Процедура печати в 1С 8.3 Зарплата и управление персоналом


7.4 ПолучитьДанныеПечати


Данная функция является предопределенной БСП поэтому название нужно сохранить. Аналогично предыдущему шагу, устанавливаем в переменную ИдентификаторКоманды имя идентификатора из процедуры ДобавитьКомандуПечати.


В параметр функции УправлениеПечатью.МакетПечатнойФормы устанавливаем полный путь к макету печатной формы, созданному в пункте 5 нашей статьи.


Получение данных объекта в 1С 8.3

Рис. 8 Получение данных печати в 1С 8.3 Зарплата и управление персоналом

 

7.5 ПолучитьДанныеОбъекта


В этой функции необходимо создать структуру с данными, которыми будет заполняться печатная форма. Ключ структуры – имя параметра шаблона Word {v8 <Имя параметра>}, а значение – значение из базы 1С. Параметр функции СсылкаНаОбъект – ссылка на объект печати. В нашем случае это ссылка на сотрудника.


Получение данных объекта в 1С 8.3 Зарплата и управление персоналом

Рис. 9 Получение данных объекта в 1С 8.3 Зарплата и управление персоналом


7.6 ОбластиМакетаОфисногоДокумента


Здесь описываем области и устанавливаем типы.

Возможные типы областей:

·         Общая – используется однократно.

·         СтрокаТаблицы – используется для вывода множества строк;

·         Список – используется для вывода множества строк;

·         ВерхнийКолонтитул;

·         НижнийКолонтитул;


документ в 1С 8.3 Зарплата и управление персоналом

Рис. 10 Области макета в 1С 8.3 Зарплата и управление персоналом


7.7 НапечататьДокумент


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


Функция напечатать документ в 1С 8.3 Зарплата и управление персоналом

Рис. 11 Функция напечатать документ в 1С 8.3 Зарплата и управление персоналом


На этом все. Запускаем печать и получаем ожидаемый результат.


Печать макета документа Word

Рис. 12 Печать макета документа Word


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


В интернете можно найти множество авторских методик создания внешней печатной формы в формате документа MS Word, однако, методы на основе БСП являются наиболее надежными.


Специалист компании «Кодерлайн»

Игорь Торба

 

Задать вопрос автору статьи
Тема вопроса*
Ваше имя*
E-mail или телефон*
Ваш вопрос*
 

0
Guest
Пример рабочий, проверил на зуп 3.1.21. Код в картинках выкладывать, это, конечно, очень удобно для копи пасты)
Еще и ссылки нельзя добавлять в комментарии.
Код модуля менеджера
Процедура ПриОпределенииНастроек(Настройки) Экспорт

Настройки.Размещение.Добавить(Метаданные.Справочники.Сотрудники);
Настройки.ДобавитьКомандыПечати = Истина;

КонецПроцедуры

Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт

КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "ТиповойДоговорWord";
КомандаПечати.Представление = Нстр("ru = 'Типовой договор Word'" ;) ;
КомандаПечати.ТребуетсяРасширениеРаботыСФайлами = Истина;
КомандаПечати.МенеджерПечати = "Обработка.ПФ_ОбработкаПечать";
КомандаПечати.Обработчик = "ВыполнитьКомандуПечати";

КонецПроцедуры

Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

ИдентификаторКоманды = "ТиповойДоговорWord";
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, ИдентификаторКоманды); // Оно же имемя идентификатора команды
Если ПечатнаяФорма <> Неопределено Тогда

ИмяМенеджераПечати = "Обработка.ПФ_ОбработкаПечать";

МакетИДанныеОбъекта = УправлениеПечатьюВызовСервера.МакетыИДанныеОбъектовДляПечати(ИмяМенеджераПечати,ИдентификаторКоманды,МассивОбъектов);

ОфисныеДокументы = Новый Соответствие;
Для каждого Ссылка Из МассивОбъектов Цикл

АдресХранилища = НапечататьДокументы(Ссылка,МакетИДанныеОбъекта,ИдентификаторКоманды);
ИмяДокумента = Строка(Ссылка);
ОфисныеДокументы.Вставить(АдресХранилища,ИмяДокумента);

КонецЦикла;  
ПечатнаяФорма.ОФисныеДокументы = ОфисныеДокументы;

КонецЕсли;        

КонецПроцедуры

Функция ПолучитьДанныеПечати(Знач МассивДокументов, Знач МассивИменМакетов) Экспорт        

ДанныеПоВсемОбъектам = Новый Соответствие;
Для каждого ОбъектСсылка Из МассивДокументов Цикл

ДанныеОбъектаПоМакетам = Новый Соответствие;
Для каждого ИдентификаторКоманды Из МассивИменМакетов Цикл

Если ИдентификаторКоманды = "ТиповойДоговорWord" Тогда

ДанныеОбъектаПоМакетам.Вставить(ИдентификаторКоманды,ПолучитьДанныеОбъекта(ОбъектСсылка));

КонецЕсли;

КонецЦикла;
ДанныеПоВсемОбъектам.Вставить(ОбъектСсылка,ДанныеОбъектаПоМакетам);

КонецЦикла;    

ОписаниеОбластей = Новый Соответствие;
ДвоичныеДанныеМакетов  = Новый Соответствие;
ТипыМакетов  = Новый Соответствие;

Для каждого ИдентификаторКоманды Из МассивИменМакетов Цикл
Если ИдентификаторКоманды = "ТиповойДоговорWord" Тогда

ДвоичныеДанныеМакетов.Вставить(ИдентификаторКоманды,УправлениеПечатью.МакетПечатнойФормы("Обработка.ПФ_ОбработкаПечать.ПФ_DOC_Типовой" ;) );
ОписаниеОбластей.Вставить(ИдентификаторКоманды,ОбластиМакетаОфисногоДокумента());

КонецЕсли;


КонецЦикла;

Макеты = Новый Структура;
Макеты.Вставить("ОписаниеОбластей",ОписаниеОбластей);
Макеты.Вставить("ТипыМакетов",ТипыМакетов);
Макеты.Вставить("ДвоичныеДанныеМакетов",ДвоичныеДанныеМакетов);    

Результат = Новый Структура;
Результат.Вставить("Данные", ДанныеПоВсемОбъектам);
Результат.Вставить("Макеты",Макеты);

Возврат Результат;

КонецФункции // ПолучитьДанныеПечати()

Функция ПолучитьДанныеОбъекта(СсылкаНаОбъект)
   
Данные = Новый Структура;  

//Вставляем данные под свой ворд документ
//Пример Данные.Вставить("ФиоСотрудника",СсылкаНаОбъект.Наименование);

Возврат Данные;
КонецФункции // ПолучитьДанныеОбъекта()    

Функция ОбластиМакетаОфисногоДокумента()

Области = Новый Структура;

УправлениеПечатью.ДобавитьОписаниеОбласти(Области, "ВесьДокумент", "Общая" ;) ;

   Возврат Области;
КонецФункции // ()    

Функция НапечататьДокументы(ДокументСсылка, МакетИДанныеОбъекта, ИмяМакета)

ТипМакета = МакетИДанныеОбъекта.Макеты.ТипыМакетов[ИмяМакета];
ДвоичныеДанныеМакетов = МакетИДанныеОбъекта.Макеты.ДвоичныеДанныеМакетов;
Области = МакетИДанныеОбъекта.Макеты.ОписаниеОбластей;
ДанныеОбъекта = МакетИДанныеОбъекта.Данные[ДокументСсылка][ИмяМакета];

Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(ДвоичныеДанныеМакетов[ИмяМакета], ТипМакета, ИмяМакета);
Если Макет = Неопределено Тогда

Возврат "";

КонецЕсли;  

ЗакрытьОкноПечатнойФормы = Ложь;
Попытка

ПечатнаяФорма = УправлениеПечатью.ИнициализироватьПечатнуюФорму(ТипМакета, Макет.НастройкиСтраницыМакета, Макет);      
АдресХранилищаПечатнойФормы = "";
Если ПечатнаяФорма = Неопределено Тогда

УправлениеПечатью.ОчиститьСсылки(Макет);
Возврат "";

КонецЕсли;
Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["ВесьДокумент"] ;) ;
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта);

АдресХранилищаПечатнойФормы = УправлениеПечатью.СформироватьДокумент(ПечатнаяФорма);

Исключение

КонецПопытки;      

Возврат АдресХранилищаПечатнойФормы;

КонецФункции // НапечататьДокументы()

Для Обработки  "ПФ_ОбработкаПечать"
И Макета "ПФ_DOC_Типовой"
Имя Цитировать 0
0
Guest
Забыл добавить, код хоть и в скринах, но рабочий и статья написано максимально подробно, мое почтение)
В коде выше в функции ПолучитьДанныеОбъекта нужно добавить свои параметры для подстановки в ворд.

И код модуля формы для обработки "ПФ_ОбработкаПечать"

&НаКлиенте
Функция ВыполнитьКомандуПечати(КомандаПечати) Экспорт

УправлениеПечатьюКлиент.ВыполнитьКомандуПечати(
КомандаПечати.МенеджерПечати,
КомандаПечати.Идентификатор,
КомандаПечати.ОбъектыПечати,
КомандаПечати.Форма);

Возврат Неопределено;    

КонецФункции // ()
Имя Цитировать 0
0
Администратор
Здравствуйте. Спасибо за Ваш комментарий!
Имя Цитировать 0
0
Nik
Добрый день! Статья отличная, подключил печатные формы, всё работает. Возникла задача с выводом печатной формы в word из внешней обработки, не привязываясь к кадровым документам. Во внешней обработке я нажимаю на добавленную на ней кнопку Печать и далее пытаюсь заполнить макет и вывести его в word, заполнить вроде получается. а вывести нет. Подскажите, пожалуйста, как это можно сделать, может что-то упустил

в этой функции заполняю макет. Использую многие функции из данной статьи

&НаСервере
Функция СформироватьТабДокНаСервере()

ОфисныеДокументы = Новый Соответствие;

Обработка =  РеквизитФормыВЗначение("Объект");
МакетДокумента = Обработка.ПолучитьМакет("ПФ_DOC_Договор_КМО");

Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(МакетДокумента, Неопределено);
ПечатнаяФорма = УправлениеПечатью.ИнициализироватьПечатнуюФорму(Неопределено, Неопределено, Макет);

ИмяМенеджераПечати = "Обработка.ПечатьДоговоровКМО";
ИдентификаторКоманды = "Договор_КМО";

МассивОбъектов = Новый Массив;
СтруктураДанныхКМО = Новый Структура;
СтруктураДанныхКМО.Вставить("Организация", Объект.Организация);
СтруктураДанныхКМО.Вставить("Подразделение", Объект.Подразделение);
СтруктураДанныхКМО.Вставить("РуководительКоллектива", Объект.РуководительКоллектива);
СтруктураДанныхКМО.Вставить("ДатаВступленияВСилу", Объект.ДатаВступленияВСилу);
СтруктураДанныхКМО.Вставить("Сотрудники", Объект.Сотрудники);

МассивОбъектов.Добавить(СтруктураДанныхКМО);
МакетИДанныеОбъекта = УправлениеПечатьюВызовСервера.МакетыИДанныеОбъектовДляПечати(ИмяМенеджераПечати, ИдентификаторКоманды, МассивОбъектов);

ТипМакета = МакетИДанныеОбъекта.Макеты.ТипыМакетов[ИдентификаторКоманды];
ДвоичныеДанныеМакетов = МакетИДанныеОбъекта.Макеты.ДвоичныеДанныеМакетов;
Области = МакетИДанныеОбъекта.Макеты.ОписаниеОбластей;
ДанныеОбъекта = МакетИДанныеОбъекта.Данные[МассивОбъектов[0]][ИдентификаторКоманды];

Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИдентификаторКоманды]["ВесьДокумент"]);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, );
     
АдресХранилищаПечатнойФормы = УправлениеПечатью.СформироватьДокумент(ПечатнаяФорма);
ОфисныеДокументы.Вставить(АдресХранилищаПечатнойФормы, "ДокументWordName " + 1);

Возврат ОфисныеДокументы;    

КонецФункции
Имя Цитировать 0
0
Администратор
Здравствуйте! Обратитесь по телефонам, указанным в верхней части нашего сайта или на этот номер линии поддержки: +7 495 374 55 29.
Имя Цитировать 0
0
Андрей
Круто, это реально работает!!! тут только поправил

Функция ПолучитьДанныеОбъекта(СсылкаНаОбъект)
ДанныеОбъекта = Новый Структура;
ДанныеОбъекта.Вставить("НДог", СсылкаНаОбъект.ФизическоеЛицо);
Возврат ДанныеОбъекта;
КонецФункции
Имя Цитировать 0
0
Guest
Большое спасибо! Статья помогла. И всем комментаторам с кодом и дополнениями спасибо!
Имя Цитировать 0
0
Юлия
Добрый день! Аналогичная проблема, при нажатии на печать в ЗУП просто ничего не выходит. Хотя всё сделано по образцу. В чем может быть проблема. Ошибок не выдаёт
Имя Цитировать 0
0
Guest
Добрый день! Аналогичная проблема, при нажатии на печать в ЗУП просто ничего не выходит. Хотя всё сделано по образцу. В чем может быть проблема. Ошибок не выдаёт
Имя Цитировать 0
0
Guest
Спасибо за подробное объяснение, все получилось. Отличная статья
Имя Цитировать 0
Добавить комментарий
Текст сообщения*
Защита от автоматических сообщений
 
Услуги программиста 1С
Получите специалиста
для решения всех задач
в области 1С
Программы 1С
Цены и подробное описание программ 1С:Предприятие 8.