Как программно управлять кнопкой Печать в управляемых формах 1С (на примере УТ 11)

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

В современных конфигурациях 1С, построенных на базе Библиотеки стандартных подсистем (БСП), таких как «Управление торговлей 11», «ERP» или «Комплексная автоматизация», работа с кнопкой Печать существенно отличается от работы с обычными кнопками. Она создается динамически, и просто найти её в конфигураторе на форме документа не получится. В этой статье мы подробно разберем, как «добраться» до этой кнопки, как управлять её видимостью и доступностью в зависимости от состояния документа или прав пользователя.

Особенности механизма печати в БСП

Проанализируем ситуацию: когда вы открываете форму документа в УТ 11, система автоматически формирует подменю «Печать». Этот процесс происходит в процедуре ПриСозданииНаСервере с помощью вызова стандартных механизмов БСП. Кнопки в этом подменю не являются статическими элементами формы; они генерируются на основе данных, описанных в Модуле менеджера соответствующего объекта.

Если нам нужно скрыть кнопку или сделать её недоступной (например, если документ не проверен), у нас есть два пути: использовать штатные настройки команд печати или управлять элементами формы программно. Рассмотрим оба варианта подробнее.

Способ 1: Использование штатного механизма «ПроверкаПроведенияПередПечатью»

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

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

Разберем пример кода:


Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
	
	// Описание новой команды печати
	КомандаПечати = КомандыПечати.Добавить();
	КомандаПечати.МенеджерПечати = "Документ.ВашСвойДокумент"; // Имя менеджера печати
	КомандаПечати.Идентификатор = "МакетВашейПечатнойФормы";
	КомандаПечати.Представление = НСтр("ru = 'Печать документа (внешняя)'");
	
	// Вот ключевое свойство:
	КомандаПечати.ПроверкаПроведенияПередПечатью = Истина; 
	
КонецПроцедуры

Что это дает? Если установить данное свойство в Истина, система автоматически заблокирует выполнение печати для непроведенных документов. При нажатии на кнопку пользователь увидит стандартное предупреждение. Это избавляет разработчика от необходимости вручную отслеживать состояние документа на форме.

Способ 2: Программное управление доступностью группы кнопок на форме

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

Выясним, как называется элемент, отвечающий за печать. В типовых решениях это обычно группа с именем ПодменюПечать. Также могут встречаться варианты ПодменюПечатьОбычное или ГруппаВажное.

Рассмотрим код, который можно разместить в модуле формы (например, в процедуре ПриЧтенииНаСервере или после записи):


&НаСервере
Процедура УстановитьДоступностьПечати()
    
    // Проверяем состояние документа
    ДокументПроведен = Объект.Проведен;
    
    // Обращаемся к группе кнопок печати
    Если Элементы.Найти("ПодменюПечать") <> Неопределено Тогда
        Элементы.ПодменюПечать.Доступность = ДокументПроведен;
    КонецЕсли;

КонецПроцедуры

Важно помнить, что обращаться к Элементы.ПодменюПечать можно только ПОСЛЕ того, как была вызвана стандартная процедура формирования команд печати. Обычно это происходит в ПриСозданииНаСервере. Если вы попытаетесь обратиться к кнопке раньше, программа выдаст ошибку, так как элемент еще не создан.

Способ 3: Управление конкретной кнопкой внутри подменю

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

Типовой шаблон имени кнопки выглядит так: ИмяГруппы_ИмяМенеджераПечати_ИдентификаторКоманды.

Рассмотрим ситуацию на примере. Если ваше подменю называется ПодменюПечать, документ — ЗаказКлиента, а идентификатор команды — Заказ, то имя кнопки в отладчике будет выглядеть примерно так: ПодменюПечать_Документ_ЗаказКлиента_Заказ.

Чтобы точно узнать имя кнопки, выполните следующие шаги:

  1. Запустите отладку и откройте форму документа.
  2. В процедуре ПриОткрытии или ПриСозданииНаСервере (в самом конце) поставьте точку останова.
  3. В окне «Вычислить выражение» введите: Элементы.ПодменюПечать.ПодчиненныеЭлементы.
  4. Проанализируйте список — там вы найдете точное программное имя нужной кнопки.

После того как имя найдено, вы можете управлять ею так же, как любым другим элементом:


// Пример скрытия конкретной кнопки
ИмяКнопки = "ПодменюПечать_Документ_МойДокумент_Макет1";
Если Элементы.Найти(ИмяКнопки) <> Неопределено Тогда
    Элементы[ИмяКнопки].Видимость = Ложь;
КонецЕсли;

Проблема отсутствия кнопки у пользователя с ограниченными правами

Если автор темы в сообщении №0 жалуется, что у пользователя кнопки нет вовсе, хотя она создана Мастером печати, причина может быть не в коде, а в правах доступа (Ролях). Проанализируем этот момент:

Для того чтобы кнопка «Печать» появилась, у пользователя должны быть права на:

  1. Просмотр самого документа.
  2. Использование команды печати (если это отдельный объект команды).
  3. Чтение данных тех объектов, которые используются в запросе печатной формы.

Также проверьте настройки Функциональных опций. В БСП печать может быть привязана к какой-либо константе. Если опция выключена, кнопка не будет создана динамически, и никакое управление видимостью в коде не поможет.

Резюме и рекомендации

Подведем итоги нашего исследования:

  1. Для запрета печати непроведенных документов используйте свойство КомандаПечати.ПроверкаПроведенияПередПечатью = Истина; в модуле менеджера. Это самый надежный способ.
  2. Для управления всем списком команд печати используйте Элементы.ПодменюПечать.Доступность или Видимость в коде формы.
  3. Если нужно скрыть конкретный пункт, используйте поиск элемента по имени, сформированному по шаблону БСП.
  4. Не забывайте про права: если кнопки нет в интерфейсе, в первую очередь проверяйте роли пользователя и состав профилей групп доступа.

Работая с динамическими элементами в 1С 8.3, мы всегда должны помнить о жизненном цикле формы. Всегда вставляйте проверки Элементы.Найти(), чтобы избежать аварийного завершения работы программы в случае изменения состава команд подсистемы печати.

← На главную