Где выполняется код 1С: клиентская и серверная часть платформы
Содержание
«На сервере» в 1С означает, что код и запросы выполняет рабочий процесс кластера рядом с базой данных. «На клиенте» — что код работает в приложении на компьютере пользователя: в тонком клиенте, толстом клиенте или браузере. Клиент показывает формы и принимает ввод, сервер читает и записывает данные, проводит документы и строит отчёты.
От того, где именно выполняется каждая строка, зависит скорость открытия форм, нагрузка на сеть и целый класс ошибок вида «процедура не определена». Разберём, как устроены обе стороны в 1С:Предприятии 8.3, как ими управляет программист и что настраивает администратор.
Из каких процессов состоит клиент-серверная 1С
В клиент-серверном варианте работают три независимых слоя. Каждый можно поставить на отдельную машину.
| Слой | Что это физически | Чем занят |
|---|---|---|
| Клиент | 1cv8c.exe (тонкий), 1cv8.exe (толстый), браузер | Формы, ввод, клиентский код |
| Сервер 1С | Служба агента ragent, менеджер кластера rmngr, рабочие процессы rphost | Серверный код, запросы, блокировки, лицензии |
| СУБД | MS SQL Server, PostgreSQL, IBM Db2 или Oracle | Хранение таблиц базы |
Пользователь никогда не обращается к СУБД напрямую. Все данные идут по цепочке «клиент → рабочий процесс → СУБД». Поэтому пароль от SQL-сервера пользователю не нужен: его знает только кластер.
Как клиент находит нужный процесс:
- 🔌 Клиент подключается к агенту сервера по порту
1540. - 🧭 Агент передаёт его менеджеру кластера на порт
1541. - ⚙️ Менеджер назначает рабочий процесс из диапазона портов, по умолчанию
1560–1591. Диапазон задаётся в свойствах рабочего сервера. - 🔁 Дальше клиент работает с этим рабочим процессом, пока сеанс не закроют или кластер не перераспределит соединение.
Консоль администрирования серверов тоже ходит через агент, на порт 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 платформы. В журнал можно писать длительные вызовы сервера, запросы к СУБД, ожидания на блокировках и исключения. Журнал быстро растёт: включайте только нужные события, ограничивайте срок хранения и отключайте после разбора.
Завершение сеанса или рабочего процесса из консоли обрывает работу пользователей: несохранённые документы пропадут. Делайте это вне рабочего времени или после предупреждения людей.
Частые ошибки на стыке клиента и сервера
Отдельный случай — ошибка лицензий после переноса базы на сервер. В клиент-серверном варианте лицензию может выдавать сам сервер. Для этого в свойствах базы в кластере включают флажок «Разрешить выдачу лицензий сервером 1С:Предприятия», а программные лицензии активируют на машине кластера.
Частые вопросы
Можно ли в одной базе одновременно работать в тонком и толстом клиенте?
Нужен ли отдельный сервер 1С для 5 пользователей?
Работает ли директива &НаСервере в файловой базе?
Почему серверный код видит не те файлы, что клиент?
C:\Temp на сервере — это папка сервера, а не компьютера бухгалтера.