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