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