Почему внешняя печатная форма работает из списка документов, но не запускается из самой формы в ЗУП 3.1

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

В практике разработки на платформе 1С:Предприятие 8.3 (особенно в конфигурациях на базе БСП, таких как ЗУП 3.1, ERP или БП 3.0) часто встречается специфическая ситуация. Вы создаете внешнюю печатную форму, регистрируете ее в справочнике «Дополнительные отчеты и обработки», и она прекрасно печатает документы из списка. Однако при открытии самого документа и нажатии на ту же кнопку в меню «Печать» ничего не происходит — отладчик даже не заходит в модуль обработки. Разберем подробно, почему так происходит и как это исправить.

Анализ исходного кода регистрации

Для начала рассмотрим стандартную функцию СведенияОВнешнейОбработке, которую использовал автор темы. Этот код отвечает за то, как система «видит» нашу обработку.


Функция СведенияОВнешнейОбработке() Экспорт
    
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
    
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();    
    ПараметрыРегистрации.Версия = "1.0";
    ПараметрыРегистрации.Назначение.Добавить("Документ.ЗаявкаНаПодборПерсонала");    
    ПараметрыРегистрации.Наименование = "Заявка на подбор персонала";
    ПараметрыРегистрации.Информация = "Заявка на подбор персонала";
    ПараметрыРегистрации.БезопасныйРежим = Истина;
        
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = НСтр("ru = 'Заявка на подбор персонала 1'");
    НоваяКоманда.Идентификатор = "Макет";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
    НоваяКоманда.ПоказыватьОповещение = Истина;
    НоваяКоманда.Модификатор = "ПечатьMXL";    
            
    Возврат ПараметрыРегистрации;
    
КонецФункции

В данном коде мы видим использование типа команды ТипКомандыВызовСерверногоМетода() и модификатора ПечатьMXL. Это классическая связка для БСП, которая ожидает, что в модуле обработки есть экспортная процедура Печать, формирующая табличный документ.

Реализация процедуры Печать

Проанализируем структуру процедуры Печать. Важно помнить, что при вызове из списка в параметр МассивОбъектов передаются ссылки на все выделенные строки, а при вызове из формы — массив с одной ссылкой на текущий объект.


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

Если код регистрации и печати верен, а кнопка в форме документа видна, но «молчит», причина кроется не в самой внешней обработке, а в модуле формы документа конфигурации.

Причина проблемы: Отсутствие механизмов БСП в форме

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

Для того чтобы команды печати (в том числе внешние) функционировали в форме документа, необходимо проверить наличие трех составляющих в модуле формы:

  1. Инициализация команд на сервере: В процедуре ПриСозданииНаСервере обязательно должен быть вызов инициализации подключаемых команд. Без этого система просто отрисует кнопки, но не свяжет их с логикой.
  2. Клиентский обработчик команд: Процедура, которая принимает нажатие кнопки.
  3. Серверный обработчик команд: Процедура, которая выполняет вызов серверных методов печати.

Шаги по исправлению модуля формы

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

1. Инициализация в ПриСозданииНаСервере:

Убедимся, что в процедуре ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) присутствует следующая строка:

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

2. Добавление стандартных обработчиков БСП:

Скопируем в конец модуля формы (или в соответствующую область «ОбработчикиКомандФормы») следующий блок кода:


#Область ОбработчикиКомандФормы

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

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

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

#КонецОбласти

Именно отсутствие этих процедур является наиболее частой причиной игнорирования нажатия. Механизм ПодключаемыеКоманды при нажатии на кнопку ищет в форме процедуру Подключаемый_ВыполнитьКоманду. Если её нет, действие обрывается на уровне платформы.

Дополнительные нюансы и проверки

Выясним, какие еще факторы могут влиять на работоспособность печати из формы, если вышеуказанные действия не помогли:

1. Модифицированность объекта

Посмотрим на поведение БСП при печати измененного документа. Если в документ внесены правки, но он не записан (горит «звездочка» в заголовке), БСП при нажатии «Печать» предложит записать объект. Если в форме нарушена логика записи или переопределены стандартные вопросы, команда печати может быть заблокирована системой контроля модифицированности.

2. Безопасный режим

Проанализируем строку ПараметрыРегистрации.БезопасныйРежим = Истина;. В этом режиме 1С ограничивает использование внешних компонент, работу с файловой системой и COM-объектами. Если ваша печатная форма внутри функции СформироватьПечатнуюФорму пытается сделать что-то «запрещенное», в форме документа это может вызвать тихую ошибку инициализации, в то время как в списке (где контекст формы отсутствует) выполнение может пройти иначе. Попробуйте временно установить Ложь для тестирования.

3. Кэширование данных

Иногда после внесения правок в модуль формы конфигурация требует полной очистки кэша или перезапуска сеанса в режиме «Конфигуратор — Обновить конфигурацию базы данных». Также полезно зайти в справочник «Дополнительные отчеты и обработки» и обновить файл обработки, даже если код самой обработки не менялся — это заставляет систему перегенерировать кэш команд для этого объекта.

4. Использование новых объектов

Помните, что печать из списка всегда работает с уже записанными в базу ссылками (Ссылка). Из формы документа печать может вызываться для нового, еще не созданного в базе объекта. В этом случае Объект.Ссылка будет пустой, и запрос в функции ПолучитьДанныеДляПечати(МассивОбъектов) вернет пустой результат. Всегда проверяйте, записан ли документ, прежде чем нажимать кнопку печати.

Резюме: Если внешняя печатная форма работает в списке, но молчит в документе — в 99% случаев проблема в отсутствии стандартных процедур Подключаемый_ВыполнитьКоманду в модуле формы этого документа. Добавление стандартного шаблона БСП решает эту задачу.

← На главную