Где выполняется код 1С: клиентская и серверная часть платформы

· 9 мин

Содержание

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

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

Из каких процессов состоит клиент-серверная 1С

В клиент-серверном варианте работают три независимых слоя. Каждый можно поставить на отдельную машину.

СлойЧто это физическиЧем занят
Клиент1cv8c.exe (тонкий), 1cv8.exe (толстый), браузерФормы, ввод, клиентский код
Сервер 1ССлужба агента ragent, менеджер кластера rmngr, рабочие процессы rphostСерверный код, запросы, блокировки, лицензии
СУБДMS SQL Server, PostgreSQL, IBM Db2 или OracleХранение таблиц базы

Пользователь никогда не обращается к СУБД напрямую. Все данные идут по цепочке «клиент → рабочий процесс → СУБД». Поэтому пароль от SQL-сервера пользователю не нужен: его знает только кластер.

Как клиент находит нужный процесс:

  1. 🔌 Клиент подключается к агенту сервера по порту 1540.
  2. 🧭 Агент передаёт его менеджеру кластера на порт 1541.
  3. ⚙️ Менеджер назначает рабочий процесс из диапазона портов, по умолчанию 1560–1591. Диапазон задаётся в свойствах рабочего сервера.
  4. 🔁 Дальше клиент работает с этим рабочим процессом, пока сеанс не закроют или кластер не перераспределит соединение.

Консоль администрирования серверов тоже ходит через агент, на порт 1540.

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

Тонкий, толстый и веб-клиент: чем отличаются режимы запуска

Клиентских приложений несколько, и они умеют разное.

КлиентФайл / способКакие формыГде выполняется код модулей объектов
Тонкий1cv8c.exeТолько управляемыеТолько на сервере
Толстый, управляемое приложение1cv8.exeУправляемыеНа сервере; часть кода может работать в толстом клиенте
Толстый, обычное приложение1cv8.exeОбычные (8.2-стиль)И на клиенте, и на сервере
Веб-клиентБраузер через публикацию на IIS или ApacheТолько управляемыеТолько на сервере
Мобильный клиентПриложение на телефонеУправляемыеТолько на сервере

Тонкий клиент не загружает конфигурацию целиком и не работает с данными базы напрямую. Он получает описание формы и данные для неё с сервера. Отсюда малый размер дистрибутива и работа через интернет по HTTP.

Толстый клиент нужен в двух случаях. Первый — старые конфигурации на обычных формах. Второй — Конфигуратор: он запускается из того же 1cv8.exe.

Режим запуска толстого клиента задают ключами командной строки:

"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" ENTERPRISE /S"srv1c\buh" /RunModeManagedApplication
"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" ENTERPRISE /S"srv1c\buh" /RunModeOrdinaryApplication

Номер версии в пути подставьте свой. Тот же выбор доступен в окне запуска: Изменить → Дополнительно → Основной режим запуска.

Типовые конфигурации на управляемых формах (БП 3.0, ЗУП 3.1, УТ 11) рассчитаны на тонкий клиент. Запуск в толстом клиенте не ускоряет работу, а только увеличивает трафик и расход памяти на рабочем месте.

Директивы компиляции: как программист указывает сторону выполнения

В модуле управляемой формы перед каждой процедурой стоит директива. Она говорит платформе, где выполнять код.

  • 🖥️ &НаКлиенте — код работает на компьютере пользователя. Есть доступ к форме и её элементам, но нет доступа к базе: ни запросов, ни записи объектов.
  • 🗄️ &НаСервере — код работает в рабочем процессе. Доступны запросы и объекты базы. На сервер передаются данные формы, а после вызова возвращаются обратно.
  • 📦 &НаСервереБезКонтекста — тоже сервер, но без передачи формы. Вызов самый лёгкий: туда и обратно идут только параметры и результат.
  • 🔀 &НаКлиентеНаСервереБезКонтекста — процедура компилируется для обеих сторон. Подходит для вспомогательных расчётов без обращения к базе.

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

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

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
    // код, которому нужен доступ к данным
#КонецЕсли

Правильный образец обращения к базе из формы выглядит так:

&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
    Объект.ИНН = ИННКонтрагента(Объект.Контрагент);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ИННКонтрагента(Контрагент)
    Возврат Контрагент.ИНН;
КонецФункции

Клиентская процедура реагирует на изменение поля. Серверная функция без контекста получает ссылку и отдаёт одну строку. Форма по сети не гоняется.

Что можно передать между клиентом и сервером

Через границу проходят только сериализуемые значения: примитивные типы, ссылки, структуры, массивы, соответствия, хранилища значений. Объект справочника, менеджер записи, ТаблицаЗначений или результат запроса передать с клиента нельзя. Таблицы передают реквизитом формы типа «Таблица значений» (на клиенте это ДанныеФормыКоллекция) или конвертируют в массив структур.

Как разделение на клиент и сервер влияет на скорость

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

