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