Внешняя печатная форма управляемое приложение word

Содержание:

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, однако, методы на основе БСП являются наиболее надежными.

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

Игорь Торба

Демонстрация процесса формирования внешней печатной формы документа из макета Word средствами БСП, колонтитулы, коллекции, и обычные параметры

Функция СведенияОВнешнейОбработке() Экспорт
	
	// Стандартное описание сведений о внешней печатной форме

	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
	
	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
	
	ПараметрыРегистрации.БезопасныйРежим = Ложь;
	ПараметрыРегистрации.Вставить("Версия", "1.0");
	ПараметрыРегистрации.Наименование = "Название печатной формы";
	
	ПараметрыРегистрации.Назначение.Добавить("Справочник.ФизическиеЛица");
	
	НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
	НоваяКоманда.Представление = "Название команды";   //Синоним
	НоваяКоманда.Идентификатор = "НазваниеКоманды";   //ПолноеИмя
	НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
		
	Возврат ПараметрыРегистрации;
	
КонецФункции

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

	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "НазваниеКоманды") Тогда
		ПечатьДокумента(КоллекцияПечатныхФорм, МассивОбъектов, ОбъектыПечати);
	КонецЕсли;
	
КонецПроцедуры

Процедура ПечатьДокумента(КоллекцияПечатныхФорм, МассивОбъектов, ОбъектыПечати) Экспорт
	
	 // Сначала получим данные а потом передадим их для заполнения макета
		
	МассивДанныхЗаполнения = ПолучитьДанныеДляПечатиДокумента(МассивОбъектов);	
		
	ВывестиДанныеДокументаВТабличныйДокумент(КоллекцияПечатныхФорм, МассивДанныхЗаполнения, ОбъектыПечати);
		
КонецПроцедуры 

Функция ПолучитьДанныеДляПечатиДокумента(МассивОбъектов)

	// здесь происходит заполнение данными для ПФ

	Данные = Новый Структура;
	Данные.Вставить("Организация", "ООО ""Рога и копыта""");
	Данные.Вставить("Контрагент", "ИП Иванов");
	Данные.Вставить("СуммаОплаты", 10523);    
	Данные.Вставить("Дата", '202110102158');  
	
	ТаблицаДанных = Новый ТаблицаЗначений;
	ТаблицаДанных.Колонки.Добавить("Номенклатура");
	ТаблицаДанных.Колонки.Добавить("Количество");
	ТаблицаДанных.Колонки.Добавить("Сумма");

	Строка = ТаблицаДанных.Добавить();
	Строка.Номенклатура = "тест";
	Строка.Количество = 2;
	Строка.Сумма = 50;
	
	Строка = ТаблицаДанных.Добавить();
	Строка.Номенклатура = "тест1";
	Строка.Количество = 3;
	Строка.Сумма = 55;
	
	Строка = ТаблицаДанных.Добавить();
	Строка.Номенклатура = "тест2";
	Строка.Количество = 4;
	Строка.Сумма = 51; 
	
	ТаблицаДанныхВМассиве = ОбщегоНазначения.ТаблицаЗначенийВМассив(ТаблицаДанных);
	
	Данные.Вставить("ТаблицаДанных", ТаблицаДанныхВМассиве);
	
	Возврат Данные;
	
