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

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

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

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

Выясняем причину: почему общий модуль не виден в подписке

Когда вы создаете подписку на событие (например, для менеджера документов) и пытаетесь выбрать обработчик из общего модуля, конфигуратор выполняет жесткую фильтрацию по свойствам модулей и сигнатурам процедур. Если процедура не соответствует строгим правилам платформы, она просто не появится в списке выбора.

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

  1. Несовпадение количества параметров процедуры. Это самая распространенная ошибка. Разработчики часто копируют сигнатуру обработчика из модуля менеджера объекта. Но правила для модуля менеджера и для общего модуля в подписке различаются:
    • В модуле менеджера объекта процедура имеет ровно 5 параметров: ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
    • В общем модуле для подписки на событие параметров должно быть ровно 6! Первым параметром всегда должен выступать Источник (объект-отправитель события, то есть сам менеджер объекта, например, тип ДокументМенеджер.ИмяДокумента): ОбработкаПолученияФормы(Источник, ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
    Если в процедуре вашего общего модуля указано 5 параметров вместо 6, платформа проигнорирует её при поиске доступных обработчиков для подписки.
  2. Некорректные флаги компиляции общего модуля. Подписка на событие ОбработкаПолученияФормы инициализируется на сервере в момент, когда платформа обрабатывает запрос на построение интерфейса. Чтобы модуль был доступен:
    • В свойствах общего модуля обязательно должен быть установлен флаг Сервер.
    • Должен быть снят флаг Глобальный (процедуры глобальных модулей не могут выступать в роли обработчиков событий).
    • Процедура внутри модуля должна быть объявлена с ключевым словом Экспорт.
    • При необходимости работы в распределенных или веб-клиентах также рекомендуется устанавливать флаги Вызов сервера, Клиент (управляемое приложение) и Внешнее соединение.

Как правильно переопределять форму (почему нельзя вызывать ПолучитьФорму)

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

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

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

Правильный алгоритм переопределения выглядит следующим образом:

  1. В параметре ВыбраннаяФорма указывается строковое имя альтернативной формы (например, "Документ.РеализацияТоваровУслуг.Форма.ФормаДокументаДляПросмотра").
  2. Параметру СтандартнаяОбработка присваивается значение Ложь. Это ключевой момент, сообщающий платформе, что стандартный алгоритм выбора формы (по умолчанию) выполнять не нужно, а следует открыть именно то, что записано в переменной ВыбраннаяФорма.

Реализация подписки на событие: пошаговый пример кода

Рассмотрим практическую реализацию. Создадим общий модуль и процедуру-обработчик подписки, которая будет анализировать, проведен ли документ, и в зависимости от этого открывать либо стандартную форму, либо форму «только для чтения».

Шаг 1. Создаем общий модуль, например, с именем РаботаСФормамиДокументов. Устанавливаем свойства: Клиент (управляемое приложение) = Истина, Сервер = Истина, Внешнее соединение = Истина. Флаг Глобальный оставляем выключенным.

Шаг 2. Пишем в модуле процедуру-обработчик:


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

Шаг 3. В дереве метаданных конфигурации переходим в раздел Общие -> Подписки на события и добавляем новую подписку со следующими свойствами:

Важные нюансы работы события, о которых нужно помнить

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

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

← На главную