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