КонецФункции 

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

	ДвоичныеДанныеМакета = ПолучитьМакет("ПФ_DOC_НазваниеМакета");
	
	Если ДвоичныеДанныеМакета <> Неопределено Тогда
		
		// Инициализируем печатную форму	
		
		ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "НазваниеКоманды");
		
		// Наличие пустого табличного документа в коллекции обязательно
		
		ПечатнаяФорма.ТабличныйДокумент = Новый ТабличныйДокумент;
		
		Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(ДвоичныеДанныеМакета,Неопределено);
		ПечатнаяФормаДокумента = УправлениеПечатью.ИнициализироватьПечатнуюФорму(Неопределено, Макет.НастройкиСтраницыМакета, Макет);		
		
		// Определим какие области в документе Word хотим заполнить 
		// Для этого у нас документ должен быть размечен конструкциями 
		// {v8 Область.НазваниеОбласти} 
		// {/v8 Область.НазваниеОбласти}
		// наличие областей обязательно
		
		// Область для заполнения обычных параметров в тексте
		
		ОбластьЗаголовок = Новый Структура;
		ОбластьЗаголовок.Вставить("ИмяОбласти", "Заголовок");
		ОбластьЗаголовок.Вставить("ТипОбласти", "Общая");
		
		// Пример определения областей коллекций (таблица и нумерованный или обычный списки)	
		ОбластьШапкаТаблицы = Новый Структура;
		ОбластьШапкаТаблицы.Вставить("ИмяОбласти", "ШапкаТаблицы");
		ОбластьШапкаТаблицы.Вставить("ТипОбласти", "Общая");
		
		ОбластьСтрокаТаблицы = Новый Структура;
		ОбластьСтрокаТаблицы.Вставить("ИмяОбласти", "СтрокаТаблицы");
		ОбластьСтрокаТаблицы.Вставить("ТипОбласти", "СтрокаТаблицы");
		
		// Область должна быть определена первым элементом списка 
		// {v8 Область.НумерованныйСписок}
		// 1.{v8 Номенклатура}
		// {/v8 Область.НумерованныйСписок}
		
		ОбластьНумерованныйСписка = Новый Структура;
		ОбластьНумерованныйСписка.Вставить("ИмяОбласти", "НумерованныйСписок");  
		ОбластьНумерованныйСписка.Вставить("ТипОбласти", "Список");
		
		// Область должна быть определена первым элементом списка 
		// {v8 Область.МаркированныйСписок}
		// • {v8 Номенклатура}
		// {/v8 Область.МаркированныйСписок}
		
		ОбластьМаркированногоСписка = Новый Структура;
		ОбластьМаркированногоСписка.Вставить("ИмяОбласти", "МаркированныйСписок");
		ОбластьМаркированногоСписка.Вставить("ТипОбласти", "Список"); 
		
		// Пример определения областей колонтитулов, эти области в документе есть по умолчанию, 
		// если колонтитулы определены в самом документе
		
		ОбластьВерхнийКолонтитул = Новый Структура;
		ОбластьВерхнийКолонтитул.Вставить("ИмяОбласти", "ВерхнийКолонтитул");
		ОбластьВерхнийКолонтитул.Вставить("ТипОбласти", "ВерхнийКолонтитул");
		
		ОбластьНижнийКолонтитул = Новый Структура;
		ОбластьНижнийКолонтитул.Вставить("ИмяОбласти", "НижнийКолонтитул");
		ОбластьНижнийКолонтитул.Вставить("ТипОбласти", "НижнийКолонтитул");
		
		// Передаем данные заполнения для заполнения печатной формы 
		// Имена параметров данных заполнения должны совпадать с размеченными параметрами в документе в виде  
		// {v8 НазваниеПараметра}
		
		Область = УправлениеПечатью.ОбластьМакета(Макет, ОбластьЗаголовок);
		УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФормаДокумента, Область, МассивДанныхЗаполнения, Ложь); 
		
		
		Область = УправлениеПечатью.ОбластьМакета(Макет, ОбластьВерхнийКолонтитул);  
		УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФормаДокумента, Область, МассивДанныхЗаполнения);
		
		Область = УправлениеПечатью.ОбластьМакета(Макет, ОбластьНижнийКолонтитул);
		УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФормаДокумента, Область, МассивДанныхЗаполнения); 
		
		Область = УправлениеПечатью.ОбластьМакета(Макет, ОбластьШапкаТаблицы);
		УправлениеПечатью.ПрисоединитьОбласть(ПечатнаяФормаДокумента, Область, Ложь);
		
		Область = УправлениеПечатью.ОбластьМакета(Макет, ОбластьСтрокаТаблицы);
		УправлениеПечатью.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФормаДокумента, Область, МассивДанныхЗаполнения.ТаблицаДанных); 
		
		Область = УправлениеПечатью.ОбластьМакета(Макет, ОбластьНумерованныйСписка);
		УправлениеПечатью.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФормаДокумента, Область, МассивДанныхЗаполнения.ТаблицаДанных);
		
		Область = УправлениеПечатью.ОбластьМакета(Макет, ОбластьМаркированногоСписка);
		УправлениеПечатью.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФормаДокумента, Область, МассивДанныхЗаполнения.ТаблицаДанных);
		
		// Поместим получившийся документ в коллекцию печатных форм, в раздел ОфисныеДокументы
		// так БСП поймет что нужно открывать Word при формировании печатной формы
		
		АдресХранилищаОфисныйДокумент = УправлениеПечатью.СформироватьДокумент(ПечатнаяФормаДокумента);
		УправлениеПечатью.ОчиститьСсылки(ПечатнаяФормаДокумента, Ложь);
		УправлениеПечатью.ОчиститьСсылки(Макет);
		
		ОфисныеДокументы = Новый Соответствие;
		
		ОфисныеДокументы.Вставить(АдресХранилищаОфисныйДокумент, НСтр("ru = 'Название документа'"));
		
		ПечатнаяФорма.СинонимМакета    = НСтр("ru = 'Название документа (документ Microsoft Word)'");
		ПечатнаяФорма.ОфисныеДокументы = ОфисныеДокументы;
		
	КонецЕсли;
	
