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

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

При разработке на платформе 1С:Предприятие 8.3 одной из приоритетных задач является сохранение типовой конфигурации на поддержке. Это значительно упрощает процесс последующих обновлений. Использование расширений — основной инструмент для достижения этой цели. Однако у начинающих разработчиков часто возникают вопросы о том, как работать с глобальными модулями, такими как модуль управляемого приложения, и как организовать взаимодействие между клиентом и сервером внутри самого расширения. В этой статье мы подробно разберем, как добавить стандартную процедуру модуля приложения в расширение и внедрить в нее свой серверный код.

Добавление процедуры модуля приложения в расширение

Рассмотрим ситуацию, когда нам необходимо выполнить определенные действия при запуске системы, например, проверить наличие определенных прав или инициализировать персональные настройки пользователя. Для этого в типовой конфигурации используется процедура ПриНачалеРаботыСистемы модуля управляемого приложения. Чтобы не вносить изменения непосредственно в корень конфигурации, проделаем следующие шаги.

Во-первых, нам необходимо открыть модуль управляемого приложения основной конфигурации. Найдем нужную нам процедуру ПриНачалеРаботыСистемы. Если вы не видите пункта «Добавить в расширение» в дереве метаданных для модуля приложения, не стоит делать вывод, что это невозможно. Разберем правильный алгоритм:

  1. Откройте текст модуля управляемого приложения.
  2. Найдите имя нужной процедуры (например, ПриНачалеРаботыСистемы).
  3. Нажмите на название процедуры правой кнопкой мыши.
  4. В появившемся контекстном меню выберите пункт «Добавить в расширение».

После этого платформа предложит выбрать тип перехвата (аннотацию). Проанализируем, какой вариант выбрать в зависимости от ваших задач.

Выбор аннотации: &Перед, &После или &Вместо

Выбор аннотации определяет порядок выполнения вашего кода относительно типового:

Важный совет: если вы используете аннотацию &Вместо, крайне рекомендуется вызывать метод ПродолжитьВызов(). Это позволит сохранить логику типового решения и обеспечит совместимость с другими расширениями, которые также могут использовать эту процедуру. Пример выглядит так:


&Вместо("ПриНачалеРаботыСистемы")
Процедура Расш1_ПриНачалеРаботыСистемы()
    // Свой код до выполнения типовой логики
    
    ПродолжитьВызов(); // Вызов основной процедуры
    
    // Свой код после выполнения типовой логики
КонецПроцедуры

Организация вызова серверного кода из расширения

Поскольку модуль управляемого приложения является клиентским, в нем нельзя напрямую описывать серверные процедуры. Если ваша задача требует обращения к базе данных или выполнения сложных вычислений на сервере, нам нужно создать вспомогательный объект внутри расширения. Разберем, как это сделать правильно.

Выясним причину, по которой нельзя просто создать процедуру с директивой &НаСервере в модуле приложения расширения: платформа жестко разделяет контексты выполнения. Поэтому мы пойдем по пути создания общего модуля в расширении.

  1. В окне расширения перейдите в ветку «Общие модули» и создайте новый модуль (например, Расш_ОбщийМодульСервер).
  2. В свойствах этого модуля обязательно установите флаги «Сервер» и «Вызов сервера». Флаг «Вызов сервера» критически важен, так как именно он позволяет вызвать процедуру модуля с клиента.
  3. Внутри этого модуля напишите вашу процедуру с ключевым словом Экспорт.

Пример кода в серверном модуле расширения:


Процедура ВыполнитьМоюПроверкуНаСервере() Экспорт
    // Здесь располагается логика, работающая с данными
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 Ссылка ИЗ Справочник.Пользователи";
    // ... выполнение запроса
КонецПроцедуры

Теперь мы можем вызвать этот код из расширенной процедуры ПриНачалеРаботыСистемы, которую мы добавили ранее:


&После("ПриНачалеРаботыСистемы")
Процедура Расш1_ПриНачалеРаботыСистемы()
    // Вызываем серверный метод нашего общего модуля из расширения
    Расш_ОбщийМодульСервер.ВыполнитьМоюПроверкуНаСервере();
КонецПроцедуры

Безопасный режим и ограничения расширений

Проанализируем ситуацию, когда код в расширении вроде бы написан верно, но при запуске возникают ошибки прав доступа. Часто это связано с тем, что расширения по умолчанию подключаются в безопасном режиме.

Если ваше расширение должно выполнять операции, требующие полных прав или обращения к внешним ресурсам (файловая система, COM-объекты), необходимо зайти в свойства расширения (в конфигураторе или в пользовательском режиме через «Управление расширениями») и снять галочку «Безопасный режим». Если этого не сделать, вызов серверных процедур может быть заблокирован системой безопасности платформы.

Использование возможностей БСП для расширения логики

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

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

Рекомендации по отладке и стабильности

При работе с кодом в расширении модуля приложения помните о следующих моментах:

Таким образом, мы убедились, что расширение модуля управляемого приложения — это штатная и эффективная процедура. Правильное использование аннотаций и создание серверных общих модулей с флагом Вызов сервера позволяет реализовать практически любую бизнес-логику, сохраняя основную конфигурацию в чистоте и упрощая поддержку системы.

← На главную