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