КонецПроцедуры

Комментарии

Рассмотрим написание простейшей внешней печатной формы в 1С 8.3 для управляемого приложения на примере конфигураций Бухгалтерия 3.0 и Управление торговлей 11 (данная печатная форма будет работать в обоих этих конфигурациях).

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

Создание внешней обработки

В конфигураторе 1C Предприятия 8 создаем внешнюю обработку (Файл->Новый->Внешняя обработка), задаем имя, добавляем реквизит Документ с типом ДокументСсылка.РеализацияТоваровУслуг, он не является обязательным для работы печатной формы, но пригодится нам для ее регистрации в базе.

создание пустой обработки в 1С 8.3

Создание макета печатной формы

Добавляем новый макет, тип макета оставляем Табличный документ. На макете создаем три области: Шапка, Данные и Подвал. Сделать это можно выделив нужное количество строк и нажав меню Таблица->Имена->Назначить имя (Ctrl+Shift+N).

Наша команда предоставляет услуги по консультированию, настройке и внедрению 1С.

Связаться с нами можно по телефону +7 499 350 29 00.

Услуги и цены можно увидеть по ссылке.

Будем рады помочь Вам!

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

В области Данные создадим параметры для вывода строк табличной части(Номенклатура, цена и т.д.), а в области Подвал для итогов по количеству и сумме.

создание параметра на макете

Программирование

Зайдем в модуль объекта печатной формы Действия->Открыть модуль объекта.

создание реквизита

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

Рассмотрим содержание функции СведенияОВнешнейОбработке(). Для начала создадим ее в модуле:

Функция СведенияОВнешнейОбработке() Экспорт

КонецФункции

Создадим структуру ПараметрыРегистрации в которой и будут храниться все данные необходимые для регистрации.

ПараметрыРегистрации = Новый Структура;

Создадим массив МассивНазначений в котором будут храниться наименования документов и справочников из которых будет производиться печать.

МассивНазначений = Новый Массив;

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

Функция УказатьНаименованиеВнешнейПечатнойФормы()

    Наименование = ЭтотОбъект.Метаданные().Представление();
    Возврат Наименование;

КонецФункции

