Почему в файловом режиме 1С используются директивы &НаСервере и &НаКлиенте?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Вопрос о разделении кода на клиентский и серверный в условиях, когда вся база данных — это просто файл на жестком диске (вариант .1CD), часто ставит в тупик начинающих разработчиков. Кажется нелогичным прописывать директивы &НаСервере и &НаКлиенте, когда физического сервера приложений и SQL-сервера в системе нет. В этой статье мы подробно разберем, как устроена внутренняя архитектура 1С, зачем нужна "имитация" сервера и почему без этого механизма современная разработка была бы невозможна.

Понятие встроенного сервера (Embedded Server)

Разберем ситуацию: вы запускаете файловую базу 1С. В операционной системе запущен всего один процесс — 1cv8.exe. Однако внутри этого процесса платформа создает сложную структуру. Роль сервера приложений выполняет так называемый встроенный сервер. Это программный слой, который полностью повторяет логику работы кластера серверов 1С.

Проанализируем, зачем это сделано. Если бы в файловом режиме код писался без разделения на контексты, разработчику пришлось бы создавать две разные конфигурации: одну для работы "дома на флешке", а другую — для работы в корпоративной сети на 500 пользователей. Благодаря встроенному серверу, платформа обеспечивает полную идентичность исполнения кода в любых условиях.

Механизм сериализации: граница между мирами

Одной из самых важных причин разделения является сериализация данных. Рассмотрим, что происходит, когда управление переходит от клиентской процедуры к серверной. Даже в файловом режиме, находясь внутри одного процесса, данные не передаются "как есть".

Выясним причину такой строгости. Когда мы вызываем серверный метод, платформа "упаковывает" (сериализует) параметры в специальный формат и "распаковывает" их на стороне сервера. Это делается для того, чтобы:

  1. Проверить допустимость типов: На сервере не могут существовать чисто интерфейсные объекты, такие как ТабличныйДокумент (в некоторых контекстах), ЭлементыФормы или ДиалогВыбораФайла. Если бы платформа не имитировала этот процесс в файловом режиме, программист мог бы случайно передать форму на сервер, и такая программа мгновенно "упала" бы при переходе на реальный SQL-сервер.
  2. Подготовить разработчика к сетевым задержкам: Хотя в файловом режиме передача данных происходит мгновенно в памяти, логическое разделение заставляет разработчика минимизировать количество вызовов сервера (так называемый "ping-pong").

Посмотрим на пример кода, который демонстрирует это разделение:


&НаКлиенте
Процедура КомандаПолучитьКурс(Команда)
    // Мы находимся в контексте клиента (интерфейс)
    КурсВалюты = ПолучитьКурсНаСервере(Объект.Валюта, Объект.Дата);
    Сообщить("Текущий курс: " + КурсВалюты);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьКурсНаСервере(Валюта, Дата)
    // Здесь мы имеем доступ к базе данных, но не видим форму напрямую
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ Курс ИЗ РегистрСведений.КурсыВалют ГДЕ Валюта = &Валюта И Период <= &Дата";
    // ... логика выполнения запроса
    Возврат Результат;
КонецФункции

Изоляция памяти и ресурсов

Рассмотрим подробнее, как платформа управляет памятью. В 1С клиентская и серверная части имеют разные области видимости переменных. В файловом режиме это разделение поддерживается программно на уровне виртуальной машины 1С.

Это критически важно для производительности. Платформа спроектирована так, что тяжеловесные объекты, такие как Запрос, ВыборкаИзРезультатаЗапроса или МенеджерВременныхТаблиц, могут быть созданы только на сервере. Они потребляют много ресурсов и напрямую взаимодействуют с файлом базы данных. Если бы клиент имел к ним прямой доступ, интерфейс программы бы постоянно "зависал" при выполнении сложных операций.

Таким образом, директива &НаСервере — это своего рода сигнал системе: "Сейчас я буду работать с данными, выдели для этого ресурсы и обеспечь безопасность транзакций".

Единая модель доступа к данным

Проанализируем ситуацию с точки зрения безопасности и целостности. Платформа 1С строго разграничивает уровни доступа. В любой архитектуре (будь то файловая база или огромный кластер) прямой доступ к таблицам базы данных (файлу .1CD или таблицам MS SQL/PostgreSQL) имеет только серверный контекст.

Разберем по шагам путь данных:

  1. Клиентская часть (интерфейс) запрашивает данные.
  2. Происходит вызов серверного контекста (встроенного сервера в файловом режиме).
  3. Серверный контекст обращается к СУБД (движку файловой базы).
  4. Данные возвращаются на сервер, обрабатываются и сериализуются.
  5. Результат передается обратно на клиент.

Такая жесткая структура позволяет 1С гарантировать, что бизнес-логика будет выполнена корректно вне зависимости от того, где физически лежат данные.

Тонкий клиент и веб-клиент в файловом режиме

Особенно наглядно работа директив проявляется при использовании веб-клиента с файловой базой. Представьте, что ваша файловая база опубликована на веб-сервере Apache.

В этом случае имитация превращается в реальность:

Здесь директивы &НаСервере и &НаКлиенте физически разделяют исполнение кода между разными компьютерами, связанными через интернет. Если бы в коде не было этих директив, программа просто не смогла бы понять, какую часть кода должен выполнить браузер, а какую — сервер.

Выводы для разработчика

Выясним, что дает нам такое понимание архитектуры. Использование директив в файловом режиме — это не "лишняя работа", а мощный инструмент стандартизации.

Основные преимущества такого подхода:

Поэтому, когда вы пишете &НаСервере в файловой базе, вы не просто следуете правилам синтаксиса — вы используете передовую технологию Embedded Server, которая делает платформу 1С одной из самых гибких систем автоматизации бизнеса в мире.

← На главную