Как 1С передаёт работу с клиента на сервер и что делать, когда этот обмен зависает

· 9 мин

Содержание

Вызов сервера в 1С — это момент, когда программа на вашем компьютере (клиент) отправляет запрос серверной части и ждёт ответа. Сервер читает базу, проводит документ или строит отчёт и возвращает результат. Пока ответа нет, окно 1С «замирает», а курсор крутится. Если ответ не пришёл вовсе, вы видите ошибку соединения или сеанса.

Отсюда и ответ на вопрос «почему тормозит»: медленный вызов сервера — это почти всегда медленный сервер, медленная сеть или слишком частые вызовы в коде. Ниже — как отличить одно от другого и что делать в каждом случае.

Суть вызова сервера простыми словами

В 1С 8.3 любая конфигурация на управляемых формах разделена на две половины. Клиент рисует формы и принимает нажатия. Сервер хранит данные, выполняет запросы к базе и проводит документы.

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

Что передаётся за один вызов:

  • 📤 с клиента на сервер — параметры и, если нужно, данные формы;
  • ⚙️ на сервере — выполнение кода, запросы к СУБД, блокировки;
  • 📥 с сервера на клиент — результат и изменённые данные формы.

Есть ли вызов сервера в файловой базе

Есть. Даже если база лежит в папке на диске, деление на клиент и сервер сохраняется логически. В файловом варианте серверная часть работает внутри процесса клиента (или веб-сервера при публикации). Сети между ними нет, но код всё равно выполняется «на сервере» по правилам 8.3.

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

Вызов сервера в коде: директивы и общие модули

Программист 1С встречает это понятие в двух местах.

Директивы компиляции в модуле формы. Перед процедурой пишут, где она выполняется:

ДирективаГде выполняетсяПередаёт данные формы
&НаКлиентена клиенте—
&НаСерверена сервереда, вся форма уходит туда и обратно
&НаСервереБезКонтекстана серверенет, только параметры
&НаКлиентеНаСервереБезКонтекстатам, откуда вызвалинет

Вызов процедуры &НаСервере из клиентской процедуры и есть контекстный вызов сервера. Вызов &НаСервереБезКонтекста — внеконтекстный, он легче.

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

// Общий модуль РаботаСЦенамиВызовСервера: Сервер + Вызов сервера
Функция ЦенаНоменклатуры(Номенклатура, Дата) Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ Цена ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, Номенклатура = &Номенклатура)";
    Запрос.УстановитьПараметр("Дата", Дата);
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Выборка = Запрос.Выполнить().Выбрать();
    Возврат ?(Выборка.Следующий(), Выборка.Цена, 0);
КонецФункции

В типовых конфигурациях на БСП такие модули обычно и называются с суффиксом ВызовСервера, так их легко найти в дереве конфигурации.

В какие моменты 1С обращается к серверу

Пользователь не видит вызовы, но провоцирует их почти каждым действием. Типичные сценарии:

  1. 📂 Открытие формы — сервер готовит данные документа или списка.
  2. 📜 Прокрутка динамического списка — сервер отдаёт следующую порцию строк.
  3. ✏️ Выбор значения в поле — подбор, автозаполнение, пересчёт цен и сумм.
  4. 💾 Запись и проведение — самый тяжёлый вызов: движения по регистрам, проверки, блокировки.
  5. 📊 Формирование отчёта — запрос к базе плюс компоновка результата.
  6. 🔄 Фоновые проверки — обработчики ожидания, которые раз в N секунд опрашивают сервер (напоминания, обмен, мониторинг ЭДО).

Сколько вызовов делает конкретное действие, можно увидеть самому. В тонком клиенте включите показатели производительности сочетанием Ctrl+Shift+Alt+P. В нижней части окна появятся счётчики: число вызовов сервера, объём принятых и отправленных данных, время. Нажмите кнопку в документе и посмотрите, как изменились цифры.