А теперь заполним переменную.

Наименование = УказатьНаименованиеВнешнейПечатнойФормы();

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

Функция ПолучитьМетаданныеДокументаПечати()

    ПолноеИмя = Документ.Метаданные().ПолноеИмя();
    Возврат ПолноеИмя;

КонецФункции

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

МассивНазначений.Добавить(ПолучитьМетаданныеДокументаПечати());

Конечно этот метод не является правильным для случая, когда у вас несколько назначений, но для одного вполне годится.

Приступим к заполнению структуры ПараметрыРегистрации.

Вид внешней обработки, может быть: ЗаполнениеОбъекта, ДополнительныйОтчет, СозданиеСвязанныхОбъектов, ПечатнаяФорма и т.д.

ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");

Назначение заполним уже полученным массивом:

ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);

Наименование из уже заполненной переменной:

ПараметрыРегистрации.Вставить("Наименование", Наименование);

Номер версии можно поставить любой по желанию:

ПараметрыРегистрации.Вставить("Версия", "1.1");

Безопасный режим не даст печатной форме вносить изменения в базу данных. Но она у нас вполне безобидна =), поэтому ставим значение Ложь.

ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);

В поле Информация вносим описание печатной формы для пользователя. Запишем туда Наименование.

ПараметрыРегистрации.Вставить("Информация", Наименование);

Приступим к созданию команды, которая необходима для вывода на печать нашей печатной формы. Опишем колонки ТаблицыКоманд, вынеся это в отдельную функцию.

Функция ПолучитьТаблицуКоманд()

    Команды = Новый ТаблицаЗначений;
    //как будет выглядеть описание печ.формы для пользователя
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    //имя макета печ.формы
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    //ВызовСерверногоМетода
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));

    Возврат Команды;
КонецФункции

Вызовем сознанную функцию.

ТаблицаКоманд = ПолучитьТаблицуКоманд();

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

Функция ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")

    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда. Представление = Представление;
    НоваяКоманда. Идентификатор= Идентификатор;
    НоваяКоманда. Использование= Использование;
    НоваяКоманда. ПоказыватьОповещение= ПоказыватьОповещение;
    НоваяКоманда. Модификатор= Модификатор;

КонецФункции

Параметры функции ДобавитьКоманду:

  • ТаблицаКоманд — созданная в предыдущей функции Таблица значений с типовым набором полей;
  • Представление — передадим в параметр Наименование печатной формы;
  • Идентификатор — передадим в параметр полное наименование внешней обработки. Вынесем процесс получения в отдельную функцию:
    Функция УказатьНаименованиеКомандыПечати()
        Наименование = ЭтотОбъект.Метаданные().ПолноеИмя();
        Возврат Наименование;
    КонецФункции
    
  • Использование * — здесь возможны два значения:
    • ВызовСерверногоМетода — если обязательная функция Печать() будет находиться в модуле объекта печатной формы и выполняться на стороне сервера(в нашем примере будем использовать именно это значение);
    • ВызовКлиентскогоМетода — если обязательная функция Печать() будет находиться в модуле основной формы внешней обработки и выполняться на стороне клиента;
  • ПоказыватьОповещение — параметр отвечает за вывод оповещения о печати;
  • Модификатор — для печатных форм используется значение ПечатьMXL.

Вызов функции выглядит так:

ДобавитьКоманду(ТаблицаКоманд, Наименование, УказатьНаименованиеКомандыПечати(), "ВызовСерверногоМетода", Истина, "ПечатьMXL");

Осталось передать заполненную таблицу команд в ПараметрыРегистрации:

ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);

И возвратить их из функции:

