Как реализовать условную видимость для внешних печатных форм в БСП

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

При разработке в среде Библиотеки стандартных подсистем (БСП) версий 3.0 и выше программисты часто сталкиваются с тем, что стандартная процедура ДобавитьУсловиеВидимостиКоманды, прекрасно работающая для встроенных печатных форм, отказывается функционировать для внешних обработок. В этой статье мы подробно разберем, почему это происходит, и проанализируем работающие способы решения данной задачи.

Почему условия не работают напрямую во внешних печатных формах

Разберем причину проблемы. Когда мы регистрируем внешнюю печатную форму (ВПФ), данные о ней записываются в справочник Дополнительные отчеты и обработки. Структура этого справочника в типовых конфигурациях не предусматривает хранения массива условий видимости. Даже если вы добавите колонку УсловияВидимости в таблицу команд в функции СведенияОВнешнейОбработке, подсистема БСП при записи просто проигнорирует эти данные, так как им некуда сохраняться в базе данных. В качестве основы для создания таких модулей подойдёт пример внешней печатной формы для актуальных версий БСП.

Следовательно, условия видимости, добавленные внутри модуля внешней обработки, «теряются» сразу после завершения процесса регистрации. Чтобы они заработали, нам необходимо вмешаться в процесс формирования команд непосредственно в момент открытия формы документа или списка.

Способ 1. Использование модуля УправлениеПечатьюПереопределяемый

Это наиболее корректный и «чистый» способ с точки зрения архитектуры БСП. Начиная с версий 3.1.2 и выше, рекомендуется использовать программное добавление условий в момент получения команд формой. Рассмотрим по шагам, как это реализовать через расширение:

  1. Создадим расширение для конфигурации.
  2. Добавим в расширение общий модуль УправлениеПечатьюПереопределяемый.
  3. Найдем процедуру ПриПолученииКомандПечати и создадим для нее перехватчик (аннотация &После).

Проанализируем пример кода, который позволит добавить условие для нашей внешней команды:


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

В данном случае система применяет условия «на лету» перед выводом кнопок в подменю Печать. Это избавляет нас от необходимости модифицировать структуру хранения данных в справочнике.

Способ 2. Добавление команды через модуль менеджера документа

Иногда требуется более жестко связать внешнюю форму с конкретным типом документа. Мы можем добавить команду в расширении модуля менеджера соответствующего документа в процедуре ДобавитьКомандыПечати. Рассмотрим ситуацию, когда команда ссылается на внешний менеджер печати.


&После("ДобавитьКомандыПечати")
Процедура Расш_ДобавитьКомандыПечати(КомандыПечати)
    
    КомандаПечати = КомандыПечати.Добавить();
    КомандаПечати.МенеджерПечати = "Документ.РазовоеНачисление";
    КомандаПечати.Идентификатор = "ВнешняяПечатнаяФорма.ПечатьФормы_РасчетаСреднего";
    КомандаПечати.Представление = "Печать расчета среднего (внешняя)";
    
    // Добавляем список начислений, для которых видна команда
    МассивНачислений = Новый Массив;
    МассивНачислений.Добавить(ПланыВидовРасчета.Начисления.НайтиПоКоду("ДБЛБР"));
    
    УправлениеПечатью.ДобавитьУсловиеВидимостиКоманды(
        КомандаПечати,
        "Начисление",
        МассивНачислений,
        ВидСравнения.ВСписке
    );
    
КонецПроцедуры

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

Особенности работы в формах списков и динамических списках

Часто программисты жалуются, что в форме объекта видимость отрабатывает, а в форме списка команда видна всегда. Выясним причину такого поведения. Для работы механизма УправлениеПечатью в динамических списках необходимо соблюдение следующих требований:

  1. Наличие реквизита: Реквизит, участвующий в условии (например, ВидДокумента или Проведен), обязательно должен присутствовать в основной таблице динамического списка.
  2. Настройка "Использовать всегда": В конфигураторе для этого поля в динамическом списке должен быть установлен флаг Использовать всегда. Без этого платформа может не считывать данные текущей строки, если колонка скрыта пользователем, и условие видимости не сработает.
  3. События формы: В форме списка (или журнала) должен быть корректно настроен вызов обновления команд при активизации строки.

Обязательные вызовы в модуле формы

Чтобы условия видимости пересчитывались динамически при изменении данных пользователем, в модуле формы объекта (документа или справочника) должны присутствовать следующие вызовы:

Проанализируем пример кода в форме документа:


&НаКлиенте
Процедура НачислениеПриИзменении(Элемент)
    // Инициируем мгновенный пересчет видимости кнопок печати
    УправлениеПечатьюКлиент.НачатьОбновлениеКоманд(ЭтаФорма);
КонецПроцедуры

Подмена видимости на доступность

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

Таким образом, мы рассмотрели основные способы обхода ограничений БСП при работе с внешними печатными формами. Использование УправлениеПечатьюПереопределяемый.ПриПолученииКомандПечати является наиболее универсальным решением, позволяющим гибко управлять интерфейсом без изменения структуры основной конфигурации. Для быстрого поиска функций и процедур библиотеки пригодится справочник по методам БСП с примерами использования.

← На главную