Нормальная картина: открытие документа — 1-3 вызова, выбор номенклатуры в строке — 1-2 вызова. Если на одну смену количества уходит 10 вызовов и больше, проблема в коде формы, а не в сервере.

Почему вызов сервера тормозит или висит

Задержку вызова складывают три слагаемых: дорога туда, работа на сервере, дорога обратно. Тормозит одно из них.

Сеть между клиентом и сервером

Тонкий клиент чувствителен к задержке, а не к ширине канала. Десять вызовов при пинге 2 мс — это 20 мс, незаметно. Те же десять вызовов при пинге 80 мс через VPN — почти секунда на каждое действие.

Признаки сетевой причины:

  • 🌐 в офисе работает быстро, из дома через VPN — медленно;
  • 🐢 тормозит всё подряд, даже открытие пустой формы;
  • 📶 на RDP-сервере рядом с сервером 1С та же база работает нормально.

Нагрузка на сервер 1С и СУБД

Если сервер 1С сам долго считает, вызов будет долгим при любой сети. Частые причины:

  • 🧠 рабочему процессу rphost не хватает памяти, он уходит в своп;
  • 💽 СУБД упирается в диск: нет актуальной статистики, индексы фрагментированы;
  • 🔒 документ ждёт блокировку, которую держит другой пользователь;
  • 📈 кто-то запустил тяжёлый отчёт или закрытие месяца в рабочее время.

Код конфигурации

Доработки часто делают вызовы там, где без них можно обойтись. Например, обработчик ПриАктивизацииСтроки обращается к серверу при каждом движении курсора по списку. Или процедура &НаСервере вызывается ради одного значения и каждый раз тащит туда и обратно всю форму с табличной частью на 3000 строк.

Блокировки

Пока одна транзакция держит блокировку на остатках товара, второй пользователь, проводящий документ по тому же товару, ждёт. Для него это выглядит как зависший вызов сервера. Если ожидание превысит таймаут, придёт ошибка Конфликт блокировок при выполнении транзакции с пояснением о превышении времени ожидания.

Ошибки при вызове сервера и как их разобрать

Когда вызов обрывается, 1С показывает сообщение. По его тексту видно, где искать причину.

Диагностика: выберите симптом

Ошибки, которые видит программист

При разработке вызов сервера ломается по своим правилам:

  • 🚫 Процедура не найдена при вызове с клиента. Серверный общий модуль без флажка «Вызов сервера», или функция не экспортная.
  • 📦 Значение нельзя передать между клиентом и сервером. Через вызов проходят только сериализуемые значения. Запрос, РезультатЗапроса, объект документа на клиент не передать — возвращайте ссылку, структуру или значения полей.
  • 🔁 Данные формы не обновились после вызова. Использована &НаСервереБезКонтекста, а код пытается менять реквизиты формы. В такой процедуре формы нет — верните значения и присвойте их на клиенте.

Как ускорить вызов сервера

Совет зависит от того, кто вы. Пользователь не перепишет код, программист не купит память серверу. Поэтому разделим.

Что может сделать пользователь

  1. Закройте лишние формы и вкладки. Открытые динамические списки и рабочие столы с виджетами опрашивают сервер.
  2. Не формируйте отчёт за три года, если нужен месяц. Короче период — короче вызов.
  3. Отключите «Обновлять автоматически» в формах отчётов и списков, если такая настройка видна в форме.
  4. Если работаете из дома, попробуйте подключение через RDP к серверу рядом с 1С вместо тонкого клиента через VPN.
  5. Сообщите администратору время и действие, которое тормозит. «Тормозит всё» — бесполезная заявка, «проведение реализации в 10:15 шло 40 секунд» — полезная.

Что может сделать администратор

  • 🖥️ Проверьте память и процессор сервера во время торможения, а не вечером.
  • 🔎 Включите технологический журнал с событиями CALL и TLOCK. В событиях CALL видна длительность каждого вызова и контекст, где он сделан.
  • 🗃️ Настройте на СУБД регламентное обновление статистики и обслуживание индексов.
  • 🔌 Убедитесь, что порты открыты: агент сервера 1540, менеджер кластера 1541, диапазон рабочих процессов задаётся в свойствах рабочего сервера (по умолчанию 1560:1591).
  • 🕐 Перенесите закрытие месяца, обмены и пересчёты на нерабочее время.

