При разработке собственных объектов в конфигурациях, базирующихся на Библиотеке стандартных подсистем (БСП), таких как 1С:Бухгалтерия 3.0, программисты часто сталкиваются с ситуацией, когда стандартного написания процедур в модуле менеджера недостаточно. Кнопка "Печать" просто не появляется на форме, хотя код кажется верным. В этой статье мы подробно разберем, как правильно интегрировать механизм печати БСП для нового документа (для упрощения этой задачи есть конструктор печатных форм без программирования), проанализируем необходимые процедуры и выясним, какие «скрытые» настройки нужно выполнить, чтобы команды отобразились в интерфейсе.
Первым делом нам необходимо описать саму команду и логику формирования печатной формы в модуле менеджера вашего документа (например, АТЛ_Заявка). Рассмотрим структуру обязательных процедур. Проанализируем процедуру ДобавитьКомандыПечати, которая сообщает системе, какие именно печатные формы доступны для объекта.
Вставьте следующий код в модуль менеджера:
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "ЗаявкаЗаказчику";
КомандаПечати.Представление = "Заявка Заказчику";
КомандаПечати.СписокФорм = "ФормаСпискаУправляемая,ФормаДокументаУправляемая";
КомандаПечати.ПроверкаПроведенияПередПечатью = Ложь;
КомандаПечати.СразуНаПринтер = Ложь;
КонецПроцедуры
В этом блоке мы создаем описание команды. Обратите внимание на свойство СписокФорм — здесь указываются имена форм документа, на которых должна появиться кнопка. Если вы используете стандартные имена, убедитесь, что они совпадают с метаданными вашего документа.
Далее реализуем основную процедуру Печать, которая вызывается подсистемой при нажатии пользователем на кнопку. Разберем, как правильно передать данные в коллекцию печатных форм:
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ПараметрыВывода.ДоступнаПечатьПоКомплектно = Истина;
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ЗаявкаЗаказчику") Тогда
// Здесь мы вызываем функцию формирования табличного документа
ТабличныйДокумент = СформироватьПечатнуюФормуЗаявки(МассивОбъектов, ОбъектыПечати);
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"ЗаявкаЗаказчику",
"Заявка Заказчику",
ТабличныйДокумент,
,
"Документ.АТЛ_Заявка.Заявка"); // Путь к макету
КонецЕсли;
КонецПроцедуры
Важный момент: для обеспечения высокой производительности в функцию формирования макета (например, СформироватьПечатнуюФормуЗаявки) следует передавать весь МассивОбъектов. Это позволит выполнить один запрос к базе данных вместо выполнения запросов в цикле, что критически важно при пакетной печати нескольких документов из списка.
Чтобы команды подсистемы печати динамически отобразились на управляемой форме, нам нужно подключить соответствующие обработчики в модуле формы. Это стандартная механика БСП "Подключаемые команды".
Рассмотрим код, который необходимо добавить в форму документа:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Инициализация подключаемых команд
ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
КонецПроцедуры
// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);
КонецПроцедуры
&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат)
ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Объект, Результат);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
Эти процедуры позволяют форме «связаться» с общими механизмами БСП. Если после этого шага кнопка все еще не появилась, значит, система не знает, что ваш документ в принципе должен поддерживать механизм печати.
Выясним причину, по которой кнопка может отсутствовать. В современных версиях БСП (особенно в 1С:Бухгалтерия 3.0 последних релизов) необходимо явно указать, что объект участвует в формировании команд печати (вместо ручной разработки можно использовать комплект готовых внешних печатных форм для 1С:Бухгалтерия 3.0). Для этого нужно выполнить два действия.
Во-первых, вернемся в модуль менеджера документа АТЛ_Заявка и добавим служебную процедуру ПриОпределенииНастроекПечати. Она сигнализирует системе, что документ использует стандартные механизмы добавления команд:
Процедура ПриОпределенииНастроекПечати(Настройки) Экспорт
Настройки.ПриДобавленииКомандПечати = Истина;
КонецПроцедуры
Во-вторых, необходимо зарегистрировать ваш документ в общем модуле УправлениеПечатьюПереопределяемый. Найдите в нем процедуру ПриОпределенииНастроекПечати и добавьте в коллекцию ОбъектыПечати ваш новый документ.
Процедура ПриОпределенииНастроекПечати(Настройки) Экспорт
// Добавляем ссылку на менеджер вашего документа
Настройки.ОбъектыПечати.Добавить(Документы.АТЛ_Заявка);
КонецПроцедуры
Важное замечание: Если вы ведете разработку в расширении, то процедуру в УправлениеПечатьюПереопределяемый следует расширять с аннотацией &После. Это позволит сохранить работоспособность всех типовых документов, уже зарегистрированных в конфигурации.
Проанализируем ситуацию: код написан, регистрация выполнена, но кнопки всё равно нет. Это происходит из-за того, что БСП кэширует список команд печати в специальных справочниках или регистрах (в зависимости от версии) для ускорения работы интерфейса. Чтобы система «увидела» изменения в коде, необходимо запустить процесс обновления.
Для этого можно выполнить одно из следующих действий:
УправлениеПечатью.ОбновитьКомандыПечати() — для этого подойдёт универсальный набор инструментов разработчика 1С.F7 в конфигураторе, но в случае с БСП надежнее всего программное обновление или смена номера версии.Рассмотрим несколько полезных приемов, которые сделают вашу работу с печатью более профессиональной:
Использование функциональных опций. Если ваша печатная форма должна появляться только при определенных настройках программы, вы можете указать параметр ФункциональныеОпции в структуре КомандаПечати внутри процедуры ДобавитьКомандыПечати.
Заполнение объектов печати. В процедуре Печать крайне важно корректно заполнять таблицу ОбъектыПечати. Это нужно для того, чтобы в окне предварительного просмотра пользователь мог видеть, к какому именно документу относится текущий лист макета. Используйте для этого стандартный метод:
УправлениеПечатью.ЗаполнитьПараметрыОтправки(ОбъектыПечати, МассивОбъектов, КоллекцияПечатныхФорм);
Таким образом, мы пошагово разобрали процесс добавления команд печати. Основной секрет успеха в современных конфигурациях заключается не только в написании процедур Печать, но и в обязательной регистрации объекта в переопределяемых модулях и в процедуре определения настроек внутри самого менеджера документа.