Возврат ПараметрыРегистрации;

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

Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = Новый Структура;
    МассивНазначений = Новый Массив;

    Наименование = УказатьНаименованиеВнешнейПечатнойФормы();

    МассивНазначений.Добавить(ПолучитьМетаданныеДокументаПечати());
    //может быть - ЗаполнениеОбъекта, ДополнительныйОтчет, СозданиеСвязанныхОбъектов...
    ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    //имя под которым обработка будет зарегестрирована в справочнике внешних обработок
    ПараметрыРегистрации.Вставить("Наименование", Наименование);
    ПараметрыРегистрации.Вставить("Версия", "1.1");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
    //так будет выглядеть описание печ.формы для пользователя
    ПараметрыРегистрации.Вставить("Информация", Наименование);

    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    ДобавитьКоманду(ТаблицаКоманд, Наименование, УказатьНаименованиеКомандыПечати(), "ВызовСерверногоМетода", Истина, "ПечатьMXL");

    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);

    Возврат ПараметрыРегистрации;

КонецФункции

Функция ПолучитьТаблицуКоманд()

    Команды = Новый ТаблицаЗначений;
    //как будет выглядеть описание печ.формы для пользователя
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    //имя макета печ.формы
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    //ВызовСерверногоМетода
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));

    Возврат Команды;
КонецФункции

Функция УказатьНаименованиеВнешнейПечатнойФормы()

    Наименование = ЭтотОбъект.Метаданные().Представление();
    Возврат Наименование;

КонецФункции

Функция УказатьНаименованиеКомандыПечати()

    Наименование = ЭтотОбъект.Метаданные().ПолноеИмя();
    Возврат Наименование;

КонецФункции

Функция ПолучитьМетаданныеДокументаПечати()

    ПолноеИмя = Документ.Метаданные().ПолноеИмя();
    Возврат ПолноеИмя;

КонецФункции

Функция ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")

    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда. Представление = Представление;
    НоваяКоманда. Идентификатор= Идентификатор;
    НоваяКоманда. Использование= Использование;
    НоваяКоманда. ПоказыватьОповещение= ПоказыватьОповещение;
    НоваяКоманда. Модификатор= Модификатор;

КонецФункции

Приступим к написанию кода, который будет формировать нашу печатную форму. Так как при создании команды печати мы использовали параметр ВызовСерверногоМетода, то в модуле объекта создаем обязательную серверную процедуру Печать(если использовать ВызовКлиентскогоМетода, то процедура Печать должна быть клиентской и располагаться в модуле основной формы обработки).

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

КонецПроцедуры
  • МассивОбъектов — массив содержащий ссылки на печатаемые документы или справочники(аналог СсылкаНаОбъект в обычном приложении);
  • КоллекцияПечатныхФорм — таблица значений содержащая сформированные табличные документы;
  • ОбъектыПечати — строковой параметр, в котором передаются имена макетов печатных форм перечисленные через запятую;
  • ПараметрыВывода – параметры вывода табличных документов на печать.

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

Функция ПечатьФормы(МассивОбъектов)

КонецФункции

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

ТабДок = новый ТабличныйДокумент;

Макет = ПолучитьМакет("Макет");

ОбластьШапки   = Макет.ПолучитьОбласть("Шапка");
ОбластьДанные  = Макет.ПолучитьОбласть("Данные");
ОбластьПодвал  = Макет.ПолучитьОбласть("Подвал");

Для того чтобы получить строки табличной части Товары всех печатаемых документов используем запрос.

Запрос = новый запрос;
Запрос.УстановитьПараметр("МассивОбъектов",МассивОбъектов);
Запрос.Текст = "ВЫБРАТЬ
|   РеализацияТоваровУслугТовары.Номенклатура,
|   РеализацияТоваровУслугТовары.Сумма,
|   РеализацияТоваровУслугТовары.Цена,
|   РеализацияТоваровУслугТовары.Количество,
|   РеализацияТоваровУслугТовары.Ссылка
|ИЗ
|   Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|ГДЕ
|   РеализацияТоваровУслугТовары.Ссылка В(&МассивОбъектов)";

