Добавление своих печатных форм в 1с

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

1. Первый способ не требует разработки на внутреннем языке.

Но изменить получится только часть уже существующей печатной формы. Необходимо зайти в макеты печатных форм и заменить стандартный макет своим (или поменять прямо там). На примере 1С УТ11: Меню "НСИ и Администрирование" - "Печатные формы, отчеты и обработки" - "Макеты печатных форм"

В меню выбрать нужный макет, кликнуть, выбрать "Для просмотра и редактирования".

Отредактировать макет и сохранить. Допишем что-нибудь в макет:

Пробуем печатать:

 

2. Второй способ, для продвинутых - создать собственную внешнюю печатную форму.

Для включения перейти Меню "НСИ и Администрирование" - "Печатные формы, отчеты и обработки" - Включить флаг "Дополнительные отчеты и обработки" - Перейти в "Дополнительные отчеты и обработки".

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

Печатную форму надо разрабатывать как внешнюю обработку. Создаем через конфигуратор новую обработку, добавляем макет в нее же.

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

Код модуля объекта

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

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

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

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

Функция ТабличныйДокументПоМоемуМакету(Макет, МассивОбъектов, ОбъектыПечати)
	
	ДокументРезультат = Новый ТабличныйДокумент;
	ДокументРезультат.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
	ДокументРезультат.АвтоМасштаб = Истина;
	
	НомерСтрокиНачало = ДокументРезультат.ВысотаТаблицы + 1;
	
	ДокументРезультат.КлючПараметровПечати = "ПараметрыПечати_Документ_МойМакет";
	
	//формирование таблицы
	ДанныеДляПечати = ДанныеДляПечатиПоДокументам(МассивОбъектов);	
	ВывестиДанныеВТабличныйДокумент(Макет, ДокументРезультат, ДанныеДляПечати, ОбъектыПечати);
	
	Возврат ДокументРезультат;
	
КонецФункции

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

Функция НадоПечататьДокумент(Ссылка)
	
	//проверяем что-нибудь, если не надо возвращаем ложь
	
	Возврат Истина;
КонецФункции

Процедура ВывестиДанныеВТабличныйДокумент(Макет, ДокументРезультат, ДанныеДляПечати, ОбъектыПечати)
	
	ВыборкаДокументы = ДанныеДляПечати.ВыборкаДокументы;
	//......................
	
	ПервыйДокумент = Истина;
	
	Пока ВыборкаДокументы.Следующий() Цикл
		
		Если Не НадоПечататьДокумент(ВыборкаДокументы.Ссылка) Тогда
			ТекстСообщения = НСтр("ru = '%1: документ не требует печати.'");
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, ВыборкаДокументы.Ссылка));
			Продолжить;
		КонецЕсли;
		
		Если Не ПервыйДокумент Тогда
			// Все документы нужно выводить на разных страницах.
			ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц();
		КонецЕсли;
		
		ПервыйДокумент = Ложь;
		
		// Запомним номер строки, с которой начали выводить текущий документ.
		НомерСтрокиНачало 		= ДокументРезультат.ВысотаТаблицы + 1;

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

	КонецЦикла;	
	
КонецПроцедуры

//========================================

 

3. Третий способ, с изменением конфигурации.

Рассматриваем конфигурацию УТ11. В конфигурации придется включить возможность изменения. Для того чтобы печатная форма отобразилась надо в вашем разработанном документе (или в типовом документе конфигурации) поместить/допилить процедуры а) регистрации печатной формы б) формирования печатной формы. Где менять: модуль менеджера объекта, модуль формы, общий модуль. Рассмотрим на примере добавления печатной формы в новый документ.

В модуль менеджера объекта добавляем код

// Заполняет список команд печати.
//
// Параметры:
//   КомандыПечати - ТаблицаЗначений - состав полей см. в функции УправлениеПечатью.СоздатьКоллекциюКомандПечати.
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт

	// Поступление товаров
	КомандаПечати = КомандыПечати.Добавить();
	КомандаПечати.Идентификатор = "ОтчетЭкспедитора";
	КомандаПечати.Представление = НСтр("ru = 'Отчет экспедитора'");
	КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
КонецПроцедуры

// Сформировать печатные формы объектов
//
// ВХОДЯЩИЕ:
//   ИменаМакетов    - Строка    - Имена макетов, перечисленные через запятую
//   МассивОбъектов  - Массив    - Массив ссылок на объекты которые нужно распечатать
//   ПараметрыПечати - Структура - Структура дополнительных параметров печати.
//
// ИСХОДЯЩИЕ:
//   КоллекцияПечатныхФорм - Таблица значений - Сформированные табличные документы
//   ПараметрыВывода       - Структура        - Параметры сформированных табличных документов.
//
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
	
	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ОтчетЭкспедитора") Тогда
		УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "ОтчетЭкспедитора", НСтр("ru='Отчет экспедитора'"), СформироватьПечатнуюФормуОтчетЭкспедитора(МассивОбъектов, ОбъектыПечати));
	КонецЕсли;
	
	ФормированиеПечатныхФорм.ЗаполнитьПараметрыОтправки(ПараметрыВывода.ПараметрыОтправки, МассивОбъектов, КоллекцияПечатныхФорм);
КонецПроцедуры

Функция СформироватьПечатнуюФормуОтчетЭкспедитора(МассивОбъектов, ОбъектыПечати)
	УстановитьПривилегированныйРежим(Истина);
	
	ТабличныйДокумент = Новый ТабличныйДокумент;
	ТабличныйДокумент.АвтоМасштаб = Истина;
	ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_кэОтчетЭкспедитора_ОтчетЭкспедитора";	

// тут много кода заполнения таблич.документа

	Если ПривилегированныйРежим() Тогда
		УстановитьПривилегированныйРежим(Ложь);
	КонецЕсли;

	Возврат ТабличныйДокумент;
	
КонецФункции

В модуль формы обязательно добавляем код

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
КонецПроцедуры

// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
	ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);
КонецПроцедуры

В общий модуль "УправлениеПечатьюУТСервер", в существующую процедуру, добавляем код

Процедура ОпределитьОбъектыСКомандамиПечати(СписокОбъектов) Экспорт
	
	СписокОбъектов.Добавить(Документы.МойДокумент);
.................

Готово, можно печатать документ. Кнопка на форме появится автоматически благодаря коду "ПодключаемыеКоманды.ПриСозданииНаСервере()", а вызываться команда печати будет благодаря "Подключаемый_ВыполнитьКоманду()" в этом же модуле. Выглядит примерно так:

Добавить комментарий