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

Ниже — порядок действий для актуальных версий БСП (3.x) и отличия для старых редакций, где код форм выглядел иначе.

Как устроена печать в БСП

Подсистема «Печать» разделяет ответственность:

ГдеЧто делается
Переопределяемый модуль УправлениеПечатьюПереопределяемыйСписок объектов, у которых есть команды печати
Модуль менеджера документаОписание команд и формирование табличных документов
Форма документа и форма спискаПодключение механизма, который сам выводит команды
Макет документаТабличный документ с областями печатной формы

Кнопки формы вы не создаёте: их строит подсистема подключаемых команд по описанию из модуля менеджера. Поэтому одна команда автоматически появляется во всех формах, указанных в её настройках.

Команда печати БСП: документ подключается к общему механизму печати
Команда печати БСП: документ подключается к общему механизму печати

Шаг 1. Макет печатной формы

Добавьте документу макет типа «Табличный документ». В БСП принято именовать такие макеты с префиксом ПФ_MXL_, например ПФ_MXL_Акт: по префиксу их находит обработка «Макеты печатных форм», где пользователь может отредактировать макет без конфигуратора.

В макете заведите именованные области: Заголовок, Шапка, Строка, Подвал — и параметры в ячейках, которые будете заполнять из данных.

Шаг 2. Регистрация объекта

В общем модуле УправлениеПечатьюПереопределяемый найдите процедуру ПриОпределенииОбъектовСКомандамиПечати и добавьте документ:

1С
Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт

	// ... типовые объекты ...
	СписокОбъектов.Добавить(Метаданные.Документы.АктВыполненныхРабот);

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

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

Шаг 3. Модуль менеджера: команды и формирование

1С
#Область ПрограммныйИнтерфейс

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

	КомандаПечати = КомандыПечати.Добавить();
	КомандаПечати.Идентификатор = "ПФ_MXL_Акт";
	КомандаПечати.Представление = НСтр("ru = 'Акт выполненных работ'");
	КомандаПечати.Порядок = 10;
	КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;

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

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

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

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

#КонецОбласти

Идентификатор команды совпадает с именем макета: в процедуре Печать по нему проверяется, какую форму запросили. Последний параметр ВывестиТабличныйДокументВКоллекцию — полный путь к макету; по нему в окне печати работает переход к редактированию макета.

Формирование табличного документа

1С
#Область СлужебныеПроцедурыИФункции

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

	ТабличныйДокумент = Новый ТабличныйДокумент;
	ТабличныйДокумент.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_АктВыполненныхРабот_Акт";

	Макет = УправлениеПечатью.МакетПечатнойФормы("Документ.АктВыполненныхРабот.ПФ_MXL_Акт");

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

	Для Каждого ДанныеДокумента Из ДанныеДокументов Цикл

		Если ТабличныйДокумент.ВысотаТаблицы > 0 Тогда
			ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
		КонецЕсли;
		НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;

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

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

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

		УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент,
			НомерСтрокиНачало, ОбъектыПечати, ДанныеДокумента.Ссылка);

	КонецЦикла;

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

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

#КонецОбласти

Что здесь важно:

  • МакетПечатнойФормы вместо ПолучитьМакет — подхватывает изменённый пользователем макет.
  • ЗадатьОбластьПечатиДокумента связывает кусок табличного документа с конкретной ссылкой. Это нужно для отправки по почте и сохранения: каждый документ уходит отдельным файлом.
  • КлючПараметровПечати сохраняет у пользователя настройки страницы (поля, ориентацию) для этой формы.
  • Данные для всех документов выбирайте одним запросом в функции ДанныеДляПечати, а не обращением к реквизитам каждой ссылки в цикле — при печати пачки из сотни документов разница заметна.

Шаг 4. Подключение команд в формах

Актуальные версии БСП (3.x)

В форме документа:

1С
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

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

&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)

	ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект);

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

&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт

	ВыполнитьКомандуНаСервере(ПараметрыВыполнения);

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

