Как переопределить форму списка для пользователя с определенной ролью в 1С?

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

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

Способ 1. Использование события ОбработкаПолученияФормы в модуле менеджера

Платформа 1С:Предприятие 8.3 предоставляет стандартный механизм для динамической подмены форм — обработчик ОбработкаПолученияФормы, расположенный в модуле менеджера объекта метаданных. Это наиболее чистое и рекомендуемое платформенное решение.

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


Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
    
    // Проверяем, что запрашивается именно форма списка
    Если ВидФормы = "ФормаСписка" Тогда
        
        Если РольДоступна("НужнаяРольПользователя") Тогда
            ВыбраннаяФорма = "ФормаСпискаСпециальная";
            СтандартнаяОбработка = Ложь;
        КонецЕсли;
        
    КонецЕсли;

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

Разберем важные параметры и правила работы с этим методом:

  1. Проверка вида формы: обязательно анализируем параметр ВидФормы (например, ВидФормы = "ФормаСписка"). Если пропустить это условие, подмена может ошибочно сработать при открытии формы выбора или формы самого документа.
  2. Отключение стандартной обработки: обязательно устанавливаем СтандартнаяОбработка = Ложь, иначе платформа проигнорирует значение в переменной ВыбраннаяФорма.
  3. Значение параметра ВыбраннаяФорма: можно передавать как простое имя формы документа (например, "ФормаСпискаСпециальная"), так и полное имя метаданных ("Документ.РеализацияТоваровУслуг.Форма.ФормаСпискаСпециальная") либо объект метаданных формы.
  4. Ограничение вызова: событие вызывается только в том случае, если форма запрашивается неявно (по стандартному типу, через панель навигации или вызов ОткрытьФорму("Документ.ИмяДокумента.ФормаСписка")). Если в коде явно указано конкретное имя формы, обработчик вызван не будет.

Реализация через расширение конфигурации

Чтобы сохранить конфигурацию на полной поддержке поставщика и упростить последующие обновления, переопределение формы рекомендуется выносить в расширение конфигурации. Добавим обработчик в модуль менеджера документа в расширении с помощью аннотации &Вместо:


&Вместо("ОбработкаПолученияФормы")
Процедура Расш_ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
    
    Если ВидФормы = "ФормаСписка" И РольДоступна("НужнаяРольПользователя") Тогда
        ВыбраннаяФорма = "Расш_ФормаСпискаСпециальная";
        СтандартнаяОбработка = Ложь;
        Возврат;
    КонецЕсли;
    
    // Вызываем стандартный обработчик или обработчик из основной конфигурации
    ПродолжитьВызов(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка);
    
КонецПроцедуры

Способ 2. Декларативное разделение через команды интерфейса

Если требуется избежать программного перехвата, можно использовать возможности командного интерфейса 1С:

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

Способ 3. Адаптация единой формы в ПриСозданииНаСервере

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

Посмотрим на пример такой программной адаптации:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Если РольДоступна("Бухгалтер") Тогда
        // Отображаем финансовые реквизиты
        Элементы.СуммаДокумента.Видимость = Истина;
        Элементы.СчетУчета.Видимость = Истина;
    Иначе
        // Скрываем конфиденциальные данные от менеджеров
        Элементы.СуммаДокумента.Видимость = Ложь;
        Элементы.СчетУчета.Видимость = Ложь;
    КонецЕсли;
    
КонецПроцедуры

При таком подходе также можно программно менять текст запроса у динамического списка Список.ТекстЗапроса, добавлять отборы или изменять условное оформление в зависимости от переданных прав.

← На главную