Как скрыть типовые печатные формы для определенных пользователей в 1С

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

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

Анализ ситуации: почему копирование документа — это плохой путь

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

  1. Сложность поддержки: При обновлении типовой конфигурации вам придется вручную переносить все изменения логики проведения, структуры данных и форм в ваш дубликат.
  2. Дублирование движений: Копии документа потребуют написания собственных процедур проведения по всем регистрам (бухгалтерским, накопления, сведений).
  3. Программная генерация форм: В современных конфигурациях на базе БСП (Библиотека стандартных подсистем) формы часто генерируются динамически. Настройка копии документа потребует глубокого вмешательства в общие модули.

Вместо этого мы воспользуемся механизмами управления командами печати, которые предоставляет платформа и БСП.

Основной механизм: Процедура ДобавитьКомандыПечати

В типовых конфигурациях 1С (УТ 11, ERP, КА 2, БП 3.0) список кнопок в подменю Печать формируется в модуле менеджера соответствующего документа. За это отвечает экспортная процедура ДобавитьКомандыПечати(КомандыПечати). Именно здесь определяется состав массива команд, которые увидит пользователь.

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

  1. Создадим новую роль (например, ОграничениеПечатиТиповыхФорм).
  2. Назначим эту роль нужным пользователям.
  3. В расширении перехватим процедуру ДобавитьКомандыПечати модуля менеджера документа.

Посмотрим на пример кода, который позволит отфильтровать лишние формы:


&После("ДобавитьКомандыПечати")
Процедура Расш1_ДобавитьКомандыПечати(КомандыПечати)
    // Проверяем наличие роли у текущего пользователя
    Если РольДоступна("ОграничениеПечатиТиповыхФорм") Тогда
        
        // Индекс для обхода коллекции с конца (чтобы корректно удалять элементы)
        КоличествоЭлементов = КомандыПечати.Количество();
        Для Счетчик = 1 По КоличествоЭлементов Цикл
            Индекс = КоличествоЭлементов - Счетчик;
            Команда = КомандыПечати[Индекс];
            
            // Оставляем только нужную нам форму, например, по идентификатору
            Если Команда.Идентификатор <> "МояВнешняяПечатнаяФорма" Тогда
                КомандыПечати.Удалить(Индекс);
            КонецЕсли;
        КонецЦикла;
        
    КонецЕсли;
КонецПроцедуры

Использование параметров сеанса для быстрой фильтрации

Если задача стоит максимально узко — ограничить печать всего для двух-трех конкретных сотрудников, и вы не хотите создавать новые роли, можно использовать проверку текущего пользователя напрямую через параметры сеанса. Рассмотрим этот вариант:


&После("ДобавитьКомандыПечати")
Процедура Расш1_ДобавитьКомандыПечати(КомандыПечати)
    ТекущийПользователь = ПараметрыСеанса.ТекущийПользователь;
    
    // Проверяем конкретных пользователей (лучше вынести в константу или доп. реквизит)
    Если ТекущийПользователь.Наименование = "Иванов И.И." Или ТекущийПользователь.Наименование = "Петров П.П." Тогда
        КомандыПечати.Очистить(); // Удаляем все типовые команды
        
        // Здесь можно программно добавить только одну разрешенную команду
        НоваяКоманда = КомандыПечати.Добавить();
        НоваяКоманда.Менеджер = "Документ.РасходнаяНакладная";
        НоваяКоманда.Идентификатор = "СпецФормаДляПросмотра";
        НоваяКоманда.Представление = НСтр("ru = 'Разрешенная форма печати'");
        НоваяКоманда.ПроверкаПроведенияПередПечатью = Ложь;
    КонецЕсли;
КонецПроцедуры

Важные нюансы при работе с полными правами

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

Настройка через пользовательский интерфейс

Выясним, можно ли решить задачу без программирования. В некоторых современных конфигурациях (например, 1С:Управление торговлей 11) в разделе НСИ и администрирование — Печатные формы, отчеты и обработки существует пункт Подменю "Печать".

Здесь можно визуально настроить видимость команд печати. Однако стоит помнить, что такая настройка применяется глобально для всего объекта и для всех пользователей. Если вам нужно скрыть формы только для конкретной подсистемы или группы лиц, программный метод через расширение и роли остается единственным надежным вариантом.

Программное определение контекста подсистемы

Многие разработчики задаются вопросом: можно ли программно определить, из какой именно подсистемы (раздела интерфейса) открыт документ? В интерфейсе "Такси" прямого способа получить имя текущей активной подсистемы в форме документа нет. Именно поэтому разделение прав через Роли является наиболее грамотным архитектурным решением. Вместо того чтобы привязываться к "месту", откуда открыт документ, мы привязываемся к "праву" конкретного пользователя видеть или не видеть определенные кнопки.

Итог: Для эффективного решения задачи используйте расширение модуля менеджера документа, переопределяя процедуру ДобавитьКомандыПечати. Это позволит сохранить чистоту типовой конфигурации и обеспечит гибкость настроек через механизм ролей или дополнительных реквизитов пользователей.

← На главную