&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)

	ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Объект);

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

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()

	ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);

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

В форме списка код тот же, но третьим параметром передаётся Элементы.Список вместо Объект. У динамического списка основной таблицей должен быть ваш документ, иначе подсистема не поймёт, к чему применять команды.

Точный набор служебных процедур формы немного меняется от версии к версии БСП. Самый надёжный способ — открыть форму любого документа типовой конфигурации на той же версии БСП и скопировать процедуры с префиксом Подключаемый_.

Старые редакции БСП (2.x)

В ранних версиях печать подключалась отдельно от других команд: в ПриСозданииНаСервере вызывалась УправлениеПечатью.ПриСозданииНаСервере(ЭтаФорма), а обработчиком была Подключаемый_ВыполнитьКомандуПечати с вызовом УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати(Команда, ЭтаФорма, Объект). Если вы видите такой код в своей конфигурации — пишите в её стиле, смешивать подходы не нужно.

Что ещё умеет команда печати

У строки КомандыПечати есть и другие полезные поля:

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

Несколько печатных форм объединяются в комплект: если в Идентификатор перечислить несколько идентификаторов через запятую, окно печати сформирует их все.

Как проверить и отладить печать

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

  1. Форма документа и форма списка. Команда есть в подменю «Печать» в обеих формах (или только там, где указано в СписокФорм).
  2. Пачка документов. Выделите в списке десяток документов и напечатайте — каждый должен начинаться с новой страницы, а время формирования не должно расти непропорционально.
  3. Непроведённый документ. При ПроверкаПроведенияПередПечатью = Истина подсистема предложит провести документ; убедитесь, что сценарий работает и у пользователя с ограниченными правами.
  4. Отправка по почте и сохранение. В окне печати сохраните пачку в PDF «каждый документ отдельным файлом» — так проверяется ЗадатьОбластьПечатиДокумента.
  5. Пользовательский макет. Измените макет в «Макетах печатных форм» и убедитесь, что печать подхватила изменения.

Отлаживать формирование удобно, поставив точку останова в процедуре Печать модуля менеджера: она выполняется на сервере, так что в конфигураторе должна быть включена серверная отладка. Если точка не срабатывает, проблема раньше — в регистрации объекта или в форме.

Типичные ошибки

  • Команды нет в форме. Объект не добавлен в ПриОпределенииОбъектовСКомандамиПечати или в форме нет вызова ПодключаемыеКоманды.ПриСозданииНаСервере.
  • Команды нет в списке. Основная таблица динамического списка не задана или не ваш документ.
  • Пустое окно печати. Идентификатор в НужноПечататьМакет не совпадает с идентификатором команды.
  • Изменённый макет не применяется. Используется ПолучитьМакет вместо УправлениеПечатью.МакетПечатнойФормы.
  • Печать пачки «висит». Данные читаются по одной ссылке в цикле. Сделайте один запрос по массиву объектов.
  • Правка типового модуля менеджера. В типовых документах добавляйте печать через расширение или внешнюю печатную форму, чтобы не мешать обновлениям.
В БСП печатная форма — это не кнопка, а описание команды. Опишите её правильно в модуле менеджера, и подсистема сама разнесёт её по всем формам.

Разработку печатных форм — от макета по образцу до комплектов документов — я делаю в рамках услуги печатные формы 1С; если печать нужна в типовом решении без снятия с поддержки, использую расширения конфигурации.

Коротко

  • Зарегистрируйте документ в УправлениеПечатьюПереопределяемый.ПриОпределенииОбъектовСКомандамиПечати.
  • В модуле менеджера опишите ДобавитьКомандыПечати и Печать, формируйте документ через МакетПечатнойФормы.
  • В формах подключите механизм подключаемых команд; в списке передавайте Элементы.Список.
  • Используйте ЗадатьОбластьПечатиДокумента и КлючПараметровПечати для корректной отправки и настроек страницы.
  • Для типовых конфигураций — расширение или внешняя печатная форма.