В практике разработки на платформе «1С:Предприятие 8.3» часто встречается ситуация: программист вызывает стандартную функцию ОткрытьФорму, ожидая открытия конкретной формы справочника или документа, но вместо этого отладчик «прыгает» в неожиданный общий модуль (например, РаботаСФайламиКлиентСервер), хотя в самом справочнике форм может вообще не существовать. Рассмотрим подробнее, как работает этот механизм, и разберем по шагам, почему управление передается в программный код общих модулей Библиотеки стандартных подсистем (БСП).
Когда мы пишем команду ОткрытьФорму("Справочник.ИмяСправочника.ФормаСписка", ...), платформа не просто ищет объект с названием «ФормаСписка» в дереве конфигурации. Прежде чем вывести окно на экран, система инициирует цепочку событий, позволяющих переопределить стандартное поведение. Это необходимо для реализации гибкой логики, когда в зависимости от прав доступа, параметров или типа данных система должна показать разные интерфейсные решения.
Проанализируем ситуацию: если в самом справочнике (например, Справочник.ПредписаниеПрисоединенныеФайлы) отсутствуют визуальные формы, это первый признак того, что их генерация или подбор происходят динамически. Платформа предоставляет для этого специальное событие в модуле менеджера объекта.
Выясним причину «прыжка» в общий модуль. Основным «виновником» является стандартный обработчик ОбработкаПолученияФормы, расположенный в модуле менеджера справочника или документа. Это системное событие, которое вызывается на сервере сразу после вызова ОткрытьФорму на клиенте.
Рассмотрим, как выглядит этот механизм изнутри. Если конфигурация построена на базе БСП, то в модуле менеджера справочника присоединенных файлов вы почти наверняка обнаружите следующий код:
Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, СтандартнаяОбработка)
// Передаем управление в специализированный общий модуль БСП
РаботаСФайлами.ОбработкаПолученияФормы(ЭтотОбъект, ВидФормы, Параметры, ВыбраннаяФорма, СтандартнаяОбработка);
КонецПроцедуры
В этом коде происходит следующее:
Ложь, платформа перестанет искать форму в дереве конфигурации и будет использовать ту, что указана в переменной ВыбраннаяФорма.Именно поэтому, когда вы нажимаете F11 (шаг внутрь) на строке ОткрытьФорму, вы проваливаетесь сначала в менеджер, а оттуда — в общий модуль РаботаСФайлами, где БСП анализирует, является ли файл картинкой, текстовым документом или архивом, чтобы подставить соответствующий вьюер.
Иногда разработчик открывает модуль менеджера и не видит там никакого кода. Рассмотрим подробнее, почему это происходит и где искать «спрятанную» логику:
ОбработкаПолученияФормы с аннотацией &Вместо или &Перед. В этом случае в основной конфигурации модуль будет девственно чист, но логика будет работать.ОбработкаПолученияФормы это нехарактерно (оно жестко привязано к менеджеру), стоит убедиться, что вы смотрите модуль именно того справочника, который указан в первом параметре ОткрытьФорму.Посмотрим на пример работы подсистемы «Работа с файлами». Для справочников присоединенных файлов БСП использует общую логику. Когда вызывается РаботаСФайламиКлиентСервер.ОпределитьФормуПрисоединенногоФайла(), система выполняет следующие действия:
ВыбраннаяФорма.СтандартнаяОбработка = Ложь.Таким образом, даже если у вашего справочника ПредписаниеПрисоединенныеФайлы нет ни одной своей формы, он успешно открывается, используя формы из состава БСП или динамически генерируемые платформой окна.
Проанализируем ситуацию с отладкой. Если стек вызовов кажется неочевидным, выполните следующие шаги:
ОткрытьФорму.ОткрытьФорму. Если между ними есть пробелы, значит, произошел неявный вызов через механизм событий платформы.Помните, что 1С — это событийно-ориентированная среда. Любое стандартное действие (открытие формы, запись объекта, получение данных) может быть перехвачено и перенаправлено. Понимание работы модуля менеджера и события ОбработкаПолученияФормы — ключ к разгадке «магических» переходов в коде типовых конфигураций.