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