Какие настройки и флаги должны быть у общего модуля для корректного вызова из модуля менеджера?

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

При разработке в среде 1С:Предприятие 8 часто возникает ситуация, когда метод общего модуля, успешно вызываемый из серверного контекста, внезапно становится «невидимым» при запуске в режиме толстого клиента. Это особенно актуально для кода в модулях менеджера объектов (справочников, документов), так как их контекст исполнения сложнее, чем кажется на первый взгляд. В этой статье мы подробно разберем, какие «галки» (свойства) должны быть установлены у общего модуля, как правильно использовать инструкции препроцессора и почему флаг Вызов сервера не всегда является решением проблемы.

Разберем контекст исполнения модуля менеджера

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

  1. В тонком клиенте: Код модуля менеджера всегда выполняется на стороне сервера. Здесь достаточно флага Сервер у общего модуля.
  2. В толстом клиенте (управляемое приложение): Модуль менеджера может исполняться как на сервере, так и на клиенте, в зависимости от того, откуда был вызван метод.
  3. В толстом клиенте (обычное приложение): Код часто выполняется на стороне клиента, особенно если вызываются методы печати или формирования форм.

Если наш общий модуль имеет только флаг Сервер, а толстый клиент пытается обратиться к нему из «своего» (клиентского) контекста, система выдаст ошибку: «Переменная не определена (ИмяОбщегоМодуля)». Для системы этого модуля просто не существует в данной области памяти.

Шаг 1: Настройка видимости для толстого клиента

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

Многие разработчики не видят нужного флага в свойствах модуля. Чтобы он появился, выполним следующие действия:

  1. Откроем Конфигуратор и перейдем в меню Сервис — Параметры.
  2. На вкладке Общие найдем раздел Редактирование конфигурации для режимов запуска.
  3. Установим флаг Управляемое приложение и обычное приложение.

После этого в свойствах общего модуля появится заветная галка Клиент (обычное приложение). Установив её, мы сделаем модуль «видимым» для толстого клиента. Однако здесь кроется ловушка: если в модуле есть запросы или обращения к серверным типам данных, модуль не скомпилируется и выдаст ошибки.

Шаг 2: Использование инструкций препроцессора

Выясним причину, по которой просто поставить «галку» недостаточно. Общий модуль, доступный на клиенте, не должен содержать код, который физически не может там работать (например, Новый Запрос). Чтобы решить эту проблему, мы воспользуемся механизмом препроцессора.

Рассмотрим пример правильного оформления модуля, который должен вызываться из модуля менеджера и при этом содержать серверную логику:


#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

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

#КонецЕсли

Такой подход позволяет модулю успешно пройти синтаксическую проверку и компиляцию в контексте толстого клиента, так как «опасный» код будет просто проигнорирован при компиляции клиентской части, но останется доступным там, где это необходимо.

Шаг 3: Роль флага «Вызов сервера»

Часто возникает путаница с флагом Вызов сервера. Разберем подробнее, зачем он нужен. Этот флаг позволяет обращаться к методам серверного общего модуля напрямую из клиентских модулей (например, из модуля формы управляемого приложения).

Важные моменты:

Рекомендуемая архитектура (по стандартам БСП)

Проанализируем наиболее правильный путь, который рекомендует фирма «1С» для обеспечения максимальной универсальности кода. Вместо того чтобы пытаться «впихнуть» всё в один модуль, разработаем систему из двух модулей:

  1. ОбщийМодульИмяСервер:
    • Флаги: Сервер, Внешнее соединение.
    • Предназначение: Тяжелые операции, работа с БД, запросы.
  2. ОбщийМодульИмяКлиентСервер:
    • Флаги: Сервер, Клиент (управляемое приложение), Клиент (обычное приложение), Внешнее соединение.
    • Предназначение: Простейшие вычисления, проверки, форматирование строк. В этом модуле запрещены запросы.

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

Резюме настроек

Посмотрим на финальный чек-лист настроек для общего модуля, вызываемого из менеджера:

  1. Сервер: Обязательно (основной контекст 1С).
  2. Внешнее соединение: Обязательно (чтобы методы модуля менеджера работали при интеграции через COM/Automation).
  3. Клиент (обычное приложение): Устанавливаем, если планируется работа в толстом клиенте или со старыми отчетами. Не забываем обернуть код в #Если Сервер....
  4. Вызов сервера: Включаем только в том случае, если этот же модуль планируется вызывать напрямую из форм (Тонкий клиент -> Сервер).

Использование этих правил позволит вам избежать ошибок «Модуль не обнаружен» и создаст надежную базу для работы конфигурации в любых режимах запуска.

← На главную