Разработка и Конфигурация · 12 мин
Вызов сервера в 1С: что это значит и как правильно использовать
Что означает свойство «Вызов сервера» в 1С, когда его включать, как связаны директивы компиляции и безопасность. Разбор ошибок и практические советы.
«Вызов сервера» — это флажок в свойствах общего модуля конфигурации 1С, который разрешает обращаться к процедурам и функциям этого модуля с клиента. Если галочка снята, модуль компилируется и выполняется только в контексте сервера, и попытка вызвать его метод из клиентского кода приведёт к ошибке «Процедура или функция с указанным именем не определена» либо к ошибке проверки прав на этапе компиляции.
Механизм связан с клиент-серверной архитектурой платформы: в управляемом приложении код делится на клиентский (интерфейс, формы, работа на компьютере пользователя) и серверный (запросы к базе данных, транзакции, обращения к прикладным объектам). Общие модули — основной способ организовать серверную бизнес-логику, а свойство «Вызов сервера» определяет, доступна ли она «снаружи» — тонкому клиенту, веб-клиенту или внешнему соединению.
Настройка кажется мелочью, но от неё зависят три вещи: работоспособность кода, безопасность прикладного решения и производительность. Ниже разберём, где находится флажок, как он сочетается с другими свойствами модуля, когда включать вызов сервера необходимо, а когда — вредно, и какие ошибки встречаются чаще всего.
Где находится свойство и как его включить
Откройте конфигуратор, в дереве конфигурации найдите ветку «Общие» → «Общие модули» и вызовите палитру свойств нужного модуля (правый клик → «Свойства» или Alt+Enter). В списке свойств рядом с флажками «Сервер», «Клиент (управляемое приложение)», «Клиент (обычное приложение)» находится и пункт «Вызов сервера».
Важно понимать зависимость: флажок «Вызов сервера» имеет смысл только если включено свойство «Сервер». Если модуль не серверный, опция недоступна или не играет роли. Типичная комбинация для серверного модуля, доступного клиенту: «Сервер» = Истина, «Вызов сервера» = Истина, клиентские флажки сняты. Такой модуль физически исполняется на сервере, но его экспортные методы видны из клиентского кода.
Изменение свойств модуля требует обновления конфигурации базы данных, если менялась структура, либо простого сохранения конфигурации. После изменения перезапустите сеанс клиента: в клиент-серверном режиме старый скомпилированный контекст может кэшироваться, и свежие изменения «не подхватятся» до перезахода.
Что происходит при вызове сервера с клиента
Когда клиентский код обращается к методу серверного модуля с включённым вызовом сервера, платформа выполняет удалённый вызов: данные сериализуются, передаются на сервер, там выполняется код, результат возвращается клиенту. Каждый такой вызов — это сетевой обмен, даже если сервер и клиент стоят на одной машине в файловом режиме (там платформа эмулирует разделение контекстов).
Из этого следуют практические ограничения. В серверный вызов нельзя передать несериализуемые данные: элементы формы, объекты типа «ТабличныйДокумент» в некоторых сценариях, ссылки на клиентский контекст. Из серверного кода недоступны интерактивные операции — вопросы пользователю, предупреждения, открытие форм. Попытка вызвать Предупреждение() или Вопрос() на сервере приведёт к ошибке.
Ещё одно следствие — производительность. Десять мелких вызовов сервера в цикле на клиенте превратятся в десять сетевых обращений. Правильный подход — собрать данные на клиенте, передать их одним вызовом (например, массивом или структурой), выполнить всю работу на сервере и вернуть результат одним пакетом.
Как «Вызов сервера» связан с другими свойствами модуля
Свойства общего модуля работают в связке, и неправильная комбинация — частый источник ошибок. Разберём основные сочетания.
| Комбинация свойств | Где исполняется | Типичное назначение |
|---|---|---|
| Сервер + Вызов сервера | На сервере, доступно клиенту | API прикладной логики: расчёты, проведение, получение данных |
| Только Сервер | На сервере, клиенту недоступно | Внутренняя серверная логика, вызываемая из других серверных модулей |
| Сервер + Вызов сервера + Привилегированный режим | На сервере без проверки прав | Операции, которые пользователь не может выполнить напрямую (нумерация, служебные записи) |
| Клиент (управляемое приложение) | На клиенте | Работа с интерфейсом, файлами на компьютере пользователя |
| Клиент + Сервер | Компилируется в обоих контекстах | Общие алгоритмы без обращения к БД: форматирование, работа со строками |
Отдельно упомянем флажок «Привилегированный режим». Включённый вместе с «Вызов сервера», он означает, что любой клиент может инициировать выполнение кода без проверки прав доступа. Это мощный и опасный инструмент: через такой модуль пользователь с минимальными правами фактически получает возможность выполнить действия от имени системы. Включайте привилегированный режим осознанно и проверяйте параметры, приходящие с клиента.
Свойство «Внешнее соединение» определяет доступность модуля при подключении через COM или веб-сервисы. Для типовых сценариев публикации функционала наружу чаще используют HTTP-сервисы и веб-сервисы, а не прямой вызов общих модулей.
Когда включать вызов сервера, а когда нет
Включайте «Вызов сервера», если выполняется хотя бы одно условие: модуль содержит функции получения данных для форм (например, заполнение табличной части по запросу); клиентский код должен инициировать серверную операцию (запись, проведение, расчёт); модуль является программным интерфейсом подсистемы, к которому обращаются формы и команды.
Не включайте вызов сервера для модулей, которые вызываются только с сервера: обработчики подписок на события, регламентные задания, служебная логика обмена. Лишний открытый «вход» не даёт преимуществ, но расширяет поверхность для ошибок и злоупотреблений. Принцип минимальных возможностей здесь полностью соответствует здравому смыслу: клиенту должно быть доступно ровно то, что ему нужно.
Как выбрать настройку
Типичные ошибки и их диагностика
Самая частая ошибка — «Процедура или функция с указанным именем не определена» при обращении с клиента к серверному модулю. Причины: не включён «Вызов сервера»; метод не объявлен с ключевым словом Экспорт; модуль не компилируется в нужном контексте (например, снят флажок «Сервер»); клиент работает со старой версией конфигурации — помогает перезапуск сеанса.
Вторая группа ошибок связана с директивами компиляции в модулях форм. Если код в &НаКлиенте обращается к методу, доступному только на сервере без вызова сервера, конфигуратор выдаст ошибку при проверке модуля. Обратная ситуация: код в &НаСервере пытается вызвать клиентский общий модуль — серверный контекст не имеет доступа к клиентским модулям, и это тоже ошибка компиляции.
Третья группа — ошибки передачи данных. Сообщения вида «Ошибка передачи данных между клиентом и сервером» или про несериализуемый тип возникают, когда в параметрах или возвращаемом значении оказывается объект, который нельзя передать между контекстами. Решение — передавать простые типы, структуры, массивы, сериализуемые коллекции, а сложные объекты пересоздавать на стороне получателя.
Безопасность: что проверить перед включением
Любой экспортный метод модуля с включённым вызовом сервера теоретически может быть вызван пользователем напрямую, минуя ваши формы и проверки — например, через внешние инструменты или модифицированный клиент. Поэтому серверный код не должен доверять входным параметрам: проверяйте типы, диапазоны значений, существование ссылок и права пользователя внутри самого метода.
Особенно строго относитесь к привилегированным модулям с вызовом сервера. Если такой модуль принимает, например, имя таблицы или текст запроса строкой и выполняет его, пользователь фактически получает произвольный доступ к данным. Типовые конфигурации проходят проверки на подобные уязвимости, и в собственных разработках стоит придерживаться того же стандарта: никакого выполнения произвольного кода или запросов, пришедших с клиента.
Проверка результата и практические рекомендации
После настройки модуля проверьте результат тремя шагами: выполните синтаксическую проверку модулей конфигуратора (Конфигурация → Проверка конфигурации, включите проверку модулей в нужных контекстах); перезапустите клиентский сеанс и вызовите метод из реального сценария; убедитесь через отладчик, что исполнение происходит на сервере — точка останова должна сработать в серверном контексте.
Для архитектуры в целом полезно выработать соглашение об именовании: например, суффикс «ВызовСервера» или «КлиентСервер» в имени модуля сразу показывает его назначение. Многие команды используют стандарты разработки, где роль модуля читается из имени: ОбщегоНазначения (клиент-сервер), ОбщегоНазначенияВызовСервера, ОбщегоНазначенияСервер. Это снижает число ошибок при сопровождении.
Как проверить результат
Нет ошибок о недоступности методов в нужных контекстах
Ошибки «метод не определён» при проверке клиентских модулей
Метод выполняется, отладчик показывает серверный контекст
Ошибка «процедура не определена» или исключение при передаче данных
Метод отказывает при недостатке прав или корректно работает в привилегированном режиме по замыслу
Пользователь без прав получает данные, к которым доступа не имеет
Один-два серверных вызова на действие пользователя
Десятки вызовов сервера при открытии формы или в цикле
И последнее: если вы только изучаете платформу, полезное упражнение — создать тестовый общий модуль, поочерёдно менять комбинации флажков и смотреть, в каких контекстах метод доступен. Пятнадцать минут такого эксперимента дают более прочное понимание, чем чтение документации.
Что важно запомнить
«Вызов сервера» открывает экспортные методы серверного общего модуля для клиента. Включайте его только там, где это реально нужно, помните о сетевой природе каждого вызова, не доверяйте параметрам с клиента и с особой осторожностью сочетайте вызов сервера с привилегированным режимом.
Частые вопросы о вызове сервера в 1С
Чем «Вызов сервера» отличается от флажка «Сервер»?
Флажок «Сервер» определяет, что модуль компилируется и исполняется в серверном контексте. «Вызов сервера» — дополнительное разрешение обращаться к этому модулю со стороны клиента. Без первого флажка второй не имеет смысла; с одним только «Сервером» модуль доступен лишь другому серверному коду.
Можно ли вызвать серверный модуль из тонкого или веб-клиента?
Да, именно для этого и существует вызов сервера. Тонкий и веб-клиент не имеют прямого доступа к базе данных, поэтому вся работа с данными идёт через серверные вызовы. Ограничения те же: нельзя передавать несериализуемые типы и использовать интерактивные команды на сервере.
Ошибка «Процедура или функция не определена» при вызове с клиента — что проверить в первую очередь?
Проверьте три вещи: включён ли флажок «Вызов сервера» у модуля; стоит ли ключевое слово «Экспорт» у процедуры или функции; перезапущен ли клиентский сеанс после изменения конфигурации. Если всё это в порядке, убедитесь, что имя метода написано без опечаток и модуль не находится в расширении с другими настройками.
Опасно ли включать привилегированный режим вместе с вызовом сервера?
Сама комбинация легальна и используется в типовых решениях, например для служебных операций. Опасность возникает, когда такой модуль выполняет действия по данным, пришедшим с клиента, без проверок: тогда пользователь без прав может читать или менять чужие данные. Каждый экспортный метод привилегированного модуля должен сам контролировать входные параметры и логику доступа.
Почему форма работает медленно, хотя запросы простые?
Частая причина — множество мелких вызовов сервера: в цикле, при построчном заполнении таблицы, в обработчиках, срабатывающих на каждое действие. Каждый вызов — отдельный обмен с сервером. Решение — собирать данные пакетом, передавать их одним вызовом и обрабатывать на сервере целиком.
Нужен ли вызов сервера для модуля с директивой «КлиентСервер»?
Нет. Модуль с флажками «Клиент» и «Сервер» компилируется в обоих контекстах и вызывается локально в каждом из них — удалённого вызова не происходит. Такие модули предназначены для алгоритмов без обращения к базе данных: работа со строками, датами, коллекциями, форматирование.