Разбираемся с одной из ключевых директив платформы 1С 8.3. В этой статье вы узнаете, зачем нужна директива НаСервереБезКонтекста, чем она отличается от стандартного НаСервере и как её правильное использование повышает производительность приложений. Мы приведём наглядные примеры кода и практические рекомендации для разработчиков.
Что такое директивы компиляции в 1С
Директивы компиляции — это специальные инструкции, которые определяют, где будут выполняться процедуры и функции: на клиенте, на сервере или одновременно в разных режимах работы платформы.
Наиболее востребованные директивы компиляции:
-
&НаКлиенте; -
&НаСервере; -
&НаСервереБезКонтекста; -
&НаКлиентеНаСервере; -
&НаКлиентеНаСервереБезКонтекста.
Каждая из них влияет на то, как работает модуль, какие данные доступны во время выполнения и какой объем информации передается между сторонами.
Например, если процедуры и функции работают с элементами формы, потребуется доступ к форме и её реквизитам. Если же нужен только запрос к базе, рациональнее использовать выполнение без передачи лишних объектов.
Что важно запомнить
-
Директивы компиляции определяют место выполнения кода.
-
От выбора директивы зависит производительность приложения.
-
Избыточные обращения к серверу могут замедлять работу системы.
-
Грамотное разделение логики между клиентом и сервером уменьшает нагрузку на инфраструктуру.
Директива НаСервереБезКонтекста: определение и назначение
&НаСервереБезКонтекста означает, что процедуры и функции выполняются на сервере, но без доступа к контексту формы.
Это важное ограничение. Внутри такой процедуры нельзя обратиться к:
-
реквизитам формы;
-
элементам интерфейса;
-
коллекциям элементов;
-
свойствам текущей формы.
Однако доступны:
-
запросы к базе;
-
работа с объектами метаданных;
-
вычисления;
-
обработка переданных параметров.
Основное назначение директивы — минимизировать объем информации, который передается при серверном вызове. Вместо полного состояния формы на сервер отправляются только необходимые параметры.
Такой подход значительно ускоряет выполнение операций, особенно если форма содержит большое количество реквизитов.
Что важно запомнить
-
&НаСервереБезКонтекстане имеет доступа к контексту формы. -
На сервер передаются только параметры вызова.
-
Это одна из самых эффективных директив компиляции для оптимизации.
-
Она подходит для операций, работающих только с базой и вычислениями.
Отличие НаСервереБезКонтекста от НаСервере
Главное различие заключается в наличии или отсутствии контекста формы.
При использовании &НаСервере:
-
весь контекст формы передается на сервер;
-
доступны реквизиты и элементы формы;
-
увеличивается объем передаваемых данных;
-
возрастает время выполнения операции.
При использовании &НаСервереБезКонтекста:
-
контекст формы отсутствует;
-
передаются только параметры;
-
серверный вызов выполняется быстрее;
-
уменьшается нагрузка на сеть и приложение.
Например, если необходимо рассчитать скидку по сумме заказа, достаточно передать сумму и идентификатор клиента. Передавать весь контекст формы в таком случае нецелесообразно.
Именно поэтому многие гуру 1С, включая обсуждения от гуру 21 03, рекомендуют использовать эту директиву везде, где это возможно.
Что важно запомнить
-
&НаСервереработает с формой. -
&НаСервереБезКонтекстаработает только с параметрами. -
Чем меньше передается информации, тем быстрее работает сервер.
-
Выбор правильной директивы напрямую влияет на производительность.
Когда использовать НаСервереБезКонтекста: примеры и сценарии
Эта директива особенно эффективна, когда процедурам и функциям требуется доступ к базе, но не нужен контекст формы.
Типичные сценарии:
- Получение справочной информации. Например, загрузка списка банков или ставок НДС.
- Расчет значений. Скидки, бонусы, комиссии и другие вычисления лучше выполнять на сервере, передавая только исходные параметры.
- Проверка данных. Можно проверить существование контрагента или наличие товара в справочнике без передачи формы целиком.
- Выполнение запросов. Если модуль содержит запросы к регистрам или справочникам, использование
&НаСервереБезКонтекстабудет наиболее рациональным.
Рекомендуем именно такое подходы, поскольку они сокращают время отклика приложения и уменьшают число тяжелых операций.
Что важно запомнить
-
Используйте директиву, если контекст формы не нужен.
-
Выполняйте запросы и вычисления на сервере.
-
Не передавайте лишние данные.
-
Чем легче серверный вызов, тем выше скорость работы.
Практические примеры кода
Рассмотрим распространенный пример получения цены товара.
&НаКлиенте
Процедура ТоварПриИзменении(Товар)
Цена = ПолучитьЦенуСервера(Товар);
Элементы.Цена.Значение = Цена;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьЦенуСервера(Товар)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Цены.Цена КАК Цена
|ИЗ
| РегистрСведений.Цены КАК Цены
|ГДЕ
| Цены.Номенклатура = &Товар";
Запрос.УстановитьПараметр("Товар", Товар);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Цена;
КонецЕсли;
Возврат 0;
КонецФункции
В данном примере:
-
клиентская процедура вызывает функцию;
-
функция выполняется на сервере;
-
контекст формы не передается;
-
на сервер отправляется только ссылка на товар;
-
возвращаются только необходимые данные.
Такой код считается хорошей практикой и широко применяется в современных конфигурациях.
Многие гуру 21 03 отмечают, что именно подобное разделение логики делает модуль более удобным для сопровождения.
Что важно запомнить
-
Храните бизнес-логику на сервере.
-
На клиенте оставляйте только взаимодействие с интерфейсом.
-
Используйте процедуры и функции без доступа к форме, если это возможно.
-
Избегайте передачи большого объема данных.
Оптимизация клиент-серверного взаимодействия
При разработке в 1С важно не только правильно писать код, но и сокращать количество обращений к серверу.
Практические рекомендации:
-
Объединяйте несколько запросов в один серверный вызов.
-
Не вызывайте сервер внутри циклов.
-
Используйте
&НаСервереБезКонтекста, если контекст формы не требуется. -
Переносите тяжелые процедуры и функции на сервер.
-
Анализируйте, какие директивы компиляции действительно необходимы.
Частая ошибка начинающих разработчиков — использование &НаСервере по умолчанию. В результате на сервер передается весь контекст формы, хотя фактически нужны только отдельные параметры.
Рекомендуем регулярно пересматривать существующий модуль, искать лишние обращения к форме и оптимизировать серверный вызов.
Для компаний, использующих крупные конфигурации и работающих с большими объемами информации, правильное применение директив компиляции позволяет заметно повысить скорость работы пользователей, снизить нагрузку на инфраструктуру и упростить сопровождение решений.
Что важно запомнить
-
Минимизируйте количество обращений к серверу.
-
Передавайте только необходимые данные.
-
Используйте директивы компиляции осознанно.
-
Оптимизация небольших участков кода дает значительный эффект в масштабах системы.
FAQ
- Что делает директива НаСервереБезКонтекста? Она запускает процедуры и функции на сервере без передачи контекста формы, благодаря чему уменьшается объем передаваемых данных и ускоряется работа приложения.
- Чем НаСервереБезКонтекста отличается от НаСервере?
&НаСервереимеет доступ к форме, а&НаСервереБезКонтекстаработает только с переданными параметрами. - Можно ли обращаться к реквизитам формы? Нет. Контекст формы в таком режиме недоступен.
- Когда лучше использовать эту директиву? Когда требуется выполнить запрос, обработать данные или произвести вычисления без взаимодействия с интерфейсом.
- Улучшает ли она производительность? Да. За счет уменьшения объема передаваемой информации серверный вызов выполняется быстрее, а приложение становится более отзывчивым.
Выводы
Грамотное использование &НаСервереБезКонтекста позволяет значительно повысить производительность решений 1С, однако определить оптимальную архитектуру процедур и функций, правильно организовать модуль и исключить лишние серверные вызовы бывает непросто. Если вы хотите ускорить работу системы, оптимизировать существующий код или получить экспертные рекомендации по разработке и сопровождению 1С, обратитесь за консультацией к специалистам — это поможет избежать ошибок и сэкономить время на дальнейшей поддержке решения.