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