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