Почему возникает ошибка «Событие объекта не обнаружено» при подписке на события формы в 1С и как перехватить обработку на сервере?

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

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

Рассмотрим подробно, почему возникает эта ошибка, как платформа 1С работает с отборами динамических списков и какими способами можно модифицировать настройки формы на сервере без лишних клиент-серверных вызовов.

Причина ошибки при использовании метода «ДобавитьОбработчик»

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

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

Особенности передачи отборов в динамический список

Часто необходимость выполнить код «после» ПриСозданииНаСервере связана с работой динамических списков. Когда при открытии формы передается параметр Отбор, платформа автоматически переносит эти значения в Список.КомпоновщикНастроек.ФиксированныеНастройки.

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

Выясним, какие существуют эффективные способы решения этой задачи без повторного вызова сервера из клиентского события ПриОткрытии.

Способ 1. Программная установка отборов в «ПриСозданииНаСервере»

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

Для этого можно использовать стандартные функции БСП (или конфигурации «Розница», «Управление торговлей» и др.):


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

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

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

Способ 2. Использование расширения конфигурации (аннотация &После)

Если задача решается в рамках доработки конфигурации через расширение, наилучшим подходом будет использование аннотации &После. Код метода-перехватчика вызовется на сервере сразу после выполнения основной процедуры формы, но до передачи управления клиенту:


&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // На данный момент основная процедура формы уже выполнена,
    // и мы находимся на сервере перед отправкой формы на клиент.
    // Здесь можно выполнить необходимую обработку настроек списка.

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

Способ 3. Использование события «ПриЗагрузкеПользовательскихНастроекНаСервере»

Еще один встроенный механизм формы — использование специализированного серверного события ПриЗагрузкеПользовательскихНастроекНаСервере. Данное событие вызывается платформой при инициализации и восстановлении пользовательских настроек формы.

В этом обработчике доступен контекст формы на сервере, что позволяет внести корректировки в КомпоновщикНастроек динамического списка до того, как форма впервые отобразится у пользователя на клиенте.

Резюме

  1. Метод ДобавитьОбработчик нельзя использовать для событий жизненного цикла формы (таких как ПриСозданииНаСервере).
  2. Автоматический перенос отборов из параметров формы в фиксированные настройки списка происходит после окончания работы ПриСозданииНаСервере.
  3. Чтобы избежать повторного вызова сервера из события ПриОткрытии, следует явно управлять отборами через Параметры.Отбор, применять функции модуля ОтборыСписковКлиентСервер, либо использовать механизмы расширений (аннотация &После).
← На главную