Пример минимальной настройки технологического журнала в файле logcfg.xml (каталог conf платформы):

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
  <log location="D:\techlog" history="24">
    <event>
      <eq property="name" value="CALL"/>
      <gt property="duration" value="3000000"/>
    </event>
    <property name="all"/>
  </log>
</config>

Фильтр по duration отсекает короткие вызовы. В 8.3 длительность в журнале пишется в микросекундах, значит 3 000 000 — это 3 секунды; единицы для своей версии платформы сверьте со справкой по технологическому журналу. Держите журнал включённым только на время диагностики.

Технологический журнал без фильтров за час может занять десятки гигабайт и сам нагрузить сервер. Задавайте фильтр по длительности и папку на диске со свободным местом.

Что может сделать программист

  • Объединяйте вызовы. Одна серверная функция, которая возвращает структуру из пяти значений, лучше пяти вызовов по одному.
  • Используйте &НаСервереБезКонтекста, если форма на сервере не нужна.
  • Кешируйте справочную информацию: общий модуль с повторным использованием возвращаемых значений «На время сеанса» вызывается один раз.
  • Не делайте серверных вызовов в ПриАктивизацииСтроки напрямую. Подключите обработчик ожидания с задержкой 0,1-0,2 с — тогда вызов уйдёт, только когда пользователь остановится на строке.
  • Тяжёлые операции выносите в фоновое задание. В типовых на БСП для этого есть механизм длительных операций: форма не висит, пользователь видит индикатор.

Диагностика по шагам: где именно теряется время

Когда жалоба «1С тормозит», полезно пройти короткий маршрут, чтобы не чинить не то.

Ищем причину медленного вызова сервера
Выполнено: 0 / 6

Порядок выбран специально: сначала дешёвые проверки на рабочем месте, потом серверная сторона.

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

Как свести проблемы с вызовом сервера к минимуму

Длинный список советов сводится к нескольким правилам:

КтоЧто делать постоянноЧего не делать
ПользовательКороткие периоды отчётов, закрытые лишние окнаМассовые операции в пиковые часы
АдминистраторОбслуживание СУБД, мониторинг памяти, план работ по ночамДержать техжурнал без фильтра неделями
ПрограммистОдин вызов вместо нескольких, внеконтекстные функции, фоновые заданияВызовы в обработчиках активизации и в циклах

Отдельно о циклах. Самая дорогая ошибка в коде — вызов серверной функции внутри клиентского цикла по строкам табличной части. 500 строк — 500 вызовов. Правильно передать на сервер весь массив одним вызовом и получить результат одним ответом.

Частые вопросы

Сколько вызовов сервера считается нормой?
Жёсткой нормы нет. Ориентир — единицы вызовов на одно действие пользователя. Десятки вызовов на простое действие говорят о неудачном коде формы.
Почему в тонком клиенте медленнее, чем в толстом?
Толстый клиент выполняет много кода у себя. Тонкий обращается к серверу за каждым шагом, поэтому сильнее зависит от задержки сети.
Можно ли увеличить таймаут вызова сервера?
Время ожидания блокировки данных задаётся в параметрах информационной базы в Конфигураторе, для веб-клиента таймауты настраивают на веб-сервере. Но таймаут лишь прячет медленную операцию, лучше найти её причину.
Вызов сервера в веб-клиенте отличается от тонкого клиента?
Логика та же, но вызовы идут через HTTP к веб-серверу с публикацией. Добавляются таймауты и ограничения самого веб-сервера.
Влияет ли антивирус на скорость вызова сервера?
Да, если он проверяет каталоги базы, кеша или временных файлов сервера 1С. Эти папки обычно добавляют в исключения по согласованию со службой безопасности.