При работе с типовыми конфигурациями на платформе 1С:Предприятие 8.3 (такими как ERP, КА 2, УТ 11 или ЗУП 3) разработчики часто сталкиваются с ситуацией, когда в модуле формы отчета присутствует процедура, например, Подключаемый_ПроверитьАктуальность(), но глобальный поиск по всей конфигурации не выдает ни одного места, где бы эта процедура вызывалась явным образом. Давайте разберем, как устроена эта «магия» Библиотеки стандартных подсистем (БСП) и почему стандартные методы поиска здесь бессильны.
Проанализируем стандартную ситуацию. Вы открываете форму «Оборотно-сальдовой ведомости по счету» и видите в коде обработчик. Однако попытка найти контекстный вызов этой процедуры через Ctrl+F12 или глобальный поиск не дает результата. Выясним причину этого явления. Дело в том, что в типовых решениях используется механизм динамического подключения обработчиков.
В БСП принят стандарт кодирования, согласно которому процедуры, предназначенные для программного подключения, помечаются префиксом Подключаемый_. Это служит сигналом для других разработчиков и для самой системы, что данная процедура не будет вызываться напрямую кодом в теле модуля, а будет «привязана» к событию или обработчику ожидания во время выполнения программы.
Рассмотрим по шагам, как происходит регистрация таких процедур. В типовых отчетах ERP в модуле формы в событии ПриСозданииНаСервере обязательно присутствует вызов общего модуля подсистемы «Варианты отчетов»:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Инициализация механизмов БСП для отчетов
ВариантыОтчетов.ПриСозданииНаСервере(ЭтаФорма, Параметры);
КонецПроцедуры
Когда управление передается в общий модуль ВариантыОтчетов, система анализирует состав формы и её реквизиты. Если отчет использует стандартные механизмы формирования (например, фоновое выполнение), БСП «знает», что в форме могут присутствовать определенные стандартные обработчики. Именно здесь кроется ответ: имя процедуры Подключаемый_ПроверитьАктуальность часто формируется динамически путем сложения строк или выбирается из предопределенного списка имен.
Проанализируем, как именно инициируется выполнение кода. Одной из самых частых причин вызова Подключаемый_ПроверитьАктуальность является необходимость отслеживания состояния отчета. Рассмотрим, как это работает на стороне клиента.
В общем модуле ОтчетыКлиент или ВариантыОтчетовКлиент существует вызов встроенной функции платформы ПодключитьОбработчикОжидания. Программный код выглядит примерно так:
// В недрах БСП имя процедуры собирается как строковая переменная
ИмяПроцедуры = "Подключаемый_ПроверитьАктуальность";
ПодключитьОбработчикОжидания(ИмяПроцедуры, ИнтервалПроверки, Истина);
Поскольку имя передается как строка, глобальный поиск по ссылкам не может сопоставить эту строку с объявлением процедуры в модуле формы. Платформа 1С в данном случае ищет процедуру с указанным именем именно в модуле той формы, из которой (или для которой) был запущен обработчик ожидания.
Разберем функциональное назначение этой конкретной процедуры. В современных версиях ERP отчеты часто формируются в фоновом режиме, чтобы не блокировать интерфейс пользователя. Процедура Подключаемый_ПроверитьАктуальность() выполняет следующие задачи:
Важно понимать, что использование префикса Подключаемый_ — это не просто прихоть разработчиков, а следование стандартам разработки 1С. Посмотрим на другие примеры аналогичных процедур:
Подключаемый_ВыполнитьКоманду — используется для динамических команд, добавляемых на форму программно.Подключаемый_ОбновитьСостояние — для периодического обновления элементов интерфейса.Подключаемый_ПриИзмененииРеквизита — когда обработчики событий элементов формы назначаются через метод УстановитьДействие.Рассмотрим пример того, как программно назначается действие элементу формы в общем модуле, что также скрывает вызов от поиска:
// Пример программного назначения обработчика события
НовыйЭлемент = Форма.Элементы.Добавить("ПолеВвода", Тип("ПолеФормы"));
НовыйЭлемент.УстановитьДействие("ПриИзменении", "Подключаемый_ПриИзмененииРеквизита");
В этом случае, как и с обработчиками ожидания, связь между элементом управления и кодом устанавливается в момент выполнения приложения (Runtime), а не в конфигураторе.
Если вам все же нужно точно определить, какой именно общий модуль инициирует вызов, рекомендуем следующий алгоритм действий:
Подключаемый_ПроверитьАктуальность. Когда выполнение прервется, посмотрите на Стек вызовов (Call Stack). Однако помните: если процедура вызвана платформой через обработчик ожидания, стек может быть пустым или начинаться сразу с этой процедуры.Процедура Подключаемый_ПроверитьАктуальность попробуйте поискать просто текст "ПроверитьАктуальность" (в кавычках) по всей конфигурации. Велика вероятность найти место в общем модуле, где эта строка конструируется.Таким образом, мы выяснили, что процедуры с префиксом Подключаемый_ являются частью гибкой архитектуры БСП. Они позволяют создавать универсальные механизмы работы с формами, где логика управления вынесена в общие модули, а конкретная реализация остается в модуле формы для соблюдения контекста выполнения.