Печатные формы MXL/Word через расширение

Клиенту нужно было реализовать печать нескольких печатных форм для документа расходная накладная и справочника сотрудники через расширение. Потому что у него использовалось множество баз и расширения он устанавливал автоматически через Обновлятор 1С.

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

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

&Вместо("КомандыПечатиФормы")
Функция печкадрд_КомандыПечатиФормы(Форма, СписокОбъектов)

		
	КомандыПечати = ПродолжитьВызов(Форма, СписокОбъектов);

	Если ТипЗнч(Форма) = Тип("ФормаКлиентскогоПриложения") Тогда
		ИмяФормы = Форма.ИмяФормы;
	Иначе
		ИмяФормы = Форма;
	КонецЕсли;
	
	Если 
		ИмяФормы = "Документ.РеализацияТоваровУслуг.Форма.ФормаДокументаТовары" 
		ИЛИ ИмяФормы = "Документ.РеализацияТоваровУслуг.Форма.ФормаСписка"
		Тогда 
		
		КомандаПечати = КомандыПечати.Добавить();
		КомандаПечати.Идентификатор = "АктПриемаПередачиВыполненныхРабот";
		КомандаПечати.Представление = НСтр("ru = 'Акт приема-передачи выполненных работ (Доработка)'");
		КомандаПечати.Обработчик    = "УправлениеПечатьюБПКлиент.ВыполнитьКомандуПечати"; // "печкадрд_С.ВыполнитьКомандуПечати";
		//КомандаПечати.СписокФорм    = "ФормаСписка,ФормаВыбора,ФормаДокументаОбщая,ФормаДокументаТовары";
		КомандаПечати.СписокФорм    = "";
		КомандаПечати.Порядок = 300;  
		КомандаПечати.МенеджерПечати = "ОбщийМодуль.печкадрд_С"; 
		КомандаПечати.ПроверкаПроведенияПередПечатью = ложь;
		
		
	КонецЕсли;
	
	
	Возврат КомандыПечати;
	
КонецФункции

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

Команда печати добавляется и в список документов и в документ:

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

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

Был соблазн использовать свой обработчик печати, но стандартный УправлениеПечатьюБПКлиент.ВыполнитьКомандуПечати делает столько много, что проще использовать свой менеджер печати ОбщийМодуль.печкадрд_С.

Правда, здесь есть один нюанс — 1С не хочет использовать общий модуль как менеджер печати. Я хотел было использовать обработку, но ведь на нее надо назначать права. Увы, в 1С нельзя создавать объекты, доступные для всех. Поэтому сделал все же, чтобы общий модуль мог быть менеджером печати, расширив модуль ОбщегоНазначения:


&Вместо("МенеджерОбъектаПоПолномуИмени")
Функция печкадрд_МенеджерОбъектаПоПолномуИмени(ПолноеИмя)
	
	ЧастиИмени = СтрРазделить(ПолноеИмя, ".");
	
	Если ЧастиИмени.Количество() >= 2 Тогда
		КлассОМ = ЧастиИмени[0];
		ИмяОМ   = ЧастиИмени[1];
	
		Если ВРег(КлассОМ) = "ОБЩИЙМОДУЛЬ" Тогда
			Возврат ОбщегоНазначения.ОбщийМодуль(ИмяОМ); //Добавляем общий модуль как менеджер печати
		КонецЕсли;
	КонецЕсли;

	//В остальных случаях прежнее поведение

	Результат = ПродолжитьВызов(ПолноеИмя);
	Возврат Результат;
КонецФункции

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

Если требуется получить печатную форму в формате табличного документа (MXL), в процедуре печати достаточно разместить код вида:

Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
   ПечатнаяФорма = КоллекцияПечатныхФорм[0];
   ПечатнаяФорма.ТабличныйДокумент = Новый ТабличныйДокумент;
   ПечатнаяФорма.ТабличныйДокумент.Область(1,1).Текст = "Тест печатной формы";	
КонецПроцедуры

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

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

Простейший код по выводу в Word выглядит так:

Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
	//Получаем Word-макет из общего макета
	Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(ПолучитьОбщийМакет("печкадрд_АктГПХ"), Неопределено, Неопределено);
	Документ = УправлениеПечатью.ИнициализироватьПечатнуюФорму(Неопределено,, Макет);

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

	Шаблон = НСтр("ru = 'Заголовок документа  (№[Номер] получено [Дата])'");
	ИмяДокумента = СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку(Шаблон, Новый Структура("Номер, Дата", Ссылка.Номер, Ссылка.Дата));

	
	ПечатнаяФорма = КоллекцияПечатныхФорм[0];
	ПечатнаяФорма.ОфисныеДокументы = Новый Соответствие();
	ПечатнаяФорма.ОфисныеДокументы.Вставить(АдресХранилищаПечатнойФормы, ИмяДокумента); 
КонецПроцедуры 

При этом использую макет:

В результате работы открывается новый документ Word, выглядит так:

Обратите внимание, в заголовок документа Word выводится значение из ИмяДокумента.

Если требуется использовать несколько видом печатных форм, вид формы можно определить в поле ИмяВРЕГ коллекции печатных форм:

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

Среда: БП 3.0.147.25 Версия БСП: 3.1.9.209 Платформа: 8.3.22.2239
Режим совместимости расширения: 8.3.16

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *