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