1. Архитектура платформы и принципы клиент-серверного взаимодействия
Архитектура платформы и принципы клиент-серверного взаимодействия
Представьте систему, в которой одновременно работают три тысячи пользователей, каждый из которых ежесекундно проводит накладные, формирует отчеты и запрашивает остатки на складах. Если бы каждый из этих компьютеров напрямую обращался к файлам базы данных, система коллапсировала бы через пять минут из-за блокировок и сетевых задержек. Платформа «1С:Предприятие 8.3» решает эту проблему через трехуровневую архитектуру, где «умный» сервер берет на себя роль дирижера, распределяющего нагрузку между интерфейсом и хранилищем данных. Понимание того, как именно данные путешествуют между клиентом, сервером приложений и СУБД, отделяет рядового кодера от архитектора, способного строить отказоустойчивые системы.
Трехуровневая архитектура: разделяй и властвуй
Классическая архитектура 1С состоит из трех логических и часто физически разделенных слоев. Это не просто способ организации кода, а фундамент масштабируемости.
Главное правило этой архитектуры: клиент никогда не общается с СУБД напрямую. Между ними всегда стоит кластер серверов 1С. Это позволяет платформе быть «всеядной» — разработчик пишет код на языке 1С, а сервер сам транслирует его в специфический диалект SQL, понятный конкретной СУБД.
Кластер серверов: под капотом процессов
Если мы заглянем в диспетчер задач на сервере приложений, мы увидим несколько ключевых процессов. Понимание их ролей критично для диагностики производительности.
Основной процесс — rmngr (менеджер кластера). Он управляет сервисами кластера: блокировками, журналом регистрации, заданиями и нумерацией. Если rmngr упадет, работа всего кластера будет парализована, так как некому будет координировать действия.
Рабочие процессы — rphost. Именно в них «живут» сеансы пользователей. Когда вы запускаете 1С, кластер выделяет вам место в одном из rphost. Один такой процесс может обслуживать сотни пользователей. Платформа 8.3 позволяет гибко настраивать количество этих процессов: например, можно указать, чтобы при достижении определенного объема памяти процесс перезапускался, передавая своих пользователей «здоровому» соседу. Это механизм автоматической самоочистки системы.
Существует также процесс ragent (агент сервера). Это единственная служба, которая запускается как сервис Windows или демон Linux. Его задача — просто запустить кластер и следить, чтобы rmngr и rphost были в строю.
Принципы клиент-серверного взаимодействия
Самая частая ошибка начинающего разработчика — попытка перегнать огромный массив данных с сервера на клиент. В управляемом приложении (которое является стандартом для 8.3) действует жесткая парадигма: «На клиенте — только интерфейс, на сервере — все остальное».
Вызов сервера и контекст
Когда пользователь нажимает кнопку в форме, происходит «контекстный вызов сервера». Это дорогая операция. Представьте, что вы живете в Москве (клиент), а ваш склад находится во Владивостоке (сервер). Каждый раз, когда вам нужно узнать вес посылки, вы летите туда и обратно. Если вы летаете за каждой мелочью по отдельности, вы разоритесь на билетах.
В терминах 1С «билет» — это сериализация данных. Чтобы передать форму с клиента на сервер, платформа превращает все данные формы (реквизиты, списки, настройки) в поток байтов (XML или JSON), передает по сети, на сервере разворачивает, выполняет код, снова сворачивает и отправляет обратно.
> Чем больше данных в форме, тем медленнее работает каждый клик по кнопке, вызывающей сервер.
Для оптимизации используются директивы компиляции:
* &НаКлиенте: код выполняется на компьютере пользователя. Доступны только простые типы и данные формы. Нельзя делать запросы к базе.
* &НаСервере: полный доступ к базе данных и всем объектам метаданных.
* &НаСервереБезКонтекста: самый эффективный способ. На сервер передаются только те параметры, которые вы явно указали, а не вся форма целиком. Это как отправить во Владивосток телеграмму вместо того, чтобы лететь самому.
Понятие мутабельных значений
Одной из «болей» разработчика являются мутабельные (изменяемые) значения. Например, объект СправочникОбъект или ДокументОбъект не может существовать на клиенте. На клиенте живет только «ДанныеФормыСтруктура» — облегченная проекция объекта. Если вы попытаетесь передать реальный объект справочника с сервера на клиент, система выдаст ошибку «Мутабельное значение не может быть передано». Это защита платформы: она не дает вам таскать тяжелые структуры данных через узкое горлышко сети.
Управление памятью и сеансовые данные
На сервере 1С для каждого пользователя создается сеанс. В рамках сеанса могут существовать временные хранилища. Это области памяти, где можно оставить файл или тяжелую таблицу значений на короткое время, чтобы потом забрать их.
Важно понимать разницу между сеансом и соединением. Сеанс — это логическая сущность (пользователь «Иванов»), а соединение — это технический канал между rphost и СУБД. Платформа 8.3 использует механизм пула соединений. Это означает, что если 100 пользователей одновременно ничего не делают, они могут вообще не занимать соединений с SQL-сервером. Как только кому-то понадобились данные, платформа берет свободное соединение из «пула», выполняет запрос и тут же возвращает соединение обратно. Это позволяет экономить лицензии СУБД и ресурсы железа.
Жизненный цикл запроса к данным
Давайте проследим путь простого действия: пользователь в списке товаров нажал «Обновить».
ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура в нечто вроде SELECT _IDRRef FROM _Reference25. Обратите внимание: имена таблиц в СУБД не совпадают с именами в конфигураторе. Платформа сама ведет таблицу соответствий (хранится в системных таблицах базы).ВыборкаИзРезультатаЗапроса), упаковывает их и отправляет клиенту.Масштабируемость и отказоустойчивость
В крупных внедрениях один сервер приложений может не справляться. Тогда создается кластер из нескольких физических серверов (рабочих серверов).
Платформа 8.3 обладает встроенным механизмом балансировки нагрузки. Вы можете указать «требования функциональности». Например: «Сервер №1 занимается только фоновыми заданиями, а Сервер №2 — только работой пользователей в интерактивном режиме». Это позволяет гарантировать, что тяжелый расчет зарплаты, запущенный в фоне, не «подвесит» работу кассиров.
Еще одна важная функция — отказоустойчивость сеанса. В настройках кластера можно задать уровень отказоустойчивости (количество серверов, которые могут выйти из строя без потери данных пользователями). Если один сервер в кластере «умрет», его пользователи автоматически будут подхвачены другим сервером. Для пользователя это будет выглядеть как небольшая заминка в 2-3 секунды, но ему не придется заново заходить в систему и вводить данные в недозаполненный документ. Это достигается за счет репликации данных сеанса между рабочими серверами.
Взаимодействие через HTTP и Web-сервисы
Современная 1С — это не вещь в себе. Платформа 8.3 умеет выступать и как клиент, и как сервер в мировом вебе.
Когда мы публикуем базу на веб-сервере (IIS или Apache), появляется возможность работать через браузер. В этом случае веб-сервер выступает в роли прослойки: он принимает HTTP-запросы от браузера и перенаправляет их расширению 1С (библиотеке wsap24.dll или mod_1c24.so), которое уже общается с кластером серверов.
Аналогично работают HTTP-сервисы. Вы можете написать внутри 1С метод, который будет отдавать остатки товаров в формате JSON любому внешнему приложению (сайту, мобильному приложению). Для платформы такой вызов является внешним соединением, которое обслуживается по тем же правилам трехуровневой архитектуры: * Авторизация. * Выделение сеанса (или использование существующего пула). * Выполнение логики на сервере. * Возврат ответа.
Транзакционная модель и блокировки
Поскольку 1С — это многопользовательская система, критически важно понимать, как платформа обеспечивает изоляцию данных. Когда один пользователь меняет остаток товара, другой не должен увидеть «промежуточное» состояние.
Платформа использует два типа блокировок:
Управляемые блокировки работают гораздо эффективнее на больших объемах, так как они позволяют избежать избыточных блокировок SQL, которые часто захватывают лишние данные (эскалация блокировок). В режиме управляемых блокировок 1С сама говорит СУБД использовать самый легкий уровень изоляции (Read Committed Snapshot), а всю ответственность за логическую целостность берет на себя сервер приложений.
Эволюция клиентских приложений
Для полноты картины стоит вспомнить, что 1С прошла путь от «толстого клиента», где вся логика могла исполняться на машине пользователя, до «тонкого клиента».
* Толстый клиент: Требует мощного компьютера у пользователя и быстрого канала связи с сервером (или даже прямой связи с СУБД в файловом варианте). В нем еще можно встретить старый код, не разделенный на клиент и сервер. * Тонкий клиент: Передает на сервер только команды. Весь код выполняется на сервере. Идеален для работы через интернет. * Веб-клиент: Не требует установки 1С. Работает прямо в Chrome или Safari. Платформа «на лету» транслирует формы 1С в HTML и JavaScript.
В профессиональной разработке сегодня ориентируются исключительно на тонкий/веб-клиент. Это накладывает жесткие ограничения на использование модальных окон (теперь они асинхронные) и обращение к локальным файлам пользователя.
Практические следствия архитектуры для разработчика
Понимая архитектуру, мы можем сформулировать «золотые правила» разработки на 1С 8.3:
&НаСервереБезКонтекста и возвращайте только нужную строку.rphost, а пользователь сможет продолжать выписывать счета.Архитектура 1С спроектирована так, чтобы скрыть от разработчика сложность SQL-запросов и сетевых протоколов, но она не прощает игнорирования принципов разделения ответственности между слоями системы. Глубокое понимание того, как rphost взаимодействует с СУБД и как контекст формы передается по сети, — это первый шаг к созданию систем, которые не «тормозят» при масштабировании.