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