Как определить, является ли база распределенной, при старте системы в расширении?

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

При разработке расширений для 1С:Предприятие 8 часто возникает необходимость выполнить проверку параметров системы, например, определить, является ли текущая база узлом распределенной информационной базы (РИБ). Часто такая проверка требуется именно в процедуре ПриНачалеРаботыСистемы. Однако разработчики сталкиваются с рядом ограничений: невозможностью прямого использования некоторых серверных методов или ошибками при попытке создать глобальные модули внутри расширений.

Разбираемся в ограничениях расширений

Основная проблема, с которой сталкиваются разработчики — это попытка реализации серверного кода через Глобальные модули. В среде расширений 1С действуют строгие правила безопасности и изоляции, поэтому создание глобальных модулей внутри расширения недопустимо. Ошибки при проверке метаданных конфигурации, которые вы видите в окне сообщений, возникают именно из-за попытки назначить модулю свойство «Глобальный».

Важно понимать, что для выполнения серверного вызова из расширения вовсе не обязательно делать модуль глобальным. Достаточно создать обычный Общий модуль, установить для него флаг Вызов сервера и убедиться, что он доступен для использования в расширении.

Пошаговое решение задачи

Давайте рассмотрим, как правильно организовать серверный вызов при старте системы с помощью расширения:

  1. Создайте в расширении новый Общий модуль. Назовите его, например, Расш1_СерверныеВызовы.
  2. В свойствах этого модуля обязательно установите флаг Вызов сервера. Устанавливать флаг Глобальный — не нужно.
  3. В созданном модуле разместите функцию для проверки узла РИБ.

Пример кода общего модуля для проверки:


Функция ЭтоГлавныйУзел() Экспорт
    Возврат ЗначениеЗаполнено(ПланыОбмена.ГлавныйУзел());
КонецФункции

Теперь необходимо обратиться к этому методу из процедуры ПередНачаломРаботыСистемы (или аналогичной), перехватив её через расширение:


&После("ПередНачаломРаботыСистемы")
Процедура Расш1_ПередНачаломРаботыСистемы()
    Если Расш1_СерверныеВызовы.ЭтоГлавныйУзел() Тогда
        Сообщить("Система определила: это главный узел РИБ");
    Иначе
        Сообщить("Система определила: это подчиненный узел или автономная база");
    КонецЕсли;
КонецПроцедуры

Почему это работает

Использование метода ПланыОбмена.ГлавныйУзел() внутри функции, помеченной как Вызов сервера, позволяет платформе выполнить код на стороне сервера 1С:Предприятия, где доступна вся информация о структуре метаданных. При этом процедура ПередНачаломРаботыСистемы на клиенте успешно инициирует этот вызов, так как Общие модули с флагом Вызов сервера доступны для вызова из любого контекста, включая клиентский.

Если вы ранее пытались следовать старым рекомендациям (особенно тем, что касаются платформы 7.7) и создавали глобальные модули, обязательно удалите этот признак. В 1С:Предприятии 8.3 разделение модулей по типам носит строгий архитектурный характер, и штатные механизмы позволяют решать любые задачи без использования глобальных серверных модулей внутри расширений.

Рекомендации по оптимизации

Поскольку процедура ПриНачалеРаботыСистемы выполняется при каждом запуске программы, старайтесь не перегружать её тяжелыми запросами. Если результат проверки (является ли база РИБ) не меняется в процессе работы, вы можете один раз получить его при старте и сохранить в переменной модуля или использовать Параметры сеанса. Это позволит в дальнейшем обращаться к данным мгновенно, не совершая повторных серверных вызовов.

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

← На главную