Разработка и Конфигурация · 11 мин
Вызов сервера в общем модуле 1С: что это значит и как настроить
Что означает свойство «Вызов сервера» в общем модуле 1С, как оно работает, когда его включать и какие ошибки возникают при неправильной настройке.
При создании общего модуля в конфигураторе 1С разработчик обязательно сталкивается с набором флажков в палитре свойств: «Сервер», «Клиент (управляемое приложение)», «Клиент (обычное приложение)», «Внешнее соединение» и загадочный «Вызов сервера». Именно последний чаще всего вызывает вопросы: он не описывает контекст компиляции модуля, а управляет тем, откуда этот модуль можно вызывать.
Свойство «Вызов сервера» определяет, разрешено ли обращаться к экспортным процедурам и функциям серверного общего модуля с клиента. Если флажок снят, модуль компилируется только на сервере, и попытка вызвать его метод из клиентского кода приведёт к ошибке «Процедура или функция с указанным именем не определена». Если флажок установлен, клиентский код может вызвать серверную процедуру напрямую — платформа сама выполнит серверный вызов.
Понимание этого свойства критично для построения правильной клиент-серверной архитектуры. От него зависят безопасность прикладного решения, количество серверных вызовов в коде и даже производительность тонкого клиента при работе через медленные каналы связи.
Как устроены контексты выполнения в 1С
Прикладной код в 1С исполняется в разных контекстах: на клиенте (тонкий, толстый, веб-клиент) и на сервере. Общие модули — это контейнеры процедур и функций, доступных глобально, и флажки в свойствах модуля определяют, в каких контекстах он будет скомпилирован.
Модуль с установленным флажком «Сервер» компилируется на сервере приложений. Модуль с флажком «Клиент (управляемое приложение)» — на клиенте управляемого приложения. Один и тот же модуль может иметь несколько флажков, и тогда его код компилируется в нескольких контекстах, что требует аккуратности: клиентский контекст не знает о существовании запросов, менеджеров объектов и других серверных механизмов.
Флажок «Вызов сервера» стоит особняком: он не добавляет новый контекст компиляции. Он лишь открывает «дверь» для клиентского кода, позволяя вызывать серверные экспортные методы. Сам модуль при этом должен иметь установленный флажок «Сервер» — иначе свойство «Вызов сервера» просто недоступно.
Что происходит при вызове серверного модуля с клиента
Когда клиентский код обращается к методу серверного общего модуля с включённым «Вызов сервера», платформа выполняет полноценный серверный вызов: сериализует параметры, передаёт их на сервер, выполняет процедуру в серверном контексте и возвращает результат обратно на клиент. Для разработчика это выглядит как обычный вызов функции, но «под капотом» происходит сетевое взаимодействие.
Из этого следуют важные ограничения. Параметры и возвращаемые значения должны быть сериализуемыми — то есть их можно передать между клиентом и сервером. Нельзя передать, например, объект типа «Запрос» или «СправочникОбъект» в открытом виде: такие типы существуют только на сервере. Обычно передают примитивные типы, структуры, массивы, ссылки на объекты базы данных.
Каждый такой вызов — это обращение к серверу с соответствующими накладными расходами. Десяток вызовов серверных функций в цикле на тонком клиенте при медленном соединении способен заметно замедлить работу формы, хотя тот же код на толстом клиенте в локальной сети будет работать незаметно.
Когда включать свойство «Вызов сервера»
Флажок включают, когда логика должна выполняться строго на сервере, но инициировать её нужно из клиентского кода. Типичный сценарий — кнопка в форме, по нажатию которой нужно выполнить запрос к базе данных, записать объект или получить данные, недоступные на клиенте.
Стандартный приём в управляемых формах — создание серверных процедур с директивой &НаСервере прямо в модуле формы. Но когда одна и та же серверная логика нужна в нескольких формах, её выносят в общий модуль с флажками «Сервер» и «Вызов сервера». Так код не дублируется, а точка входа остаётся единой.
Ещё один случай — программный интерфейс подсистемы. Модули вида «РаботаСДокументамиВызовСервера» в типовых конфигурациях именно так и устроены: они предоставляют клиенту безопасный набор серверных операций, скрывая детали реализации.
Удобное соглашение об именовании: модули с постфиксом «ВызовСервера» — серверные, доступные с клиента; с постфиксом «Клиент» — клиентские; без постфикса или с постфиксом «Сервер» — чисто серверные. Такое именование сразу подсказывает, откуда модуль можно вызывать, и снижает риск ошибок.
Когда флажок включать не нужно
Если модуль используется только внутри серверной логики — из других серверных модулей, из модулей объектов, из регламентных заданий — флажок «Вызов сервера» следует снять. Это не вопрос производительности, а вопрос безопасности и архитектурной чистоты.
Открытый для клиента серверный модуль расширяет поверхность потенциальных атак и ошибок. Любой его экспортный метод теоретически может быть вызван с клиента, в том числе в обход предусмотренного интерфейсом сценария. Если процедура работает в привилегированном режиме или выполняет массовую запись данных, её открытость особенно опасна.
Также флажок бессмыслен для модулей, у которых стоят клиентские флажки наряду с серверным: такой модуль и так доступен на клиенте в собственной скомпилированной копии, и обращение к нему из клиентского кода не приведёт к серверному вызову — выполнится локальная версия модуля.
Сравнение вариантов
Модуль выполняется на сервере, доступен с клиента. Подходит для операций с базой данных, инициируемых из интерфейса. Ограничение — каждый вызов это обращение к серверу.
Модуль доступен исключительно в серверном контексте. Подходит для внутренней логики, регламентных заданий, привилегированных операций.
Модуль компилируется в обоих контекстах, вызов с клиента выполняет локальную копию. Подходит для кода без обращения к базе данных, например для форматирования данных.
Как настроить модуль и проверить результат
Настройка выполняется в конфигураторе: откройте общий модуль, вызовите палитру свойств и установите нужные флажки. Для серверного модуля, вызываемого с клиента, минимальный набор — «Сервер» и «Вызов сервера»; флажок «Привилегированный режим» ставят только при осознанной необходимости отключить проверку прав.
После настройки убедитесь, что вызываемые процедуры и функции объявлены с ключевым словом «Экспорт». Без него метод останется приватным и будет недоступен извне модуля независимо от флажков.
Проверка выполняется простым вызовом: в клиентской процедуре формы напишите обращение к методу модуля и запустите отладку. Если всё настроено верно, отладчик при нажатии F11 перейдёт в серверный контекст (при подключённой отладке сервера) или функция вернёт корректное значение. Если флажок не установлен, ошибка проявится ещё при сохранении модуля формы или при первом обращении.
- 1Откройте общий модуль в конфигураторе и вызовите палитру свойств
- 2Установите флажки «Сервер» и «Вызов сервера»
- 3Убедитесь, что нужные процедуры и функции объявлены с ключевым словом Экспорт
- 4Проверьте, что параметры и возвращаемые значения сериализуемы (ссылки, примитивные типы, структуры)
- 5Обновите конфигурацию базы данных и протестируйте вызов из клиентского кода под отладчиком
Типичные ошибки и их признаки
Самая частая ошибка — «Процедура или функция с указанным именем не определена» при обращении к серверному модулю с клиента. Причина почти всегда одна из трёх: не установлен флажок «Вызов сервера», метод не объявлен экспортным, либо модуль не имеет флажка «Сервер».
Вторая группа ошибок связана с несериализуемыми параметрами. Попытка передать на сервер или обратно объект, существующий только в одном контексте, приводит к ошибке передачи данных. Решение — передавать ссылки, а не объекты, и возвращать структуры с нужными полями вместо самих объектов.
Третья типичная проблема — избыточные серверные вызовы. Когда разработчик не задумывается о стоимости вызова и помещает обращение к серверной функции внутрь цикла обхода строк таблицы, форма начинает «подвисать». Правильное решение — собрать данные на клиенте, передать их одним вызовом и получить результат пакетно.
Оптимизация серверных вызовов
Главный принцип экономии — минимизировать количество вызовов, а не их объём. Один вызов, передающий массив из тысячи элементов, выполняется быстрее, чем сто вызовов по одному элементу. Проектируйте серверный API так, чтобы одна функция выполняла законченную бизнес-операцию.
Для сокращения повторных обращений используют модули с повторным использованием возвращаемых значений: свойство «Повторное использование возвращаемых значений» позволяет кэшировать результат функции на время сеанса или на заданный период. Это удобно для редко меняющихся настроек и констант.
При диагностике медленной работы формы полезно включить технологический журнал или замер производительности в конфигураторе и посчитать фактическое число серверных вызовов. Часто оказывается, что виновник — неочевидное обращение к серверному модулю внутри обработчика, который срабатывает многократно.
Как проверить результат
Вызов из клиентского кода выполняется без ошибки компиляции
Ошибка «Процедура или функция не определена»
Один-два вызова на пользовательское действие
Вызовы внутри цикла, десятки обращений при одном действии
Ссылки, примитивные типы, структуры, массивы
Объекты базы данных, запросы, несериализуемые типы
Права проверяются внутри серверной процедуры
Привилегированный режим без контроля доступа
Частые вопросы
Чем «Вызов сервера» отличается от флажка «Сервер»?
Флажок «Сервер» определяет контекст компиляции — модуль будет существовать на сервере. «Вызов сервера» не создаёт контекст, а лишь разрешает клиентскому коду обращаться к экспортным методам уже серверного модуля. Без флажка «Сервер» свойство «Вызов сервера» недоступно.
Почему возникает ошибка «Процедура не определена», хотя модуль существует?
Проверьте три вещи: установлен ли флажок «Вызов сервера» у модуля, объявлена ли процедура с ключевым словом «Экспорт», установлен ли флажок «Сервер». Также убедитесь, что конфигурация базы данных обновлена после изменения свойств модуля.
Можно ли вызывать серверный модуль без флажка «Вызов сервера»?
Да, но только из серверного контекста: из других серверных модулей, модулей объектов, регламентных заданий. Из клиентского кода можно вызвать серверную процедуру формы с директивой &НаСервере, а уже из неё — любой серверный модуль.
Влияет ли «Вызов сервера» на производительность?
Сам флажок не влияет, но каждый вызов открытого таким образом метода — это реальное обращение к серверу с сериализацией параметров. При частых вызовах из клиентского кода, особенно в циклах, это заметно сказывается на скорости работы.
Опасно ли сочетание «Вызов сервера» и «Привилегированный режим»?
Да, если не контролировать права внутри процедур. Привилегированный режим отключает проверку прав доступа, а открытый для клиента вызов позволяет запустить такой метод напрямую. Каждая экспортная процедура такого модуля должна сама проверять, имеет ли пользователь право на операцию.
Что такое модули с постфиксом «ВызовСервера» в типовых конфигурациях?
Это соглашение об именовании: такие модули имеют флажки «Сервер» и «Вызов сервера» и предназначены для вызова с клиента. Постфикс помогает разработчику сразу понять назначение модуля и не вызывать его по ошибке из неподходящего контекста.
Что важно запомнить
«Вызов сервера» разрешает клиентскому коду вызывать экспортные методы серверного общего модуля. Включайте флажок только там, где клиенту действительно нужен доступ к серверной логике, передавайте сериализуемые данные, минимизируйте число вызовов и не забывайте про контроль прав в привилегированных модулях.