В параметр запроса передаем МассивОбъектов, что бы указать в условии ГДЕ, что нам нужны данные только тех документов из которых выводим печатную форму. Чтобы получить выборку запроса, сначала выполняем его, а затем выгружаем.

ОбщаяВыборка = Запрос.Выполнить().Выгрузить();

Теперь при помощи цикла обойдем все ссылки из массива объектов и в одном табличном документесформируем печатные формы для всех выбранных документов.

Для Каждого СсылкаНаОбъект из МассивОбъектов Цикл

КонецЦикла;

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

Заполним параметры шапки и выведем ее в табличный документ.

ОбластьШапки.Параметры.ТекстЗаголовка = "Печатная форма "+СсылкаНаОбъект.Номер;
ОбластьШапки.Параметры.Организация = СсылкаНаОбъект.Организация;

ТабДок.Вывести(ОбластьШапки);

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

Отбор = Новый Структура;
Отбор.Вставить("Ссылка",СсылкаНаОбъект);

Теперь отберем нужные строки используя метод НайтиСтроки(<Структура отбора>) и получим выборку по документу.

Выборка = ОбщаяВыборка.НайтиСтроки(Отбор);

Далее в цикле заполняем параметры области Данные для каждой строки выборки документа и выводим их в табличный документ. Также в цикле считаем итоговые значения количества и суммы. Заполнять каждый параметр в отдельности мы не будем, а используем процедуру ЗаполнитьЗначенияСвойств((<Приемник>, <Источник>) из глобального контекста, она копирует значения свойств <Источника> в свойства <Приемника>. Сопоставление производится по именам свойств. Подробнее об этом можно прочитать в синтаксис-помощнике 1С Предприятия 8.

ИтогоСумма      = 0;
ИтогоКоличество = 0;

Для Каждого Стр из Выборка Цикл
    ЗаполнитьЗначенияСвойств(ОбластьДанные.Параметры,Стр);

    ИтогоСумма = ИтогоСумма + Стр.Сумма;
    ИтогоКоличество = ИтогоКоличество + Стр.Количество;

    ТабДок.Вывести(ОбластьДанные);
КонецЦикла;

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

ОбластьПодвал.Параметры.ИтогоКоличество = ИтогоКоличество;
ОбластьПодвал.Параметры.ИтогоСумма      = ИтогоСумма;

ТабДок.Вывести(ОбластьПодвал);

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

ТабДок.ВывестиГоризонтальныйРазделительСтраниц();

Возвращаем заполненный табличный документ из функции ПечатьФормы.

Возврат ТабДок;

Код функции ПечатьФормы целиком:

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

    Макет = ПолучитьМакет("Макет");

    ОбластьШапки   = Макет.ПолучитьОбласть("Шапка");
    ОбластьДанные  = Макет.ПолучитьОбласть("Данные");
    ОбластьПодвал  = Макет.ПолучитьОбласть("Подвал");

    Запрос = новый запрос;
    Запрос.УстановитьПараметр("МассивОбъектов",МассивОбъектов);
    Запрос.Текст = "ВЫБРАТЬ
    |   РеализацияТоваровУслугТовары.Номенклатура,
    |   РеализацияТоваровУслугТовары.Сумма,
    |   РеализацияТоваровУслугТовары.Цена,
    |   РеализацияТоваровУслугТовары.Количество,
    |   РеализацияТоваровУслугТовары.Ссылка
    |ИЗ
    |   Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
    |ГДЕ
    |   РеализацияТоваровУслугТовары.Ссылка В(&МассивОбъектов)";

    ОбщаяВыборка = Запрос.Выполнить().Выгрузить();

    Для Каждого СсылкаНаОбъект из МассивОбъектов Цикл

        ОбластьШапки.Параметры.ТекстЗаголовка = "Печатная форма "+СсылкаНаОбъект.Номер;
        ОбластьШапки.Параметры.Организация = СсылкаНаОбъект.Организация;

        ТабДок.Вывести(ОбластьШапки);

        Отбор = Новый Структура;
        Отбор.Вставить("Ссылка",СсылкаНаОбъект);

        Выборка = ОбщаяВыборка.НайтиСтроки(Отбор);

        ИтогоСумма      = 0;
        ИтогоКоличество = 0;

        Для Каждого Стр из Выборка Цикл
            ЗаполнитьЗначенияСвойств(ОбластьДанные.Параметры,Стр);

            ИтогоСумма = ИтогоСумма + Стр.Сумма;
            ИтогоКоличество = ИтогоКоличество + Стр.Количество;

            ТабДок.Вывести(ОбластьДанные);
        КонецЦикла;

        ОбластьПодвал.Параметры.ИтогоКоличество = ИтогоКоличество;
        ОбластьПодвал.Параметры.ИтогоСумма      = ИтогоСумма;

        ТабДок.Вывести(ОбластьПодвал);

        ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
    КонецЦикла;

    возврат ТабДок;
КонецФункции

Теперь осталось добавить сформированный табличный документ Коллекцию печатных форм. Для добавления табличного документа в коллекцию можно воспользоваться типовой процедурой ВывестиТабличныйДокументВКоллекцию из модуля УправлениеПечатью(процедура есть и в Бухгалтерии 3.0и в Управление торговлей 11). В параметры этой процедуры необходимо передать:

  • КоллекцияПечатныхФорм — таблица значений содержащая сформированные табличные документы;;
  • ИмяМакета — наименование команды печати;
  • СинонимМакета — наименование печатной формы;
  • ТабличныйДокумент — заполненный табличный документ.

Для параметров ИмяМакета и СинонимМакета используем уже созданные нами процедуры, которые использовались для заполнения сведений о внешней обработки. Таким образом процедура Печать будет выглядеть следующим образом:

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

    УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
        КоллекцияПечатныхФорм,
        УказатьНаименованиеКомандыПечати(),
        УказатьНаименованиеВнешнейПечатнойФормы(),
        ПечатьФормы(МассивОбъектов));

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

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

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

