При работе с конфигурациями, построенными на базе Библиотеки стандартных подсистем (БСП), программисты часто сталкиваются со специфическими ошибками инициализации механизмов. Одной из таких проблем является исключение вида: {ОбщийМодуль.СтандартныеПодсистемыПовтИсп.Модуль(610)}: Не найдено серверное служебное событие "СтандартныеПодсистемы.ОбменДанными\ПриЗагрузкеДанныхСлужебный". Эта ошибка блокирует процессы обмена данными и на первый взгляд кажется необъяснимой, так как нужные процедуры могут физически присутствовать в модулях.
В этой статье мы подробно разберем, как устроена регистрация событий в БСП, почему система «перестает видеть» стандартные обработчики и какие шаги необходимо предпринять для восстановления работоспособности обмена.
Для начала проанализируем ситуацию: в БСП реализована сложная многоуровневая система вызова обработчиков. В отличие от обычных процедур, которые вызываются напрямую, служебные события требуют предварительной регистрации в специальном внутреннем реестре (кэше). Этот кэш формируется при первом запуске системы или после обновления конфигурации.
Система работает по следующему алгоритму:
ПриДобавленииСлужебныхСобытий в модуле СтандартныеПодсистемыСервер.ОбщегоНазначения.ПодсистемаСуществует.СтандартныеПодсистемыПовтИсп.Если на каком-то этапе этот алгоритм дает сбой, мы получаем ошибку об отсутствии события, даже если код физически написан в модуле ОбменДаннымиСервер.
Рассмотрим подробнее случай, описанный в практике. Основная причина часто кроется в настройках дерева метаданных. В модуле СтандартныеПодсистемыСервер существует условие:
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда
МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер");
МодульОбменДаннымиСервер.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия);
КонецЕсли;
Проанализируем работу функции ПодсистемаСуществует. В некоторых версиях платформы и БСП результат этой функции напрямую зависит от настройки флажка «Включать в командный интерфейс» в свойствах подсистемы. Если этот флаг снят у основной подсистемы ОбменДанными или её родителя, механизм инициализации может ошибочно посчитать, что подсистема в данной конфигурации не используется. Как следствие, вызов ПриДобавленииСлужебныхСобытий для обмена данными просто игнорируется, и событие ПриЗагрузкеДанныхСлужебный не попадает в реестр.
Первым делом нам необходимо убедиться, что структура подсистем в конфигураторе соответствует ожиданиям БСП. Выполним следующие действия:
СтандартныеПодсистемы и найдем ОбменДанными.Если правка метаданных не помогла или флаг и так был установлен, причина может заключаться в устаревшем кэше в модуле СтандартныеПодсистемыПовтИсп. Система «запомнила» состояние до исправлений и не хочет его обновлять. Рассмотрим, как принудительно заставить 1С пересчитать реестр событий.
Вариант А: Параметр запуска
Запустим информационную базу (тонкий или толстый клиент) с параметром командной строки: /C СтартОбновленияИнформационнойБазы. Это инициирует выполнение всех процедур обновления БСП, включая пересчет служебных событий и параметров работы программы.
Вариант Б: Вызов метода программно
Воспользуемся внешней обработкой или консолью кода, чтобы вызвать метод обновления параметров напрямую без перезапуска всей базы. Пропишем следующий код:
СтандартныеПодсистемыСервер.УстановитьПараметрыРаботыПрограммы();
ОбщегоНазначения.СообщитьПользователю("Параметры работы программы успешно обновлены!");
Этот метод принудительно сбросит кэш и заново просканирует доступные события во всех подсистемах.
Если вышеуказанные действия не принесли результата, проанализируем ситуацию с помощью отладчика. Поставим точку останова в общем модуле СтандартныеПодсистемыПовтИсп на строке 610 (или там, где вызывается ВызватьИсключение в функции получения описания событий).
Посмотрим на содержимое переменной, в которой хранится список серверных событий. Если нашего события там нет, поднимемся выше по стеку вызовов к моменту формирования этого списка. Нам нужно попасть в СтандартныеПодсистемыСервер.ПриДобавленииСлужебныхСобытий. Проверим:
Если ОбщегоНазначения.ПодсистемаСуществует(...).ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер").ПриДобавленииСлужебныхСобытий модуля обмена данными какой-либо ошибки, которая прерывает регистрацию.В ситуациях, когда вы самостоятельно расширяете функционал обмена данными или используете расширения конфигурации, обратите внимание на следующие моменты:
"СтандартныеПодсистемы.ОбменДанными\ПриЗагрузкеДанныхСлужебный" должна совпадать до символа (включая регистр и слеши) как в месте вызова, так и в месте регистрации.ОбменДаннымиСервер), убедитесь, что вы также обновили модуль СтандартныеПодсистемыСервер. Регистрация и вызов должны соответствовать одной версии библиотеки.snccntry в папке службы сервера 1С) и перезапуск службы 1C:Enterprise Server, чтобы изменения в метаданных и кэшируемых модулях вступили в силу.Подводя итог, отметим, что проблема «невидимого события» в 90% случаев связана с тем, что механизм самодиагностики БСП исключает подсистему из процесса регистрации из-за настроек интерфейса или устаревших данных в кэше повторного использования. Своевременное обновление параметров работы программы — главный ключ к решению этой задачи.