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