Получить консультацию

Как создать и подключить внешнюю печатную форму в 1С?

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

СведенияОВнешнейОбработке

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

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

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

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

Этот подход тоже будет рабочим, но имеет существенный недостаток. При изменении версии БСП может поменяться внутренняя начинка подсистемы, в частности подсистемы печати. И в какой-то момент код внешней печ. формы может “сломаться”.

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

  • Для получения структуры с описанием внешней обработки и таблицей команд достаточно вызвать метод ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке.
  • Вместо ПараметрыРегистрации.Вид = “ПечатнаяФорма” следует писать ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма()
  • Вместо Команда.Использование = “ВызовСерверногоМетода” следует писать Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода()

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

Экспортная процедура "Печать"

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

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

Обратите внимание, мы не вызываем метода Показать у табличного документа, мы даже не вызываем метод “ВывестиТабличныйДокументВКоллекцию”, как можно встретить в некоторыхпримерах. Все что нам нужно – получить описание печатной формы по идентификатору, и если данная печатная форма есть в коллекции – создать для нее табличный документ.

Функции формирования табличных документов

Рассмотрим на примере получения табличного документа коммерческого предложения.
Стандартный подход при печати – предусмотреть, что печататься могут несколько объектов одновременно – например, несколько документов в списке выделили с зажатым CTRL и отправили на печать.
При этом есть несколько моментов. Первое – каждый документ выводится с нового листа. И второе – для каждого документа задается область печати. Область печати нужна для того, чтобы при сохранении печатных форм в файл или при отправке по электронной почте они разделились на отдельные нужные файлы.

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

Еще один нюанс – как правило данные для печати получаются отдельной функцией, и могут быть представлены чаще всего в виде таблицы, выборки или структуры. Достаточно стандартный подход, когда данные получаются в виде выборки, а исходный запрос выглядит например так:

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

Чаще всего логика вывода областей в табличный документ также выносится в отдельный метод, чтобы при необходимости доработок изменения вносились в небольшие изолированные методы, а не в один большой кусок кода. Так, в нашем примере вывод областей вынесен в процедуру “ВывестиКоммерческоеПредложение”. В целях упрощения рассмотрим самый простой вариант печати с одной областью.

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

Как подключить внешнюю печатную форму в 1С?

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

На закладке Команды печати будут размещены те команды, что мы описали в методе СведенияОВнешнейОбработке в таблице команд, Размещение будет браться из массива Назначение, а на закладке Дополнительная информация будут представлены данные из свойств Вид, Версия и Информация.

Оставьте комментарий

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

восемь − три =

К НАЧАЛУ