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

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

В практике разработки на платформе 1С:Предприятие 8.3 часто возникает задача подмены стандартной формы объекта (например, списка справочника или формы выбора) на альтернативную в зависимости от определенных условий: прав доступа, значений параметров сеанса или текущих настроек пользователя. Для этих целей используется специализированное событие ОбработкаПолученияФормы, расположенное в модуле менеджера объекта.

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

Разбираем механику события ОбработкаПолученияФормы

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


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

Для того чтобы подменить форму, мы должны установить СтандартнаяОбработка = Ложь и присвоить параметру ВыбраннаяФорма имя нашей новой формы. Рассмотрим типичный пример кода, который часто приводит к ошибкам:


Если ВидФормы = "ФормаСписка" Тогда
    Если ПараметрыСеанса.ИспользоватьНовыйИнтерфейс Тогда
        ВыбраннаяФорма = "ФормаСпискаНовая";
        СтандартнаяОбработка = Ложь;
    КонецЕсли;
КонецЕсли;

Проблема 1: Множественное открытие окон

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

Когда мы устанавливаем СтандартнаяОбработка = Ложь, мы берем управление процессом открытия формы на себя. Платформа ожидает, что мы сами позаботимся о параметрах уникальности. Если в структуре Параметры отсутствует четкий ключ уникальности, система считает каждый запрос на открытие формы уникальным и создает новое окно.

Для решения этой проблемы мы должны явно проверить или задать КлючУникальности в структуре Параметры. Рассмотрим, как это сделать правильно:


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

Проблема 2: Отсутствие навигационной ссылки (хлебных крошек)

Если форма открывается без контекста (без навигационной ссылки в верхней части окна), это означает, что платформа «потеряла» связь формы с метаданными объекта в интерфейсе. Это часто случается, если переопределяемая форма не назначена в конфигураторе как «Основная» или если способ ее открытия не совпадает с ожиданиями системы.

Проанализируем ситуацию: чтобы навигация сохранялась, форма должна быть логически встроена в командный интерфейс. Если вы используете СтандартнаяОбработка = Ложь, убедитесь, что:

  1. Параметр ВыбраннаяФорма содержит именно строку с именем формы, а не объект метаданных. Хотя документация допускает оба варианта, использование строки "ФормаСпискаНовая" или полного пути "Справочник.Контрагенты.Форма.ФормаСпискаНовая" является более стабильным методом.
  2. В самой форме в конфигураторе свойство «Способ управления окном» установлено в значение Использовать основное.

Использование параметра ДополнительнаяИнформация

Параметр ДополнительнаяИнформация представляет собой структуру, которая позволяет передать дополнительные инструкции механизму открытия формы. Одним из важных свойств является возможность управления повторным использованием формы.

Выясним, как заставить систему искать существующую форму более агрессивно. Мы можем добавить в ДополнительнаяИнформация флаг повторного использования:

ДополнительнаяИнформация.Вставить("ПовторноеИспользование", Истина);

Однако стоит помнить, что это свойство работает только в связке с правильно заполненным КлючомУникальности в структуре Параметры.

Влияние версии платформы и режима совместимости

Заметим, что поведение события может варьироваться в зависимости от версии платформы 1С:Предприятие. На более старых версиях (например, до 8.3.8) наблюдались ошибки в работе навигационных ссылок при программной подмене форм. Если вы столкнулись с тем, что код работает у коллеги на версии 8.3.18, но не работает у вас на 8.3.6, первым делом стоит рассмотреть вопрос обновления платформы или изменения режима совместимости конфигурации.

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

Итоговый правильный шаблон решения

Сведем все рекомендации в единый блок кода, который обеспечит корректное открытие формы в единственном экземпляре с сохранением навигации:


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

Используя данный подход, мы обеспечиваем стабильную работу пользовательского интерфейса. Форма будет открываться ровно один раз, а при повторном клике на команду в панели навигации система просто активирует уже открытое окно, сохраняя при этом всю цепочку навигационных ссылок.

← На главную