Как найти и устранить неявные вызовы сервера в управляемых формах 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке управляемого интерфейса в 1С разработчики часто сталкиваются с ситуацией, когда весь код процедуры выполняется на клиенте, замер производительности не показывает выполнения серверных модулей, однако счетчик в показателях производительности настойчиво фиксирует увеличение количества серверных вызовов. Рассмотрим подробнее, почему возникают так называемые неявные вызовы сервера, чем они опасны для производительности и как правильно локализовать и устранить эти обращения.

Почему возникают неявные вызовы сервера

В платформе 1С:Предприятие 8.3 клиентское приложение хранит не всю модель формы, а лишь ее отображение. Некоторые действия с элементами интерфейса или данными требуют синхронизации состояния с сервером или пересчета разметки формы. Выясним основные причины, приводящие к скрытым серверным вызовам:

  1. Изменение свойств элементов формы на клиенте: прямое изменение таких свойств, как Заголовок у декораций-надписей или кнопок. В Синтаксис-помощнике для многих из этих свойств прямо указано: «Изменение свойства на клиенте требует обращения к серверу».
  2. Управление видимостью структурных элементов: изменение свойства Видимость у групп элементов формы (ГруппаФормы) почти всегда инициирует серверный контекстный пересчет компоновки формы, в то время как скрытие отдельного простого поля ввода может выполняться локально.
  3. Сброс кэша формы (состояние «грязной формы»): динамическая модификация структуры элементов на клиенте приводит к инвалидации кэша формы на сервере. В результате при следующем штатном серверном вызове клиент вынужден передавать всю модель формы целиком, что резко увеличивает сетевой трафик.
  4. Разыменование ссылок через точку на клиенте: попытка получить значение реквизита через ссылку (например, ЭлементСправочника.Реквизит) в клиентском коде заставляет платформу выполнять неявный серверный запрос за данными.
  5. Чтение данных из динамических списков: обращение к свойству ТекущиеДанные таблицы, если запрошенные колонки не были закэшированы клиентом.
  6. Первое обращение к функциям платформы или модулям: вызовы методов вроде ПредопределенноеЗначение() или первичное обращение к клиентскому общему модулю, чей скомпилированный код еще не загружен в сеанс.

Способы поиска и локализации скрытых вызовов

Разберем по шагам, какими инструментами можно точно определить строку кода, провоцирующую сетевой запрос на сервер:

  1. Пошаговая отладка с панелью показателей производительности: включаем в режиме «1С:Предприятие» отображение показателей производительности (где выводятся счетчики обращений к серверу и объем переданных данных). Запускаем отладку и проходим проблемный алгоритм построчно клавишами F10 или F11. Изменение счетчика вызовов после выполнения конкретной строки сразу покажет виновника.
  2. Проверка вызовов в параметрах запуска: в конфигураторе открываем меню Сервис → Параметры → Запуск 1С:Предприятия → Дополнительные и включаем флаг «Проверка серверных вызовов в обработчиках событий». При выполнении кода в событиях формы платформа будет выдавать явную ошибку времени выполнения при попытке неявного обращения к серверу.
  3. Анализ технологического журнала: настраиваем сбор событий CALL и SCALL в конфигурационном файле logcfg.xml. Журнал зафиксирует стек вызова на встроенном языке с указанием точного модуля и номера строки, сформировавшей сетевой пакет.

Решение 1: Замена динамического заголовка на связанный реквизит формы

Частая ошибка — программное изменение текста подсказки или надписи на форме через свойство Элементы.НадписьИнфо.Заголовок = "Новый текст". Это действие вызывает неявное обращение к серверу. Правильный подход заключается в связывании элемента с реквизитом формы.

Разберем последовательность действий:

  1. В редакторе формы создаем новый реквизит формы с типом Строка, например, ТекстИнформационнойНадписи.
  2. Добавляем на форму элемент с видом Поле надписи (или обычное поле ввода с видом Поле надписи) и связываем его путь к данным с созданным реквизитом ТекстИнформационнойНадписи.
  3. В клиентском коде меняем значение реквизита формы напрямую, без обращения к коллекции Элементы.

Посмотрим на пример правильного изменения текста на клиенте:


&НаКлиенте
Процедура ОбработатьВыборНаКлиенте()
    // Изменение строкового реквизита формы выполняется локально на клиенте
    // и не порождает вызовов сервера:
    ТекстИнформационнойНадписи = "Статус документа: Проверен";
КонецПроцедуры

Решение 2: Перенос модификации структуры элементов в «ПриСозданииНаСервере»

Если алгоритм требует изменения состава элементов, заголовков кнопок, видимости сложных групп или создания элементов управления «на лету», все эти операции необходимо выполнять строго в серверном контексте при инициализации формы. Это исключает повторную передачу структуры формы по сети.

Посмотрим на пример правильной настройки интерфейса при открытии:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Все модификации структуры элементов выполняем здесь:
    Если Параметры.РежимПросмотра Тогда
        Элементы.ГруппаСогласования.Видимость = Ложь;
        Элементы.КнопкаВыполнить.Заголовок = "Закрыть";
    КонецЕсли;
КонецПроцедуры

Решение 3: Управление интерфейсом через условное оформление

Когда требуется менять видимость, доступность или цвет элементов в зависимости от введенных данных, рекомендуется отказаться от программного дергания свойств Элементы...Видимость на клиенте. Вместо этого настроим правила условного оформления формы заранее на сервере, привязав условия к реквизитам-флагам.

При изменении пользователем реквизита формы платформа применит правила условного оформления на стороне клиента без единого сетевого запроса к серверу.

← На главную