К статье
Практический материал

Разработка и Конфигурация · 11 мин

Что означает вызов сервера в общем модуле 1С

Что означает свойство «Вызов сервера» в общем модуле 1С, как оно влияет на выполнение кода, производительность и безопасность. Настройка, ошибки, примеры.

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

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

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

Что такое общий модуль и где выполняется его код

Общие модули находятся в ветке «Общие» дерева конфигурации. В отличие от модулей форм, документов или справочников, они не привязаны к конкретному объекту и содержат универсальную логику: расчёты, проверки, работу с данными, вспомогательные функции.

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

  • Сервер — код компилируется и выполняется на сервере 1С:Предприятия;
  • Клиент (обычное приложение) — код доступен в толстом клиенте;
  • Клиент (управляемое приложение) — код доступен в тонком и веб-клиенте;
  • Вызов сервера — разрешает обращение к серверному модулю из клиентского кода;
  • Привилегированный режим — код выполняется без проверки прав доступа.

Один и тот же модуль может компилироваться в нескольких контекстах одновременно. Например, модуль с флагами «Сервер» и «Клиент (управляемое приложение)» будет содержать код, доступный в обоих местах, но с ограничениями: в клиентском контексте нельзя использовать серверные объекты вроде запросов к базе данных напрямую.

Что именно делает свойство «Вызов сервера»

Когда у серверного общего модуля установлен флаг «Вызов сервера», платформа формирует для него программный интерфейс, доступный клиенту. Разработчик в клиентской процедуре пишет обычный вызов вида ИмяМодуля.ИмяФункции(Параметры), а платформа сама организует передачу вызова на сервер, выполнение кода и возврат результата.

Если флаг снят, модуль остаётся «внутренним»: его могут использовать другие серверные модули, серверные процедуры форм, но не клиентский код. Попытка вызова с клиента в этом случае приведёт к ошибке вида «Процедура или функция с указанным именем не определена» или ошибке компиляции модуля.

Важно понимать: флаг «Вызов сервера» не переносит выполнение кода на клиента. Код по-прежнему исполняется на сервере, со всеми серверными возможностями — запросами к базе, транзакциями, обращениями к прикладным объектам. Меняется только видимость модуля для вызывающей стороны.

bsl
&НаКлиенте
Процедура РассчитатьНажатие(Команда)
	Результат = РасчетыСервер.ВыполнитьРасчет(ПараметрыРасчета);
	ПоказатьПредупреждение(, "Итог: " + Результат);
КонецПроцедуры

Когда нужно включать вызов сервера

Флаг устанавливают, когда клиентской логике требуется результат серверной операции. Типичные сценарии:

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

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

Маршрут решения

Как выбрать действие

Клиентскому коду нужен результат серверной операцииВключите «Вызов сервера» и оставьте модуль серверным
Модуль вызывается только из серверного кодаОставьте флаг снятым — это безопаснее
Код должен работать и на клиенте, и на сервереИспользуйте модуль с флагами клиентских контекстов, а не «Вызов сервера»
Операция массовая и вызывается в циклеПересмотрите архитектуру: перенесите цикл целиком на сервер

Как включить и проверить свойство

Настройка выполняется в конфигураторе. Откройте дерево конфигурации, найдите ветку «Общие» → «Общие модули», выделите нужный модуль и откройте палитру свойств (правый клик → «Свойства» или комбинация Alt+Enter). Установите флаги «Сервер» и «Вызов сервера».

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

Порядок действий
  1. 1
    Откройте конфигуратор и найдите общий модуль в ветке «Общие → Общие модули»
  2. 2
    Откройте палитру свойств модуля (Alt+Enter)
  3. 3
    Установите флаги «Сервер» и «Вызов сервера»
  4. 4
    Убедитесь, что нужные процедуры и функции объявлены с ключевым словом Экспорт
  5. 5
    Обновите конфигурацию базы данных (F7)
  6. 6
    Вызовите функцию из клиентского кода и проверьте результат

Влияние на производительность и типичные ошибки

Каждый вызов серверного модуля из клиентского кода — это сетевой обмен: сериализация параметров, передача на сервер, выполнение, сериализация результата и обратная передача. В локальной сети задержка невелика, но при работе через интернет или при массовых вызовах в цикле она становится критичной.

Классическая ошибка — вызов серверной функции внутри клиентского цикла обхода строк таблицы. Сто строк — сто отдельных обращений к серверу. Правильное решение: передать всю таблицу (или массив идентификаторов) одним вызовом и выполнить обработку целиком на сервере.

Ещё одна группа ошибок связана с передаваемыми параметрами. Через границу «клиент–сервер» можно передавать только сериализуемые значения: примитивные типы, структуры, массивы, ссылки, таблицы значений. Попытка передать, например, объект типа «Запрос» или несериализуемое значение приведёт к ошибке.

Типичные ошибки
01
Вызов серверного модуля в клиентском цикле — каждая итерация порождает отдельный сетевой запрос, форма «зависает»
02
Забытое ключевое слово Экспорт — функция не видна извне, разработчик ищет ошибку в флагах модуля
03
Передача несериализуемых типов (Запрос, СхемаКомпоновкиДанных) — ошибка выполнения на границе контекстов
04
Включение «Вызов сервера» у привилегированного модуля без необходимости — клиент получает косвенный способ выполнять операции без проверки прав
05
Ожидание, что флаг перенесёт выполнение на клиент — код по-прежнему работает на сервере, только видимость меняется

Безопасность и привилегированный режим

Особое внимание требуется, когда у модуля одновременно установлены «Вызов сервера» и «Привилегированный режим». В привилегированном режиме код выполняется без проверки прав доступа к объектам базы. Если такой модуль доступен с клиента, пользователь с минимальными правами потенциально может инициировать операции, на которые напрямую прав не имеет.

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

Проверка результата после настройки

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

Контрольные точки

Как проверить результат

Вызов функции из клиентской процедуры
Норма

Функция выполняется, результат возвращается

Тревожный признак

Ошибка «процедура или функция не определена» — проверьте флаг и Экспорт

Время отклика формы при вызове
Норма

Задержка незаметна для пользователя

Тревожный признак

Форма подвисает — вероятно, вызовы идут в цикле

Журнал регистрации
Норма

Нет ошибок доступа и выполнения

Тревожный признак

Ошибки прав — модуль обращается к данным, недоступным пользователю

Поведение под пользователем с ограниченными правами
Норма

Операции выполняются в рамках его полномочий

Тревожный признак

Пользователь получает данные, к которым не должен иметь доступ

FAQ: частые вопросы о вызове сервера в 1С

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

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

Чем «Вызов сервера» отличается от директивы &НаСервере в модуле формы?

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

Почему функция видна на сервере, но не видна с клиента?

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

Замедляет ли работу каждый вызов сервера?

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

Нужен ли «Вызов сервера» для модулей, используемых в фоновых заданиях?

Нет. Фоновые задания выполняются на сервере, поэтому их код обращается к серверным модулям напрямую, без дополнительных флагов. «Вызов сервера» нужен исключительно для обращения из клиентского контекста.

Можно ли передавать таблицу значений между клиентом и сервером?

Да, таблица значений сериализуется и может передаваться в обе стороны как параметр или результат функции. Однако в управляемых формах для отображения данных чаще используют коллекции формы (ДанныеФормыТаблица), а таблицу значений передают только для промежуточной обработки. Учитывайте, что большие таблицы увеличивают объём сетевого трафика — передавайте только необходимые данные.

Итог

Что важно запомнить

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