Команда печати БСП добавляется в свой документ без ручного рисования кнопок: вы регистрируете объект в подсистеме «Печать», описываете команды и формирование табличного документа в модуле менеджера, а в формы подключаете механизм подключаемых команд. После этого в форме документа и в списке появляется подменю «Печать», а печатная форма открывается в универсальном окне печати с сохранением в файл, отправкой по почте и печатью комплектов.
Ниже — порядок действий для актуальных версий БСП (3.x) и отличия для старых редакций, где код форм выглядел иначе.
Как устроена печать в БСП
Подсистема «Печать» разделяет ответственность:
| Где | Что делается |
|---|---|
Переопределяемый модуль УправлениеПечатьюПереопределяемый | Список объектов, у которых есть команды печати |
| Модуль менеджера документа | Описание команд и формирование табличных документов |
| Форма документа и форма списка | Подключение механизма, который сам выводит команды |
| Макет документа | Табличный документ с областями печатной формы |
Кнопки формы вы не создаёте: их строит подсистема подключаемых команд по описанию из модуля менеджера. Поэтому одна команда автоматически появляется во всех формах, указанных в её настройках.

Шаг 1. Макет печатной формы
Добавьте документу макет типа «Табличный документ». В БСП принято именовать такие макеты с префиксом ПФ_MXL_, например ПФ_MXL_Акт: по префиксу их находит обработка «Макеты печатных форм», где пользователь может отредактировать макет без конфигуратора.
В макете заведите именованные области: Заголовок, Шапка, Строка, Подвал — и параметры в ячейках, которые будете заполнять из данных.
Шаг 2. Регистрация объекта
В общем модуле УправлениеПечатьюПереопределяемый найдите процедуру ПриОпределенииОбъектовСКомандамиПечати и добавьте документ:
Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт
// ... типовые объекты ...
СписокОбъектов.Добавить(Метаданные.Документы.АктВыполненныхРабот);
КонецПроцедурыБез этой строки подсистема не будет вызывать процедуру ДобавитьКомандыПечати вашего документа. В типовой конфигурации правку переопределяемого модуля лучше делать в расширении.
Шаг 3. Модуль менеджера: команды и формирование
#Область ПрограммныйИнтерфейс
// Описывает команды печати документа.
//
// Параметры:
// КомандыПечати - ТаблицаЗначений - см. УправлениеПечатью.СоздатьКоллекциюКомандПечати.
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "ПФ_MXL_Акт";
КомандаПечати.Представление = НСтр("ru = 'Акт выполненных работ'");
КомандаПечати.Порядок = 10;
КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
КонецПроцедуры
// Формирует печатные формы по запрошенным командам.
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ПФ_MXL_Акт") Тогда
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"ПФ_MXL_Акт",
НСтр("ru = 'Акт выполненных работ'"),
ПечатьАкта(МассивОбъектов, ОбъектыПечати),
,
"Документ.АктВыполненныхРабот.ПФ_MXL_Акт");
КонецЕсли;
КонецПроцедуры
#КонецОбластиИдентификатор команды совпадает с именем макета: в процедуре Печать по нему проверяется, какую форму запросили. Последний параметр ВывестиТабличныйДокументВКоллекцию — полный путь к макету; по нему в окне печати работает переход к редактированию макета.
Формирование табличного документа
#Область СлужебныеПроцедурыИФункции
Функция ПечатьАкта(МассивОбъектов, ОбъектыПечати)
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_АктВыполненныхРабот_Акт";
Макет = УправлениеПечатью.МакетПечатнойФормы("Документ.АктВыполненныхРабот.ПФ_MXL_Акт");
ДанныеДокументов = ДанныеДляПечати(МассивОбъектов);
Для Каждого ДанныеДокумента Из ДанныеДокументов Цикл
Если ТабличныйДокумент.ВысотаТаблицы > 0 Тогда
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
ОбластьШапки = Макет.ПолучитьОбласть("Шапка");
ОбластьШапки.Параметры.Заполнить(ДанныеДокумента);
ТабличныйДокумент.Вывести(ОбластьШапки);
ОбластьСтроки = Макет.ПолучитьОбласть("Строка");
Для Каждого СтрокаУслуги Из ДанныеДокумента.Услуги Цикл
ОбластьСтроки.Параметры.Заполнить(СтрокаУслуги);
ТабличныйДокумент.Вывести(ОбластьСтроки);
КонецЦикла;
ТабличныйДокумент.Вывести(Макет.ПолучитьОбласть("Подвал"));
УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент,
НомерСтрокиНачало, ОбъектыПечати, ДанныеДокумента.Ссылка);
КонецЦикла;
Возврат ТабличныйДокумент;
КонецФункции
#КонецОбластиЧто здесь важно:
МакетПечатнойФормывместоПолучитьМакет— подхватывает изменённый пользователем макет.ЗадатьОбластьПечатиДокументасвязывает кусок табличного документа с конкретной ссылкой. Это нужно для отправки по почте и сохранения: каждый документ уходит отдельным файлом.КлючПараметровПечатисохраняет у пользователя настройки страницы (поля, ориентацию) для этой формы.- Данные для всех документов выбирайте одним запросом в функции
ДанныеДляПечати, а не обращением к реквизитам каждой ссылки в цикле — при печати пачки из сотни документов разница заметна.
Шаг 4. Подключение команд в формах
Актуальные версии БСП (3.x)
В форме документа:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры
&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедурыВ форме списка код тот же, но третьим параметром передаётся Элементы.Список вместо Объект. У динамического списка основной таблицей должен быть ваш документ, иначе подсистема не поймёт, к чему применять команды.
Точный набор служебных процедур формы немного меняется от версии к версии БСП. Самый надёжный способ — открыть форму любого документа типовой конфигурации на той же версии БСП и скопировать процедуры с префиксом Подключаемый_.
Старые редакции БСП (2.x)
В ранних версиях печать подключалась отдельно от других команд: в ПриСозданииНаСервере вызывалась УправлениеПечатью.ПриСозданииНаСервере(ЭтаФорма), а обработчиком была Подключаемый_ВыполнитьКомандуПечати с вызовом УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати(Команда, ЭтаФорма, Объект). Если вы видите такой код в своей конфигурации — пишите в её стиле, смешивать подходы не нужно.
Что ещё умеет команда печати
У строки КомандыПечати есть и другие полезные поля:
СписокФорм— имена форм через запятую, если команда нужна не во всех формах;МенеджерПечати— если формирование лежит в другом модуле, например в общей обработке печати;Обработчик— клиентская процедура, если перед печатью нужен диалог (выбор подписанта, количества копий);ДополнительныеПараметры— структура, которая придёт вПараметрыПечати;ФункциональныеОпции— показывать команду только при включённой опции.
Несколько печатных форм объединяются в комплект: если в Идентификатор перечислить несколько идентификаторов через запятую, окно печати сформирует их все.
Как проверить и отладить печать
Перед тем как отдавать печатную форму пользователям, я прохожу короткий список:
- Форма документа и форма списка. Команда есть в подменю «Печать» в обеих формах (или только там, где указано в
СписокФорм). - Пачка документов. Выделите в списке десяток документов и напечатайте — каждый должен начинаться с новой страницы, а время формирования не должно расти непропорционально.
- Непроведённый документ. При
ПроверкаПроведенияПередПечатью = Истинаподсистема предложит провести документ; убедитесь, что сценарий работает и у пользователя с ограниченными правами. - Отправка по почте и сохранение. В окне печати сохраните пачку в PDF «каждый документ отдельным файлом» — так проверяется
ЗадатьОбластьПечатиДокумента. - Пользовательский макет. Измените макет в «Макетах печатных форм» и убедитесь, что печать подхватила изменения.
Отлаживать формирование удобно, поставив точку останова в процедуре Печать модуля менеджера: она выполняется на сервере, так что в конфигураторе должна быть включена серверная отладка. Если точка не срабатывает, проблема раньше — в регистрации объекта или в форме.
Типичные ошибки
- Команды нет в форме. Объект не добавлен в
ПриОпределенииОбъектовСКомандамиПечатиили в форме нет вызоваПодключаемыеКоманды.ПриСозданииНаСервере. - Команды нет в списке. Основная таблица динамического списка не задана или не ваш документ.
- Пустое окно печати. Идентификатор в
НужноПечататьМакетне совпадает с идентификатором команды. - Изменённый макет не применяется. Используется
ПолучитьМакетвместоУправлениеПечатью.МакетПечатнойФормы. - Печать пачки «висит». Данные читаются по одной ссылке в цикле. Сделайте один запрос по массиву объектов.
- Правка типового модуля менеджера. В типовых документах добавляйте печать через расширение или внешнюю печатную форму, чтобы не мешать обновлениям.
В БСП печатная форма — это не кнопка, а описание команды. Опишите её правильно в модуле менеджера, и подсистема сама разнесёт её по всем формам.
Разработку печатных форм — от макета по образцу до комплектов документов — я делаю в рамках услуги печатные формы 1С; если печать нужна в типовом решении без снятия с поддержки, использую расширения конфигурации.
Коротко
- Зарегистрируйте документ в
УправлениеПечатьюПереопределяемый.ПриОпределенииОбъектовСКомандамиПечати. - В модуле менеджера опишите
ДобавитьКомандыПечатииПечать, формируйте документ черезМакетПечатнойФормы. - В формах подключите механизм подключаемых команд; в списке передавайте
Элементы.Список. - Используйте
ЗадатьОбластьПечатиДокументаиКлючПараметровПечатидля корректной отправки и настроек страницы. - Для типовых конфигураций — расширение или внешняя печатная форма.




