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