Почему не открывается внешняя печатная форма при нажатии кнопки печати в 1С?

Программист 1С v8.3 (Управляемые формы) Сфера услуг, туризм и социальный сектор
← На главную

При разработке внешних печатных форм (ВПФ) для конфигураций на базе управляемых форм и Библиотеки стандартных подсистем (БСП), таких как «Альфа-Авто», разработчики часто сталкиваются с ситуацией: обработка успешно регистрируется в базе, команда появляется в подменю «Печать», но при её нажатии ничего не происходит — форма не открывается, а система не выдает явных сообщений об ошибках.

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

Основные причины отсутствия реакции программы

Когда при выборе внешней команды печатная форма не формируется без видимых ошибок («тихий сбой»), причина чаще всего кроется в несоответствии стандартам подсистемы печати БСП:

  1. Неверная сигнатура экспортного метода печати: подсистема печати БСП ожидает процедуру с четко регламентированным набором из четырех параметров. Если разработчик объявляет функцию без параметров или с произвольным их составом, механизм вызова не может передать данные.
  2. Возврат значения вместо заполнения коллекции: при типе команды ВызовСерверногоМетода и варианте ПечатьMXL подсистема БСП не ожидает возврата объекта ТабличныйДокумент через оператор Возврат. Результат формирования должен помещаться в переданную коллекцию печатных форм. Если коллекция остается пустой, окно предварительного просмотра не открывается.
  3. Несовпадение идентификаторов команд и макетов: строковый идентификатор команды в таблице команд должен в точности совпадать с идентификатором, передаваемым при проверке и выводе в коллекцию.
  4. Подавление исключений подсистемой печати: вызов серверных методов внешних обработок часто оборачивается механизмом БСП в блок попытки и исключения. Любая синтаксическая ошибка или обращение к несуществующей переменной внутри модуля приводит к прерыванию выполнения, при этом ошибка пишется в системный журнал регистрации, а не на экран пользователю.

Анализ и исправление кода функции сведений о внешней обработке

Посмотрим на типовой пример регистрации обработки в функции СведенияОВнешнейОбработке в модуле объекта:


Функция СведенияОВнешнейОбработке() Экспорт

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

КонецФункции

Обратим внимание на второй параметр вызова ДобавитьКоманду — это идентификатор "СопроводительныйЛистКЗаказНаряду". Именно по нему подсистема печати определяет, какой макет требуется сформировать.

Реализация процедуры печати по стандартам БСП

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

Создадим правильную экспортную процедуру Печать и вспомогательную функцию для генерации табличного документа:


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

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

КонецПроцедуры

Функция СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати)

    ТабДокумент = Новый ТабличныйДокумент;
    ТабДокумент.АвтоМасштаб = Истина;
    
    // Макет получаем из текущей внешней обработки
    Макет = ПолучитьМакет("СопроводительныйЛист1");
    
    НомерСтрокиНачало = ТабДокумент.ВысотаТаблицы + 1;
    
    // Обходим массив переданных ссылок на документы
    Для Каждого СсылкаНаДокумент Из МассивОбъектов Цикл
        
        Если НомерСтрокиНачало <> 1 Тогда
            ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
        КонецЕсли;
        
        НомерСтрокиНачало = ТабДокумент.ВысотаТаблицы + 1;
        
        // Получаем и заполняем шапку
        ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
        ОбластьШапка.Параметры.Номер = СсылкаНаДокумент.Номер;
        ОбластьШапка.Параметры.Дата = Формат(СсылкаНаДокумент.Дата, "ДФ=dd.MM.yyyy");
        ТабДокумент.Вывести(ОбластьШапка);
        
        // Выводим табличную часть работ
        ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаРабот");
        Для Каждого Стр Из СсылкаНаДокумент.Работы Цикл
            ОбластьСтрока.Параметры.Заполнить(Стр);
            ТабДокумент.Вывести(ОбластьСтрока);
        КонецЦикла;
        
        // Регистрируем область печати для текущего объекта
        УправлениеПечатью.ЗадатьОбластьПечатиДокумента(
            ТабДокумент, 
            НомерСтрокиНачало, 
            ОбъектыПечати, 
            СсылкаНаДокумент);
            
    КонецЦикла;
    
    Возврат ТабДокумент;

КонецФункции

Пошаговый алгоритм диагностики и поиска ошибок

Если внешняя форма всё равно не выводится на экран, выполним следующие диагностические действия:

  1. Проверка Журнала регистрации: откроем Журнал регистрации в режиме 1С:Предприятие, установим отбор по важности «Ошибка» и «Предупреждение» и повторим нажатие кнопки печати. В тексте события будет указана строка модуля и причина сбоя при выполнении внешнего алгоритма.
  2. Проверка точек входа точками останова: при разработке в клиент-серверном варианте базы включим отладку на сервере (ключ -debug или протокол HTTP). Установим точку останова в процедуре Печать модуля внешней обработки, чтобы убедиться, что управление передается внутрь.
  3. Тестирование автономной формой: добавим во внешнюю обработку вспомогательную форму с реквизитом типа ДокументСсылка.ЗаказНаряд и кнопкой вызова функции СформироватьПечатнуюФорму. Это позволит запускать обработку через меню Файл — Открыть и выполнять отладку без переподключения обработки в справочнике дополнительных отчетов.
  4. Проверка доступности общих модулей: в специализированных конфигурациях (например, «Альфа-Авто») методы расчета сумм и форматирования строк могут находиться в модулях, недоступных из контекста внешнего объекта без контекста сервера. Убедимся, что все вызываемые функции являются экспортными и расположены в общих серверных модулях.
← На главную