Почему кнопка внешней печатной формы в обычном приложении 1С неактивна и как это исправить?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке и внедрении внешних печатных форм (ВПФ) в конфигурациях на базе обычного приложения (толстый клиент) программисты часто сталкиваются с ситуацией, когда обработка корректно зарегистрирована в справочнике «Внешние обработки», ее название появляется в подменю «Печать» документа, однако сама кнопка остается недоступной (серой) и на нажатия не реагирует. Рассмотрим подробнее, почему это происходит, и разберем по шагам, какие программные механизмы отвечают за активность этих кнопок.

Анализ причин недоступности команды печати

В обычном приложении, в отличие от управляемых форм, механизмы формирования интерфейса сильно завязаны на программный код внутри самой формы документа. Если в управляемом приложении достаточно прописать процедуру в модуле менеджера и зарегистрировать команду, то в обычном приложении (например, в 1С:Управление торговлей 10.3, 1С:Бухгалтерия 2.0 или решениях от Рарус) требуется наличие определенных процедур-обработчиков непосредственно в модуле формы. Проанализируем основные причины «заблокированной» кнопки:

  1. Отсутствие процедур-обработчиков событий: Подменю «Печать» создается динамически, но кнопкам нужны привязанные к ним действия. Если система не находит процедуру, которая должна выполниться при нажатии, кнопка может стать неактивной.
  2. Некорректная регистрация в модуле объекта ВПФ: Если внешняя обработка не содержит обязательную экспортную функцию Печать() или в ней отсутствуют необходимые реквизиты, типовые механизмы могут «отбраковать» такую форму.
  3. Ошибки в инициализации дерева макетов: В типовых решениях используется специальное дерево макетов, которое собирает данные как из внутренних макетов документа, так и из справочника внешних обработок. Если это дерево строится с ошибками, доступность кнопок нарушается.

Шаг 1: Проверка модуля внешней печатной формы

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


// Функция формирует печатную форму и возвращает табличный документ
Функция Печать() Экспорт
    // Здесь должен быть код формирования макета
    ТабДокумент = Новый ТабличныйДокумент;
    // ... заполнение документа ...
    Возврат ТабДокумент;
КонецФункции

Также важно наличие реквизита СсылкаНаОбъект в самой обработке. Типовой механизм через этот реквизит передает ссылку на документ, из которого вызывается печать. Если реквизит отсутствует, внешняя обработка может не запуститься через стандартный механизм. Базовые принципы правильного формирования таких обработок подробно рассматривает руководство по созданию внешних печатных форм на основе типовых.

Шаг 2: Программная инициализация кнопок в форме документа

Если с самой обработкой все в порядке (она открывается через «Файл — Открыть» и печатает), значит проблема кроется в модуле формы документа. Рассмотрим, как происходит инициализация кнопок. В процедуре ПриОткрытии или ПередОткрытием обычно вызывается заполнение подменю печати. Посмотрим на типовой пример кода, который должен присутствовать в модуле формы:


Процедура УстановитьКнопкиПечати()
    
    // Получаем структуру всех доступных печатных форм (внутренних и внешних)
    мДеревоМакетов = ПолучитьДеревоМакетовПечати(Ссылка, ПолучитьСтруктуруПечатныхФорм(), 
                     Новый Действие("ОсновныеДействияФормыПечать"), 
                     Новый Действие("ОсновныеДействияФормыУстановитьПечатьПоУмолчанию"));
    
    // Устанавливаем видимость и доступность подменю
    УстановитьПодменюПечати(мПодменюПечати, ЭлементыФормы.ОсновныеДействияФормы, мДеревоМакетов.Строки.Количество() > 0);
    
    // Настраиваем печать по умолчанию
    УстановитьПечатьПоУмолчанию(мПечатьПоУмолчанию, ЭлементыФормы.ОсновныеДействияФормы, мДеревоМакетов, 
                                Метаданные().Имя, Новый Действие("ОсновныеДействияФормыПечатьПоУмолчанию"));
    
    Если Не мПодменюПечати = Неопределено Тогда
        СформироватьПодменю(мДеревоМакетов, мПодменюПечати, Истина, Истина);
    КонецЕсли;     
    
КонецПроцедуры

Важный момент: Обратите внимание на использование Новый Действие("ОсновныеДействияФормыПечать"). Если процедура с таким именем не определена в модуле формы или она не является экспортной (хотя в модуле формы это не обязательно), кнопка может создаться, но остаться неактивной, так как системе «нечего выполнять».

Шаг 3: Реализация обработчиков нажатия

Для того чтобы кнопки стали активными, в модуле формы документа должны быть физически прописаны соответствующие процедуры. Разберем пример кода, который часто отсутствует в самописных или сильно измененных документах:


// Процедура - обработчик нажатия на кнопку "Печать".
Процедура ОсновныеДействияФормыПечать(Кнопка)
    
    // Если используется типовой механизм УниверсальныеМеханизмы
    УниверсальныеМеханизмы.ОткрытьФормуВыбораПечатныхФормОбъекта(ЭтотОбъект, ЭтаФорма);
    
КонецПроцедуры 

// Процедура - обработчик нажатия на кнопку "Печать по умолчанию"
Процедура ОсновныеДействияФормыПечатьПоУмолчанию(Кнопка)
    
    УниверсальныеМеханизмы.НапечататьДокументПоУмолчанию(ЭтотОбъект);
    
КонецПроцедуры

В некоторых конфигурациях, таких как «Рарус: Бэк-офис», используются свои специфические функции. Если стандартные УниверсальныеМеханизмы не срабатывают, следует использовать методы, интегрированные в данную поставку. Проанализируем пример для конфигураций Рарус:


// Процедура - обработчик нажатия на кнопку "Печать" в конфигурациях Рарус
Процедура ОсновныеДействияФормыПечать(Кнопка)
    
    // Передаем дерево макетов, объект и текст кнопки для определения формы
    ПечатьПоДополнительнойКнопке(мДеревоМакетов, ЭтотОбъект, ЭтаФорма, Кнопка.Текст);
    
КонецПроцедуры

// Процедура настройки печати по умолчанию
Процедура ОсновныеДействияФормыПечатьПоУмолчанию(Кнопка)
    
    Если НазначитьКнопкуПечатиПоУмолчанию(мДеревоМакетов, Метаданные().Имя) Тогда
        УстановитьКнопкиПечати();
    КонецЕсли; 
    
КонецПроцедуры

Дополнительные факторы, влияющие на доступность

Если после добавления всех процедур кнопка всё равно остается серой, проанализируем ситуацию глубже:

Рекомендации по отладке

Чтобы выяснить точную причину, воспользуйтесь отладчиком. Установите точку останова в процедуре УстановитьКнопкиПечати и посмотрите, что возвращает функция ПолучитьДеревоМакетовПечати. Если ваша внешняя форма попадает в дерево, но кнопка недоступна — проблема в привязке Действия. Если формы нет в дереве — проверяйте параметры регистрации в справочнике «Внешние обработки», а именно табличную часть «Принадлежность», где должен быть указан ваш тип документа.

Таким образом, мы выяснили, что секрет активности кнопок ВПФ в обычном приложении кроется в корректной связке между метаданными (справочником внешних обработок) и программным кодом в модуле формы документа. Добавление стандартных обработчиков ОсновныеДействияФормыПечать решает проблему в большинстве случаев.

← На главную