При разработке управляемого интерфейса в 1С разработчики часто сталкиваются с ситуацией, когда весь код процедуры выполняется на клиенте, замер производительности не показывает выполнения серверных модулей, однако счетчик в показателях производительности настойчиво фиксирует увеличение количества серверных вызовов. Рассмотрим подробнее, почему возникают так называемые неявные вызовы сервера, чем они опасны для производительности и как правильно локализовать и устранить эти обращения.
В платформе 1С:Предприятие 8.3 клиентское приложение хранит не всю модель формы, а лишь ее отображение. Некоторые действия с элементами интерфейса или данными требуют синхронизации состояния с сервером или пересчета разметки формы. Выясним основные причины, приводящие к скрытым серверным вызовам:
Заголовок у декораций-надписей или кнопок. В Синтаксис-помощнике для многих из этих свойств прямо указано: «Изменение свойства на клиенте требует обращения к серверу».Видимость у групп элементов формы (ГруппаФормы) почти всегда инициирует серверный контекстный пересчет компоновки формы, в то время как скрытие отдельного простого поля ввода может выполняться локально.ЭлементСправочника.Реквизит) в клиентском коде заставляет платформу выполнять неявный серверный запрос за данными.ТекущиеДанные таблицы, если запрошенные колонки не были закэшированы клиентом.ПредопределенноеЗначение() или первичное обращение к клиентскому общему модулю, чей скомпилированный код еще не загружен в сеанс.Разберем по шагам, какими инструментами можно точно определить строку кода, провоцирующую сетевой запрос на сервер:
F10 или F11. Изменение счетчика вызовов после выполнения конкретной строки сразу покажет виновника.CALL и SCALL в конфигурационном файле logcfg.xml. Журнал зафиксирует стек вызова на встроенном языке с указанием точного модуля и номера строки, сформировавшей сетевой пакет.Частая ошибка — программное изменение текста подсказки или надписи на форме через свойство Элементы.НадписьИнфо.Заголовок = "Новый текст". Это действие вызывает неявное обращение к серверу. Правильный подход заключается в связывании элемента с реквизитом формы.
Разберем последовательность действий:
Строка, например, ТекстИнформационнойНадписи.ТекстИнформационнойНадписи.Элементы.Посмотрим на пример правильного изменения текста на клиенте:
&НаКлиенте
Процедура ОбработатьВыборНаКлиенте()
// Изменение строкового реквизита формы выполняется локально на клиенте
// и не порождает вызовов сервера:
ТекстИнформационнойНадписи = "Статус документа: Проверен";
КонецПроцедуры
Если алгоритм требует изменения состава элементов, заголовков кнопок, видимости сложных групп или создания элементов управления «на лету», все эти операции необходимо выполнять строго в серверном контексте при инициализации формы. Это исключает повторную передачу структуры формы по сети.
Посмотрим на пример правильной настройки интерфейса при открытии:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Все модификации структуры элементов выполняем здесь:
Если Параметры.РежимПросмотра Тогда
Элементы.ГруппаСогласования.Видимость = Ложь;
Элементы.КнопкаВыполнить.Заголовок = "Закрыть";
КонецЕсли;
КонецПроцедуры
Когда требуется менять видимость, доступность или цвет элементов в зависимости от введенных данных, рекомендуется отказаться от программного дергания свойств Элементы...Видимость на клиенте. Вместо этого настроим правила условного оформления формы заранее на сервере, привязав условия к реквизитам-флагам.
При изменении пользователем реквизита формы платформа применит правила условного оформления на стороне клиента без единого сетевого запроса к серверу.