Продолжение следует…

Смотрите видео по созданию внешней печатной формы для управляемого приложения:

0

14.01.201616:1414.01.2016 16:14:14

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

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

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

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

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

2016_02_13-15_05_50-upravlenie-torgovley-_-redaktsiya-10.3-fedorov-boris-mikhaylovich.png

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

2016_02_09-11_25_23-upravlenie-torgovley-_-redaktsiya-10.3-fedorov-boris-mikhaylovich.png

2016_02_13-18_57_06-upravlenie-torgovley-_-redaktsiya-10.3-fedorov-boris-mikhaylovich.png

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

2016_02_08-11_20_37-dokument1-_-word.png

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

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

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

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

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

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

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

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

2016_02_05-10_36_01-dogovor_test-_-word.png

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

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

2016_02_13-18_52_40-konfigurator-_-upravlenie-torgovley_-redaktsiya-10.3.png

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

2016_02_09-11_12_09-konfigurator-_-upravlenie-torgovley_-redaktsiya-10.3.png

2016_02_09-11_12_46-konfigurator-_-upravlenie-torgovley_-redaktsiya-10.3.png

2016_02_09-11_13_44-konfigurator-_-upravlenie-torgovley_-redaktsiya-10.3.png

Параметры авторегистрации

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

2016_02_05-12_44_42-tsrv2-obmen-kobzar-klienty-orus-pf_testdogovor-dogovor_test.epf-parametry_avtoregistratsii-_-konfigu.png

14.01.201616:1414.01.2016 16:14:14

Понравилась статья? Поделить с друзьями:
  • Внедрение таблицы excel в word
  • Внешняя печатная форма в формате word
  • Внедрение таблиц excel в word
  • Внешняя печатная форма word скачать
  • Внедрение связывание объектов word