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