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