Оптимизация клиент-серверного взаимодействия 1С: контекстные вызовы
- Интерфейс управляемого приложения «лагает» и подвисает при изменении реквизитов формы.
- Большое количество серверных вызовов в технологическом журнале по событию
CALL. - Высокий сетевой трафик между тонкими клиентами и сервером 1С.
1. Разница директив &НаСервере и &НаСервереБезКонтекста
Директива &НаСервере передает на сервер и возвращает обратно на клиент весь контекст формы (все реквизиты, элементы управления и структуры данных). Директива &НаСервереБезКонтекста передает только явно указанные параметры, экономя сериализацию данных.
2. Рефакторинг кода: переход на вызовы без контекста
// ПЛОХО: Передается вся форма со всеми строками табличных частей!
&НаКлиенте
Процедура НоменклатураПриИзменении(Элемент)
ПолучитьЦенуНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПолучитьЦенуНаСервере()
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
ТекущаяСтрока.Цена = Ценообразование.ПолучитьЦену(ТекущаяСтрока.Номенклатура);
КонецПроцедуры
// ХОРОШО: Передаются только конкретные значения, форма не гоняется по сети
&НаКлиенте
Процедура НоменклатураПриИзменении(Элемент)
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
ТекущиеДанные.Цена = ПолучитьЦенуБезКонтекста(ТекущиеДанные.Номенклатура, Объект.Дата);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьЦенуБезКонтекста(Знач Номенклатура, Знач Дата)
Возврат Ценообразование.ПолучитьЦену(Номенклатура, Дата);
КонецФункции3. Минимизация вызовов внутри циклов на клиенте
Никогда не вызывайте сервер внутри цикла обработки табличной части на клиенте. Выполняйте всю обработку за один серверный вызов.
Частые вопросы (FAQ)
Почему директива &НаСервере замедляет работу через медленный интернет?
При каждом вызове &НаСервере сериализуется весь XML/JSON контекст управляемой формы. Если в табличной части 1000 строк, размер пакета может достигать нескольких мегабайт на каждый клик.
Когда обязательно использовать директиву &НаСервере с контекстом?
Только тогда, когда на сервере требуется напрямую модифицировать свойства элементов интерфейса, видимость кнопок или перечитывать объект целиком.
Как замерить количество клиент-серверных вызовов в 1С?
В режиме '1С:Предприятие' включите 'Показывать показатели производительности' в меню настроек параметров (отобразится счетчик вызовов, объем переданных данных и время сервера).
Что такое кэширование на клиенте?
Сохранение редко меняющихся данных (например, структуры констант или настроек пользователя) в переменных модуля клиентского приложения для исключения повторных запросов к серверу.