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

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

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

Суть проблемы и работа платформы

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

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

Событие ОбработкаПолученияФормы

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

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


Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, СтандартнаяОбработка)
    // Передаем управление в специализированный общий модуль БСП
    РаботаСФайлами.ОбработкаПолученияФормы(ЭтотОбъект, ВидФормы, Параметры, ВыбраннаяФорма, СтандартнаяОбработка);
КонецПроцедуры

В этом коде происходит следующее:

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

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

Почему в менеджере объекта может быть «пусто»?

Иногда разработчик открывает модуль менеджера и не видит там никакого кода. Рассмотрим подробнее, почему это происходит и где искать «спрятанную» логику:

  1. Использование расширений конфигурации. В современных системах код часто выносится в расширения. Проверьте список расширений в вашей базе. В них может быть перехвачено событие ОбработкаПолученияФормы с аннотацией &Вместо или &Перед. В этом случае в основной конфигурации модуль будет девственно чист, но логика будет работать.
  2. Программное подключение обработчиков. Хотя для события ОбработкаПолученияФормы это нехарактерно (оно жестко привязано к менеджеру), стоит убедиться, что вы смотрите модуль именно того справочника, который указан в первом параметре ОткрытьФорму.
  3. Невнимательность при поиске. В окне редактирования объекта конфигурации на вкладке «Прочее» есть кнопка «Модуль менеджера». Убедитесь, что вы проверяете именно его, а не «Модуль объекта».

Механизм переопределения форм в БСП

Посмотрим на пример работы подсистемы «Работа с файлами». Для справочников присоединенных файлов БСП использует общую логику. Когда вызывается РаботаСФайламиКлиентСервер.ОпределитьФормуПрисоединенногоФайла(), система выполняет следующие действия:

Таким образом, даже если у вашего справочника ПредписаниеПрисоединенныеФайлы нет ни одной своей формы, он успешно открывается, используя формы из состава БСП или динамически генерируемые платформой окна.

Как эффективно анализировать стек вызовов

Проанализируем ситуацию с отладкой. Если стек вызовов кажется неочевидным, выполните следующие шаги:

  1. Установите точку остановки непосредственно на строке с ОткрытьФорму.
  2. Включите «Остановку по ошибке» и проверьте настройки отладки (стек может «рваться» при переходе с клиента на сервер, если не включена отладка на сервере).
  3. При попадании в общий модуль откройте окно «Стек вызовов». Самая нижняя строка должна указывать на системное событие или на ваш вызов ОткрытьФорму. Если между ними есть пробелы, значит, произошел неявный вызов через механизм событий платформы.

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

← На главную