Почему не появляется подменю «Печать» на форме документа в БСП и как это исправить

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При доработке типовых конфигураций 1С (например, «Бухгалтерия предприятия 3.0») разработчики часто сталкиваются с ситуацией: в модуле менеджера добавлена процедура ДобавитьКомандыПечати, в форме вызвана процедура ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект), но кнопка «Печать» или соответствующее подменю так и не выводится на форме. Проанализируем порядок подключения печатных форм в библиотеке стандартных подсистем (БСП) и разберем все необходимые шаги.

1. Регистрация объекта как поставщика команд печати

Главная и наиболее частая причина, по которой подсистема печати игнорирует добавленный документ — отсутствие регистраций метаданных в переопределяемом модуле. Механизмы БСП сканируют не все объекты подряд, а только те, что явно объявлены в системе.

Разберем, что требуется сделать в первую очередь. Перейдем в общий модуль УправлениеПечатьюПереопределяемый и найдем процедуру ПриОпределенииОбъектовСКомандамиПечати. Добавим в массив поставщиков команд наш документ:


// Определяет список объектов конфигурации, использующих подсистему "Управление печатью".
Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт

    СписокОбъектов.Добавить(Документы.МойНовыйДокумент);

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

Без этого шага подсистема БСП не станет опрашивать модуль менеджера документа МойНовыйДокумент при инициализации командной панели.

2. Заполнение процедуры «ДобавитьКомандыПечати» в модуле менеджера

Рассмотрим структуру описания команды в модуле менеджера объекта. В процедуре ДобавитьКомандыПечати важно не только указать базовые реквизиты, но и корректно задать обработчик команды:


// Заполняет список команд печати.
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт

    КомандаПечати = КомандыПечати.Добавить();
    КомандаПечати.Идентификатор = "ОписьДокументов";
    КомандаПечати.Представление = НСтр("ru = 'Опись вложенных документов'");
    КомандаПечати.ПроверкаПроведенияПередПечатью = Ложь;
    КомандаПечати.Порядок = 1;
    
    // В конфигурациях на базе БСП (в т.ч. БП 3.0) необходимо указывать клиентский обработчик
    КомандаПечати.Обработчик = "УправлениеПечатьюБПКлиент.ВыполнитьКомандуПечати";

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

Убедимся также, что в модуле менеджера присутствует экспортная процедура Печать, которая отвечает за формирование печатных форм:


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

3. Вызов подсистемы «Подключаемые команды» в модуле формы

Посмотрим на интеграцию подсистемы в модуль управляемой формы объекта. Для полноценной работы подменю печати недостаточно одного лишь вызова в ПриСозданииНаСервере. Выясним, какие событию формы требуется перехватывать:

  1. Создание формы на сервере: Инициализация команд подсистемы.
  2. Чтение объекта на сервере: Обновление видимости и доступности кнопок при смене контекста/данных.
  3. Открытие формы на клиенте: Запуск фонового обновления состояний кнопок.

Реализуем обработчики событий в модуле формы следующим образом:


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

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

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

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)

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

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)

    // Обновление состояния команд при открытии формы
    ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);

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

Если в форме используются подключаемые команды командной панели, в модуле формы также должны быть объявлены служебные клиентские и серверные процедуры для обработки нажатия на кнопки:


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

&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат)
    ПодключаемыеКоманды.ВыполнитьКомандуНаСервере(ЭтотОбъект, Контекст, Результат);
КонецПроцедуры

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

4. Сброс кэша подсистемы

Даже при идеальном написании кода кнопки могут не появиться сразу из-за кэширования параметров БСП. В момент разработки подсистема сохраняет список объектов с печатными формами в сеансе.

Чтобы сбросить кэш и принудительно обновить список подключаемых команд, выполним следующие действия:

  1. Перезапустим сеанс информационной базы с параметром командной строки /C ОбновитьВерсиюБД.
  2. Или запустим процесс обновления параметров программно через служебную обработку подсистемы «Инструменты разработчика» / «Сведения о конфигурации».
← На главную