При разработке на платформе 1С:Предприятие 8.3 одной из приоритетных задач является сохранение типовой конфигурации на поддержке. Это значительно упрощает процесс последующих обновлений. Использование расширений — основной инструмент для достижения этой цели. Однако у начинающих разработчиков часто возникают вопросы о том, как работать с глобальными модулями, такими как модуль управляемого приложения, и как организовать взаимодействие между клиентом и сервером внутри самого расширения. В этой статье мы подробно разберем, как добавить стандартную процедуру модуля приложения в расширение и внедрить в нее свой серверный код.
Рассмотрим ситуацию, когда нам необходимо выполнить определенные действия при запуске системы, например, проверить наличие определенных прав или инициализировать персональные настройки пользователя. Для этого в типовой конфигурации используется процедура ПриНачалеРаботыСистемы модуля управляемого приложения. Чтобы не вносить изменения непосредственно в корень конфигурации, проделаем следующие шаги.
Во-первых, нам необходимо открыть модуль управляемого приложения основной конфигурации. Найдем нужную нам процедуру ПриНачалеРаботыСистемы. Если вы не видите пункта «Добавить в расширение» в дереве метаданных для модуля приложения, не стоит делать вывод, что это невозможно. Разберем правильный алгоритм:
ПриНачалеРаботыСистемы).После этого платформа предложит выбрать тип перехвата (аннотацию). Проанализируем, какой вариант выбрать в зависимости от ваших задач.
Выбор аннотации определяет порядок выполнения вашего кода относительно типового:
&Before) — ваш код выполнится до того, как сработает стандартный алгоритм. Это полезно для предварительных проверок.&After) — наиболее часто используемый вариант. Позволяет выполнить дополнительные действия после того, как система отработала штатно.&Instead) — полностью замещает типовой код. Используйте этот вариант с осторожностью.Важный совет: если вы используете аннотацию &Вместо, крайне рекомендуется вызывать метод ПродолжитьВызов(). Это позволит сохранить логику типового решения и обеспечит совместимость с другими расширениями, которые также могут использовать эту процедуру. Пример выглядит так:
&Вместо("ПриНачалеРаботыСистемы")
Процедура Расш1_ПриНачалеРаботыСистемы()
// Свой код до выполнения типовой логики
ПродолжитьВызов(); // Вызов основной процедуры
// Свой код после выполнения типовой логики
КонецПроцедуры
Поскольку модуль управляемого приложения является клиентским, в нем нельзя напрямую описывать серверные процедуры. Если ваша задача требует обращения к базе данных или выполнения сложных вычислений на сервере, нам нужно создать вспомогательный объект внутри расширения. Разберем, как это сделать правильно.
Выясним причину, по которой нельзя просто создать процедуру с директивой &НаСервере в модуле приложения расширения: платформа жестко разделяет контексты выполнения. Поэтому мы пойдем по пути создания общего модуля в расширении.
Расш_ОбщийМодульСервер).Экспорт.Пример кода в серверном модуле расширения:
Процедура ВыполнитьМоюПроверкуНаСервере() Экспорт
// Здесь располагается логика, работающая с данными
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 Ссылка ИЗ Справочник.Пользователи";
// ... выполнение запроса
КонецПроцедуры
Теперь мы можем вызвать этот код из расширенной процедуры ПриНачалеРаботыСистемы, которую мы добавили ранее:
&После("ПриНачалеРаботыСистемы")
Процедура Расш1_ПриНачалеРаботыСистемы()
// Вызываем серверный метод нашего общего модуля из расширения
Расш_ОбщийМодульСервер.ВыполнитьМоюПроверкуНаСервере();
КонецПроцедуры
Проанализируем ситуацию, когда код в расширении вроде бы написан верно, но при запуске возникают ошибки прав доступа. Часто это связано с тем, что расширения по умолчанию подключаются в безопасном режиме.
Если ваше расширение должно выполнять операции, требующие полных прав или обращения к внешним ресурсам (файловая система, COM-объекты), необходимо зайти в свойства расширения (в конфигураторе или в пользовательском режиме через «Управление расширениями») и снять галочку «Безопасный режим». Если этого не сделать, вызов серверных процедур может быть заблокирован системой безопасности платформы.
Рассмотрим альтернативный, более «продвинутый» способ, который часто применяется в типовых конфигурациях, построенных на Библиотеке стандартных подсистем (БСП). Вместо того чтобы напрямую расширять ПриНачалеРаботыСистемы, можно использовать механизм переопределяемых модулей.
В БСП существуют специальные точки входа, например, в модуле СтандартныеПодсистемыКлиентПереопределяемый. Однако использование расширения напрямую для модуля приложения, как мы разобрали выше, является более универсальным методом, который работает даже в самописных конфигурациях без БСП.
При работе с кодом в расширении модуля приложения помните о следующих моментах:
Таким образом, мы убедились, что расширение модуля управляемого приложения — это штатная и эффективная процедура. Правильное использование аннотаций и создание серверных общих модулей с флагом Вызов сервера позволяет реализовать практически любую бизнес-логику, сохраняя основную конфигурацию в чистоте и упрощая поддержку системы.