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