Как правильно вывести стандартное сообщение Печатная форма недоступна в 1С

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

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

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

Почему выводится пустой лист вместо сообщения о недоступности?

Для начала проанализируем, как БСП определяет, нужно ли показывать окно печати. В стандартных подсистемах за это отвечает логика модуля УправлениеПечатью. Система проверяет свойство ВысотаТаблицы у объекта ТабличныйДокумент. Если это значение равно 0, система понимает, что выводить нечего.

Однако часто в коде встречаются «невидимые» действия, которые увеличивают высоту таблицы, даже если вы не выводили ни одной области. Рассмотрим типичные причины:

  1. Вызов разделителей страниц: Использование метода ВывестиГоризонтальныйРазделительСтраниц() сразу делает высоту документа отличной от нуля.
  2. Настройки макета: Иногда установка параметров страницы (ориентация, масштаб) для нового документа в определенных версиях платформы может инициализировать структуру таблицы.
  3. Циклы с условиями: Если в цикле по объектам условие не выполнилось ни разу, но перед циклом или внутри него была выведена пустая область (например, шапка), высота уже не будет нулевой.

Посмотрим на пример кода из вопроса, где автор пытается прервать формирование:


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

Способ №1: Возврат абсолютно пустого Табличного Документа

Разберем самый простой вариант. Чтобы БСП выдала сообщение «Печатная форма недоступна», необходимо убедиться, что в КоллекцияПечатныхФорм попал объект ТабличныйДокумент, у которого высота строго равна 0.

Если ваши условия проверки данных не выполняются, мы рекомендуем не просто возвращать текущую переменную ТабДок, а явно инициализировать новый чистый объект. Проанализируем правильный подход в функции формирования:


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

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

Способ №2: Управление коллекцией печатных форм (Рекомендуемый)

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

Разберем по шагам, как это реализовать:

  1. Выносим проверку данных в отдельную функцию или проверяем результат формирования.
  2. Если результат печати пустой или недоступен, не вызываем УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию.

Пример модифицированной процедуры Печать:


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

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

Способ №3: Использование параметра ОшибкиПечати

Иногда просто фразы «Печатная форма недоступна» недостаточно. Пользователь должен понимать почему она недоступна. Для этого в интерфейсе процедуры Печать предусмотрен параметр ОшибкиПечати. Это список значений, где:

Проанализируем ситуацию: если мы заполним этот список, БСП выведет красивое диалоговое окно со списком всех ошибок. Это особенно полезно при массовой печати документов из списка.

Пример использования ОшибкиПечати:


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    Для Каждого Ссылка Из МассивОбъектов Цикл
        
        Если ПроверкаУсловий(Ссылка) Тогда
            // Формируем и добавляем в коллекцию
            // ...
        Иначе
            // Регистрируем конкретную ошибку для конкретного документа
            ТекстОшибки = СтрШаблон("Документ %1: Не заполнено бизнес-направление!", Ссылка);
            ОбъектыПечати.Добавить(Ссылка, "Ошибка"); // Исключаем из объектов печати
            
            // Добавляем сообщение в стандартный механизм ошибок БСП
            // В новых версиях БСП этот параметр может передаваться как ОшибкиПечати
            // Если его нет в параметрах, можно использовать СообщитьПользователю
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

Подведем итоги

Мы рассмотрели несколько вариантов решения задачи. Выбор метода зависит от ваших требований к интерфейсу:

  1. Для быстрого решения: Убедитесь, что ТабДок.ВысотаТаблицы действительно равна 0. Не устанавливайте параметры страницы и не выводите разделители до того, как убедитесь, что данные для печати есть.
  2. Для корректной архитектуры: Используйте условие перед добавлением в КоллекцияПечатныхФорм. Если данных нет — не добавляйте строку в коллекцию.
  3. Для удобства пользователя: Используйте стандартные механизмы оповещения (сообщения пользователю или регистрацию ошибок в параметрах вывода), чтобы вместо абстрактной «недоступности» человек видел понятную причину (например, «Заполните склад в документе»).

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

← На главную