Типичные потери и что с ними делать:

Что происходитПочему медленноКак исправить
Серверный вызов в цикле на клиенте100 строк — 100 вызововСобрать данные в массив и сделать один вызов
&НаСервере там, где форма не нужнаТуда и обратно ездят все данные формыЗаменить на &НаСервереБезКонтекста
Обращение к реквизиту ссылки на клиенте через точкуВ обычных формах — скрытый запрос к базеПолучать нужные поля одним серверным вызовом
Тяжёлый запрос при каждом изменении поляНагрузка на рабочий процесс и СУБДКешировать в реквизите формы или в модуле с повторным использованием возвращаемых значений

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

Как измерить

  • ⏱️ Ключ запуска /DisplayPerformance выводит в окне клиента число вызовов сервера и объём переданных данных по последней операции.
  • 📊 В Конфигураторе Отладка → Замер производительности показывает, сколько времени заняла каждая строка кода, отдельно для клиента и сервера.
  • 🐢 Для медленных каналов есть ключ /O Low: клиент сжимает обмен и реже обновляет данные. Его же можно включить в окне запуска в настройках базы, поле «Скорость соединения».

Хорошая цель для формы документа — один-два вызова сервера при открытии и ни одного при простом вводе в поле без обращения к базе.

Настройка кластера серверов 1С и балансировка нагрузки

Кластер настраивают в консоли администрирования серверов 1С:Предприятия. Если консоль не открывается, проверьте, что на машине зарегистрирована radmin.dll нужной версии платформы:

regsvr32 "C:\Program Files\1cv8\8.3.24.1548\bin\radmin.dll"

Команду запускают из командной строки от имени администратора. Версия в пути должна совпадать с версией сервера.

Свойства рабочего сервера

Откройте узел Рабочие серверы, затем свойства нужного сервера. Здесь задаются:

  • 🔢 диапазон IP-портов рабочих процессов;
  • 🧩 «Количество ИБ на процесс» и «Количество соединений на процесс» — сколько баз и пользователей обслуживает один rphost; при нуле значение подбирается автоматически;
  • 💾 «Безопасный расход памяти за один вызов» и «Критический объём памяти процессов» — пределы, после которых кластер перезапускает или обрывает процесс;
  • ⚖️ параметры отказоустойчивости и требования назначения функциональности.

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

Свойства кластера

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

Балансировка имеет смысл, если в кластере два и более рабочих сервера. На одном сервере кластер распределяет соединения только между своими процессами rphost.

Свойства информационной базы

В свойствах базы в кластере указывают сервер СУБД, имя базы, пользователя СУБД и флажок блокировки регламентных заданий. Этот флажок ставят на копиях рабочей базы, чтобы тестовая копия не начала выгружать данные в банк или отправлять отчётность.

Мониторинг и диагностика обмена между клиентом и сервером

Первое место для диагностики — консоль кластера. В узле Сеансы видно:

  • 👤 кто подключён и с какого компьютера;
  • ⏳ «Время вызова (текущее)» — сколько длится серверный вызов прямо сейчас;
  • 🗃️ «Захвачено СУБД» — сеанс держит соединение с базой данных; долгое значение указывает на тяжёлый запрос или ожидание блокировки.

Те же данные доступны из командной строки через сервер администрирования ras и утилиту rac:

rac cluster list
rac session list --cluster=<ид_кластера> --licenses

Полный список команд и параметров выводит rac help.

Для глубокого разбора включают технологический журнал. Его настраивают файлом logcfg.xml в каталоге conf платформы. В журнал можно писать длительные вызовы сервера, запросы к СУБД, ожидания на блокировках и исключения. Журнал быстро растёт: включайте только нужные события, ограничивайте срок хранения и отключайте после разбора.

Если пользователи жалуются на тормоза
Выполнено: 0 / 6

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

Частые ошибки на стыке клиента и сервера

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

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

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

Можно ли в одной базе одновременно работать в тонком и толстом клиенте?
Да. Режим выбирается на каждом рабочем месте отдельно. Конфигурация при этом одна, данные общие.
Нужен ли отдельный сервер 1С для 5 пользователей?
Обычно нет: файловая база по сети справляется с несколькими пользователями. Сервер нужен при росте числа пользователей, больших объёмах данных и удалённой работе.
Работает ли директива &НаСервере в файловой базе?
Работает. Платформа выполняет серверный код в процессе клиента, поэтому одна и та же конфигурация подходит для обоих вариантов.
Почему серверный код видит не те файлы, что клиент?
Серверный код работает на машине кластера и от имени пользователя службы. Путь C:\Temp на сервере — это папка сервера, а не компьютера бухгалтера.
Чем веб-клиент отличается от тонкого по возможностям?
Набор форм и прикладная логика те же. Ограничения касаются работы с локальными файлами, внешними компонентами и оборудованием: браузер даёт к ним меньший доступ.