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