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

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

В процессе работы с крупными корпоративными системами, такими как 1С:ERP Управление предприятием 2, 1С:Комплексная автоматизация или 1С:Управление торговлей, часто возникает необходимость гибко разграничить права доступа пользователей. Одной из типичных задач является ограничение видимости печатных форм. Например, когда рядовым менеджерам нужно оставить возможность печатать только базовое «Соглашение» или «Расходную накладную», полностью скрыв коммерчески чувствительные или сложные формы (такие как «Справка о калькуляции», «Себестоимость» или специализированные акты).

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

Метод 1. Настройка видимости печатных форм штатными средствами БСП (без программирования)

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

Вариант А. Использование механизма «Настройка команд» на уровне формы

В управляемом интерфейсе 1С каждый пользователь (или администратор от его имени) может настроить состав команд, отображаемых на форме документа, включая меню «Печать»:

  1. Откройте форму нужного документа (например, «Заказ клиента» или «Реализация товаров и услуг») под учетной записью администратора.
  2. В правом верхнем углу нажмите кнопку «Еще» и выберите пункт «Изменить форму» (или «Настройка команд» в зависимости от версии интерфейса).
  3. В открывшемся дереве элементов найдите группу, отвечающую за команды печати, и снимите флажки с тех форм, которые не должны отображаться.
  4. Для того чтобы тиражировать эту настройку на группу пользователей, перейдите в раздел «НСИ и администрирование» — «Настройки пользователей и прав» — «Копирование настроек». Выберите настроенную форму администратора и скопируйте ее параметры целевой группе пользователей или конкретному сотруднику. Пользователи без административных прав не смогут вернуть скрытые команды обратно.

Вариант Б. Ограничение доступа к внешним печатным формам

Если речь идет о дополнительных (внешних) печатных формах, зарегистрированных через справочник ДополнительныеОтчетыИОбработки, то задача решается за пару кликов:

  1. Перейдите в раздел «Администрирование» — «Печатные формы, отчеты и обработки» — «Дополнительные отчеты и обработки».
  2. Откройте карточку нужной печатной формы.
  3. На вкладке «Команды» найдите колонку «Быстрый доступ».
  4. Укажите список конкретных пользователей или групп пользователей, которым разрешен доступ к данной печатной форме. У всех остальных пользователей эта форма автоматически пропадет из интерфейса.

Вариант В. Глобальное отключение печатных форм в подменю

Если форму нужно убрать для абсолютно всех пользователей системы, чтобы не загромождать интерфейс, перейдите в «НСИ и администрирование» — «Администрирование» — «Печатные формы, отчеты и обработки» — «Подменю "Печать"». В данном окне можно быстро снять флажки с неиспользуемых команд печати для любых документов системы.

Вариант Г. Ограничение самого действия вывода на печать

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


Метод 2. Программное ограничение через расширение (изменение модуля менеджера)

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

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

Рассмотрим по шагам, как перехватить этот метод и отфильтровать список доступных команд.

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

Рассмотрим пример кода:


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

Преимущества данного метода:

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


Метод 3. Глобальное ограничение через переопределяемый модуль БСП

Что делать, если документов в базе много, а логику ограничения нужно применить централизованно ко всей системе сразу, не заходя в модуль менеджера каждого отдельного документа? Для таких задач в БСП предусмотрен глобальный механизм перехвата команд печати.

Выясним причину популярности этого метода: он базируется на использовании общего модуля УправлениеПечатьюПереопределяемый. В нем присутствует специализированный метод-обработчик ПриПолученииНастроекСпискаКомандПечати (или аналогичные процедуры, вызываемые при заполнении меню печати на уровне платформы).

Давайте реализуем алгоритм фильтрации глобально через расширение:

  1. Добавим общий модуль УправлениеПечатьюПереопределяемый в наше расширение.
  2. Переопределим метод обработки команд печати с использованием аннотации &После.

Посмотрим на практический пример реализации такого механизма:


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

Этот способ позволяет централизованно управлять правами на печать для любых объектов системы в одном общем модуле расширения. Это существенно упрощает поддержку кода разработчиком и минимизирует вероятность ошибок при добавлении новых документов в систему.

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

Мы детально изучили методы ограничения печатных форм в системе «1С:Предприятие 8». При выборе конкретного решения рекомендуем придерживаться следующей логики:

← На главную