В процессе разработки и сопровождения систем на базе 1С часто возникает ситуация, когда список печатных форм в меню Печать становится перегруженным. Пользователю бывает трудно сориентироваться, какую именно форму нужно выбрать для конкретного документа, особенно если доступность формы зависит от определенных условий: статуса документа, заполненности реквизитов или типа операции. В этой статье мы подробно разберем, как сделать так, чтобы внешняя печатная форма (ВПФ) не просто выдавала ошибку при нажатии, а корректно скрывалась или становилась неактивной в интерфейсе.
Рассмотрим наиболее современный и простой способ, который не требует изменения программного кода самой обработки. Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП) версии 3.0 и выше, механизм управления видимостью уже встроен в справочник дополнительных отчетов и обработок.
Проанализируем шаги по настройке:
Сумма документа Больше 0 или Статус Равно Проведен.Важный момент: если условия не выполняются, система автоматически исключит эту команду из подменю Печать. Это идеальный вариант для ситуаций, когда требования к видимости просты и опираются на реквизиты объекта.
Если нет возможности использовать настройки БСП или нужно быстро ограничить печать «здесь и сейчас», разберем метод программного прерывания. В модуле объекта ВПФ, в процедуре печати, мы можем проанализировать контекст и принять решение о выводе формы.
Посмотрим на пример реализации кода:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// Проверяем условия для каждого объекта из массива
Для Каждого СсылкаНаОбъект Из МассивОбъектов Цикл
Если СсылкаНаОбъект.Статус = Перечисления.СтатусыДокументов.Черновик Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Для черновиков печатная форма не предусмотрена!");
Продолжить;
КонецЕсли;
// Логика формирования табличного документа...
КонецЦикла;
КонецПроцедуры
Хотя этот метод не скрывает саму ссылку в меню, он предотвращает формирование некорректных данных и информирует пользователя о причине отказа. Рассмотрим ситуацию, когда мы хотим вернуть пустой документ вместо сообщения — в этом случае пользователь увидит пустое окно предварительного просмотра, что может быть менее информативно, но иногда допустимо.
Выясним причину, по которой иногда лучше объединить несколько форм в одну. Если у вас есть две похожие формы, которые печатаются при разных условиях, мы можем создать одну запись в справочнике Дополнительные обработки, а внутри кода реализовать логику выбора макета.
Разберем, как это реализовать:
СведенияОВнешнейОбработке регистрируем одну команду.Печать анализируем параметры объекта.ПолучитьМакет("Макет1") или ПолучитьМакет("Макет2").Этот подход избавляет пользователя от необходимости выбирать между двумя кнопками, так как система сама определяет нужный вариант печати.
Проанализируем более гибкий, но технически сложный метод — использование расширений. Это позволяет полностью контролировать состав команд печати в модуле менеджера объекта. Как рекомендует фирма 1С, для стабильных решений лучше переносить логику видимости в расширение.
В расширении мы можем перехватить процедуру ПриДобавленииКомандПечати. Рассмотрим пример:
&После("ПриДобавленииКомандПечати")
Процедура Расш_ПриДобавленииКомандПечати(КомандыПечати)
// Ищем нашу внешнюю команду в таблице команд
Для Каждого Команда Из КомандыПечати Цикл
Если Найти(Команда.Идентификатор, "МояВнешняяПечатнаяФорма") > 0 Тогда
// Устанавливаем условие видимости
Команда.УсловиеВидимости = "Объект.Сумма > 1000";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Использование свойства УсловиеВидимости позволяет платформе самой управлять отображением кнопки на уровне клиента, что работает максимально быстро и профессионально.
Если доступность печатной формы зависит не от конкретного документа, а от настроек всей информационной базы (например, включен ли учет по складам), мы можем задействовать механизм функциональных опций. При регистрации ВПФ в структуре команды можно указать свойство ФункциональныеОпции.
Посмотрим на пример заполнения структуры в функции СведенияОВнешнейОбработке:
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = НСтр("ru = 'Печатная форма (проф)'");
НоваяКоманда.Идентификатор = "ПФ_Проф_Версия";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипВызоваКомандыПечать();
// Привязываем видимость к функциональной опции
НоваяКоманда.ФункциональныеОпции = "ИспользоватьРасширенныйУчет";
В этом случае, если функциональная опция в базе выключена, команда печати вообще не будет загружена в интерфейс.
Проанализируем одну из частых проблем: вы настроили условия видимости, но кнопка по-прежнему отображается (или не отображается). Нужно помнить, что 1С активно кэширует состав команд печати для повышения производительности. Чтобы изменения вступили в силу, часто требуется:
Если условия видимости зависят от данных, которые пользователь меняет прямо сейчас на экране (без записи в базу), то стандартное меню Печать может не обновиться мгновенно. Для таких динамических случаев лучше использовать Способ 2 (проверка внутри кода с выводом предупреждения).
Подведем итог: для оперативного изменения логики, пока требования клиента еще не устоялись, лучше всего использовать Способ 3 (одна ВПФ с логикой внутри) или Способ 1 (настройка условий в интерфейсе БСП). Как только бизнес-логика стабилизируется, для обеспечения максимального комфорта пользователей рекомендуется перенести условия видимости в расширение конфигурации.