Вопрос о разделении кода на клиентский и серверный в условиях, когда вся база данных — это просто файл на жестком диске (вариант .1CD), часто ставит в тупик начинающих разработчиков. Кажется нелогичным прописывать директивы &НаСервере и &НаКлиенте, когда физического сервера приложений и SQL-сервера в системе нет. В этой статье мы подробно разберем, как устроена внутренняя архитектура 1С, зачем нужна "имитация" сервера и почему без этого механизма современная разработка была бы невозможна.
Разберем ситуацию: вы запускаете файловую базу 1С. В операционной системе запущен всего один процесс — 1cv8.exe. Однако внутри этого процесса платформа создает сложную структуру. Роль сервера приложений выполняет так называемый встроенный сервер. Это программный слой, который полностью повторяет логику работы кластера серверов 1С.
Проанализируем, зачем это сделано. Если бы в файловом режиме код писался без разделения на контексты, разработчику пришлось бы создавать две разные конфигурации: одну для работы "дома на флешке", а другую — для работы в корпоративной сети на 500 пользователей. Благодаря встроенному серверу, платформа обеспечивает полную идентичность исполнения кода в любых условиях.
Одной из самых важных причин разделения является сериализация данных. Рассмотрим, что происходит, когда управление переходит от клиентской процедуры к серверной. Даже в файловом режиме, находясь внутри одного процесса, данные не передаются "как есть".
Выясним причину такой строгости. Когда мы вызываем серверный метод, платформа "упаковывает" (сериализует) параметры в специальный формат и "распаковывает" их на стороне сервера. Это делается для того, чтобы:
ТабличныйДокумент (в некоторых контекстах), ЭлементыФормы или ДиалогВыбораФайла. Если бы платформа не имитировала этот процесс в файловом режиме, программист мог бы случайно передать форму на сервер, и такая программа мгновенно "упала" бы при переходе на реальный SQL-сервер.Посмотрим на пример кода, который демонстрирует это разделение:
&НаКлиенте
Процедура КомандаПолучитьКурс(Команда)
// Мы находимся в контексте клиента (интерфейс)
КурсВалюты = ПолучитьКурсНаСервере(Объект.Валюта, Объект.Дата);
Сообщить("Текущий курс: " + КурсВалюты);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьКурсНаСервере(Валюта, Дата)
// Здесь мы имеем доступ к базе данных, но не видим форму напрямую
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Курс ИЗ РегистрСведений.КурсыВалют ГДЕ Валюта = &Валюта И Период <= &Дата";
// ... логика выполнения запроса
Возврат Результат;
КонецФункции
Рассмотрим подробнее, как платформа управляет памятью. В 1С клиентская и серверная части имеют разные области видимости переменных. В файловом режиме это разделение поддерживается программно на уровне виртуальной машины 1С.
Это критически важно для производительности. Платформа спроектирована так, что тяжеловесные объекты, такие как Запрос, ВыборкаИзРезультатаЗапроса или МенеджерВременныхТаблиц, могут быть созданы только на сервере. Они потребляют много ресурсов и напрямую взаимодействуют с файлом базы данных. Если бы клиент имел к ним прямой доступ, интерфейс программы бы постоянно "зависал" при выполнении сложных операций.
Таким образом, директива &НаСервере — это своего рода сигнал системе: "Сейчас я буду работать с данными, выдели для этого ресурсы и обеспечь безопасность транзакций".
Проанализируем ситуацию с точки зрения безопасности и целостности. Платформа 1С строго разграничивает уровни доступа. В любой архитектуре (будь то файловая база или огромный кластер) прямой доступ к таблицам базы данных (файлу .1CD или таблицам MS SQL/PostgreSQL) имеет только серверный контекст.
Разберем по шагам путь данных:
Такая жесткая структура позволяет 1С гарантировать, что бизнес-логика будет выполнена корректно вне зависимости от того, где физически лежат данные.
Особенно наглядно работа директив проявляется при использовании веб-клиента с файловой базой. Представьте, что ваша файловая база опубликована на веб-сервере Apache.
В этом случае имитация превращается в реальность:
Здесь директивы &НаСервере и &НаКлиенте физически разделяют исполнение кода между разными компьютерами, связанными через интернет. Если бы в коде не было этих директив, программа просто не смогла бы понять, какую часть кода должен выполнить браузер, а какую — сервер.
Выясним, что дает нам такое понимание архитектуры. Использование директив в файловом режиме — это не "лишняя работа", а мощный инструмент стандартизации.
Основные преимущества такого подхода:
Поэтому, когда вы пишете &НаСервере в файловой базе, вы не просто следуете правилам синтаксиса — вы используете передовую технологию Embedded Server, которая делает платформу 1С одной из самых гибких систем автоматизации бизнеса в мире.