Разработка и Конфигурация · 12 мин
Что значит «на сервере» и «на клиенте» в 1С
Что значит выполнение кода на сервере и на клиенте в 1С, директивы компиляции, отличия тонкого и толстого клиента, типичные ошибки и рекомендации разработчику.
В управляемом приложении 1С программный код выполняется в двух разных средах: на компьютере пользователя (клиент) и на сервере, где работает кластер 1С:Предприятия. Фраза «на сервере» означает, что код исполняется внутри серверного процесса и имеет доступ к базе данных напрямую, а «на клиенте» — что код работает в контексте приложения, запущенного у пользователя, и может взаимодействовать с его экраном, файлами и устройствами.
Понимание этой границы критично для любого разработчика: от неё зависит, какие объекты доступны в коде, как быстро работает программа и не возникнет ли ошибка «Процедура или функция с указанным именем не определена». Платформа сама не решает за вас, где выполнять код, — это делает разработчик с помощью директив компиляции и структуры модулей.
Ниже разобрано, чем отличаются среды исполнения, как работают директивы &НаКлиенте и &НаСервере, какие операции разрешены только на одной из сторон, как передавать данные между клиентом и сервером и какие ошибки встречаются чаще всего.
Что такое клиент и сервер в архитектуре 1С
Клиент — это приложение, через которое пользователь работает с системой: тонкий клиент, толстый клиент или веб-клиент в браузере. Клиент отвечает за отображение форм, обработку действий пользователя (клики, ввод данных) и выполнение той части логики, которая не требует обращения к базе данных.
Сервер 1С:Предприятия — это отдельный процесс (кластер), который выполняет прикладной код, обращается к СУБД (MS SQL, PostgreSQL, Oracle или файловой базе) и возвращает клиенту готовые результаты. В файловом варианте базы роль сервера частично выполняет сам клиент, но в клиент-серверном варианте это физически разные машины, иногда в разных дата-центрах.
Ключевое следствие: каждый переход от клиента к серверу — это сетевой вызов с сериализацией данных. Десять мелких серверных вызовов в цикле могут работать в разы медленнее, чем один вызов, который выполнит всю работу на сервере и вернёт итог.
Директивы компиляции: как указать, где выполняется код
В модулях форм и общих модулях место исполнения задаётся директивами перед объявлением процедуры или функции. Основные директивы: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста и &НаКлиентеНаСервереБезКонтекста.
Директива &НаКлиенте означает, что код доступен в клиентском контексте: здесь можно работать с элементами формы, показывать предупреждения, открывать диалоги выбора файлов. Директива &НаСервере даёт доступ к запросам, объектам базы данных и серверным прикладным механизмам, но коду недоступны интерактивные действия с пользователем.
Директива &НаКлиентеНаСервереБезКонтекста используется для вспомогательных функций, которые должны работать на обеих сторонах — например, расчёт суммы строки по цене и количеству. Такой код компилируется дважды и не имеет доступа ни к реквизитам формы как к объекту, ни к серверным механизмам.
&НаКлиенте
Процедура РассчитатьИтог(Команда)
Итог = ПолучитьИтогНаСервере(Объект.Ссылка);
ПоказатьПредупреждение(, "Итог: " + Итог);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьИтогНаСервере(Ссылка)
Запрос = Новый Запрос("ВЫБРАТЬ СУММА(Т.Сумма) КАК Итог ИЗ Документ.Реализация.Товары КАК Т ГДЕ Т.Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Возврат Выборка.Итог;
КонецФункцииЧто можно делать только на клиенте
Клиентская сторона отвечает за всё, что связано с пользователем и его компьютером. На клиенте доступно открытие и закрытие форм, вывод предупреждений и вопросов, работа с буфером обмена, диалоги выбора и сохранения файлов, взаимодействие с торговым оборудованием и внешними компонентами, установленными на рабочем месте.
Также на клиенте выполняются обработчики событий формы, связанные с действиями пользователя: ПриИзменении поля ввода, ПередЗаписью в интерактивной части, команды формы. Важно понимать, что событие формы возникает на клиенте, но часть обработчиков платформа вызывает на сервере — например, ПриСозданииНаСервере явно указывает это в имени.
Ограничение клиента принципиально: в тонком и веб-клиенте недоступны прямые запросы к базе, объектная модель данных (ДокументОбъект, СправочникОбъект) и транзакции. Попытка использовать их приведёт к ошибке компиляции или выполнения.
Что можно делать только на сервере
Серверная сторона — единственное место, где выполняется работа с данными: запросы, чтение и запись объектов, проведение документов, обращения к регистрам, выполнение фоновых заданий и регламентных операций. Именно здесь действуют права доступа, транзакции и механизмы блокировок.
Обратное ограничение: на сервере нельзя показать пользователю предупреждение, задать вопрос или открыть диалог выбора файла. Серверный код не знает, кто именно сидит за экраном в данный момент, и работает в отдельном сеансе. Если нужно сообщить результат пользователю, сервер возвращает значение клиенту, а тот уже показывает его интерфейсными средствами.
Также на сервере обычно размещают всю тяжёлую бизнес-логику: проверки заполнения, расчёты по большим выборкам, обмены с внешними системами через HTTP. Это снижает нагрузку на рабочие места и централизует логику в одном месте.
Клиент и сервер: распределение возможностей
Интерфейс, формы, диалоги, локальные файлы, оборудование. Нет доступа к запросам и объектной модели данных (кроме толстого клиента в режиме обычного приложения).
Запросы, запись объектов, проведение, транзакции, фоновые задания. Нет доступа к интерфейсу и диалогам с пользователем.
Код доступен на обеих сторонах, но внутри него действуют ограничения той среды, где он реально выполняется.
Как клиент и сервер обмениваются данными
Передача данных между сторонами происходит через параметры и возвращаемые значения серверных процедур и функций. Но передавать можно не всё: данные должны быть сериализуемыми — то есть платформа должна уметь упаковать их для передачи по сети.
Без проблем передаются примитивные типы (строки, числа, даты, булево), ссылки на объекты базы, структуры, массивы, таблицы значений (с оговорками). Нельзя передать с сервера на клиент объект типа ДокументОбъект или запрос — они существуют только в серверном контексте. Типичное решение: на сервере объект преобразуется в структуру или таблицу значений, и уже она уходит клиенту.
В формах данные объекта хранятся в реквизитах формы, и платформа автоматически синхронизирует их между клиентом и сервером при серверных вызовах. Именно поэтому процедуры &НаСервере (с контекстом) дороже, чем &НаСервереБезКонтекста: при вызове с контекстом вся форма сериализуется, передаётся на сервер и возвращается обратно.
Типичные ошибки и как их избежать
Самая частая ошибка — попытка выполнить запрос или обратиться к объекту базы в клиентской процедуре тонкого клиента. Платформа сообщит, что переменная не определена или метод недоступен. Решение: перенести работу с данными в серверную функцию, а из клиента вызвать её.
Вторая распространённая проблема — серверные вызовы в цикле. Например, при изменении строки табличной части код для каждой строки вызывает серверную функцию получения цены. Правильный подход — собрать нужные данные в массив или таблицу и получить всё одним вызовом, либо рассчитать то, что возможно, прямо на клиенте.
Третья группа ошибок связана с непониманием контекста: разработчик обращается к реквизиту формы из процедуры &НаСервереБезКонтекста, где формы как объекта не существует. Нужно либо сменить директиву на &НаСервере, либо передавать значения реквизитов параметрами.
Как проверить, что код работает правильно
Проверка начинается с компиляции: конфигуратор при проверке модулей с включёнными режимами «Тонкий клиент», «Веб-клиент» и «Сервер» покажет ошибки недоступности методов ещё до запуска. Всегда выполняйте проверку конфигурации по всем используемым режимам, а не только по тому, в котором разрабатываете.
Далее — практический тест в целевом клиенте. Если пользователи работают в веб-клиенте, недостаточно проверить поведение в толстом: ряд методов и расширений (например, работа с файлами) ведёт себя иначе и требует подключения расширения работы с файлами в браузере.
Производительность серверных вызовов удобно оценивать через замер времени или технологический журнал: если интерактивное действие занимает больше секунды-двух, стоит посчитать количество серверных вызовов и объём передаваемых данных.
Как проверить результат
Нет ошибок компиляции для тонкого, веб-клиента и сервера
Ошибки вида «переменная не определена» или «метод недоступен» в отдельных режимах
Один-два вызова или отсутствие вызовов в цикле
Вызовы внутри цикла по строкам табличной части
Передаются ссылки и примитивные типы
Передаётся вся форма ради одного реквизита или объектная модель
Практические рекомендации по распределению кода
Общее правило: на клиенте остаётся минимум — обработка действий пользователя, простые пересчёты в строках, управление видимостью элементов. Всё, что требует данных из базы, уходит на сервер, причём желательно в общие модули с признаком «Сервер», чтобы логика была переиспользуемой и тестируемой.
Для функций, нужных на обеих сторонах (форматирование, простые расчёты), создавайте общие модули с признаками «Клиент» и «Сервер» одновременно, либо используйте директиву &НаКлиентеНаСервереБезКонтекста в формах. Не дублируйте один и тот же код в двух модулях — это гарантированный источник расхождений при доработках.
Если операция длительная (загрузка большого файла, массовая обработка), выполняйте её в фоновом задании на сервере, а клиенту возвращайте только прогресс и итог. Так интерфейс останется отзывчивым, а пользователь не получит «зависшую» форму.
- 1Определите, какие данные нужны коду: если требуется запрос или объект базы — место кода на сервере.
- 2Создайте серверную функцию (предпочтительно &НаСервереБезКонтекста или в общем серверном модуле) с параметрами-ссылками.
- 3Из клиентской процедуры вызовите серверную функцию и получите результат.
- 4Покажите результат пользователю клиентскими средствами (сообщение, предупреждение, обновление формы).
- 5Проверьте конфигурацию во всех режимах и протестируйте в целевом клиенте.
Что важно запомнить
Клиент отвечает за интерфейс и действия пользователя, сервер — за данные и бизнес-логику. Директивы &НаКлиенте и &НаСервере определяют место исполнения кода. Минимизируйте серверные вызовы, передавайте только сериализуемые данные и проверяйте конфигурацию во всех режимах работы.
Частые вопросы
Чем отличается &НаСервере от &НаСервереБезКонтекста?
Процедура &НаСервере имеет доступ к данным формы как к объекту, но при её вызове вся форма сериализуется и передаётся на сервер. &НаСервереБезКонтекста работает без формы — быстрее и дешевле, но реквизиты формы нужно передавать параметрами.
Можно ли выполнить запрос на клиенте в тонком клиенте?
Нет, в тонком и веб-клиенте запросы и объектная модель данных недоступны. Запрос выполняется в серверной функции, а клиенту возвращается результат — например, таблица значений или структура.
Почему код работает в толстом клиенте, но падает в тонком?
Толстый клиент поддерживает больше возможностей, включая часть серверной функциональности. Тонкий и веб-клиент ограничены строже. Проверяйте конфигурацию во всех режимах и тестируйте именно в том клиенте, в котором работают пользователи.
Что можно передать с сервера на клиент?
Примитивные типы, ссылки, структуры, массивы, таблицы значений и другие сериализуемые данные. Нельзя передать объекты типа ДокументОбъект, запрос, построитель отчёта — они существуют только в серверном контексте.
Как уменьшить количество серверных вызовов?
Объединяйте несколько операций в одну серверную функцию, передавайте данные пакетами (массивы, таблицы), кэшируйте редко меняющиеся данные в параметрах сеанса или на клиенте и выполняйте простые расчёты без обращения к серверу.
Где выполняется код в файловом варианте базы?
Формально разделение на клиента и сервер сохраняется: клиентская часть работает в процессе клиентского приложения, а «серверный» код — в том же процессе, но в отдельном контексте с теми же ограничениями по директивам. Поэтому правила разделения кода соблюдаются и в файловом режиме.