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

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

При разработке и кастомизации прикладных решений на платформе 1С:Предприятие 8 часто возникает задача адаптации интерфейса под нужды конкретных пользователей или ролей. Например, в документе ЗаказПокупателя по умолчанию используется стандартная ФормаДокумента. Однако для определенной группы сотрудников (например, руководителей отделов или VIP-менеджеров) требуется открывать другую, более информативную или упрощенную форму — ФормаДокумента2.

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

Почему старые методы перенаправления неэффективны?

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

Давайте выясним, почему так делать категорически не рекомендуется:

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

Для решения этой задачи в платформе существует специализированный и очень мощный инструмент — предопределенный обработчик ОбработкаПолученияФормы.

Механизм «ОбработкаПолученияФормы»: где и как писать код

Процедура ОбработкаПолученияФормы — это предопределенный обработчик события, который располагается исключительно в модуле менеджера конкретного объекта метаданных (в нашем случае — в модуле менеджера документа ЗаказПокупателя). Она вызывается на сервере в момент, когда система только собирается определить, какую форму нужно показать пользователю, но еще не начала ее создание.

Рассмотрим синтаксис этой процедуры и назначение ее ключевых параметров:


Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)

Практический пример реализации подмены формы

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

Откроем модуль менеджера документа ЗаказПокупателя и добавим следующий код:


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

Альтернативный вариант: Подписки на события

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

Разберем по шагам, как настроить подписку:

  1. Создайте новый общий модуль (например, _РаботаСФормамиКастомный). Обязательно установите у него свойства Сервер и Вызов сервера.
  2. В ветке метаданных Общие -> Подписки на события добавьте новую подписку.
  3. В свойстве Источник выберите менеджер нужного объекта (например, ДокументМенеджер.ЗаказПокупателя).
  4. В свойстве Событие выберите ОбработкаПолученияФормы.
  5. В качестве Обработчика укажите процедуру из вашего нового общего модуля.

Код процедуры в общем модуле будет выглядеть аналогичным образом:


Процедура ОпределитьФормуЗаказаПокупателя(Источник, ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Экспорт

    Если ВидФормы = "ФормаОбъекта" Тогда
        Если РольДоступна("ДоступнаАльтернативнаяФормаЗаказа") Тогда
            ВыбраннаяФорма = "ФормаДокумента2";
            СтандартнаяОбработка = Ложь;
        КонецЕсли;
    КонецЕсли;

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

Использование расширений конфигурации (современный подход)

Наиболее современным и чистым способом решения данной задачи в управляемом приложении является использование Расширения конфигурации. Это позволяет полностью отказаться от изменения основной конфигурации.

Для этого выполните следующие действия:

  1. Создайте или откройте существующее расширение конфигурации.
  2. Перенесите (заимствуйте) документ ЗаказПокупателя в расширение.
  3. В расширении откройте модуль менеджера этого документа.
  4. Добавьте процедуру-перехватчик с аннотацией &Вместо или &Перед.

Пример кода в модуле менеджера документа внутри расширения:


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

Важные ограничения и вопросы производительности

Проанализируем критически важные аспекты работы данного механизма, о которых часто забывают разработчики:

1. Явный вызов конкретной формы игнорирует обработчик.
Механизм подмены сработает только в том случае, если открытие формы происходит интерактивно (клик в списке) или через обобщенный вызов вида ОткрытьФорму("Документ.ЗаказПокупателя.ФормаОбъекта"). Если в коде вашей конфигурации явно прописана жесткая ссылка на форму, например: ОткрытьФорму("Документ.ЗаказПокупателя.Форма.ФормаДокумента"), то платформа проигнорирует процедуру ОбработкаПолученияФормы и откроет именно запрошенную форму.

2. Требования к быстродействию кода.
Процедура ОбработкаПолученияФормы выполняется на сервере и вызывается платформой очень часто при работе пользователей с интерфейсом. Категорически не рекомендуется писать внутри нее тяжелые запросы к базе данных, обращаться к веб-сервисам или выполнять сложные вычисления. Старайтесь использовать максимально быстрые проверки, такие как РольДоступна() или чтение предварительно закэшированных параметров сеанса.

Применяя описанные подходы, мы получаем быстрое, надежное и легко обновляемое решение для динамического управления интерфейсом в системе 1С:Предприятие 8.

← На главную