Разработка сложных интерфейсов в среде 1С:Предприятие 8.3 на управляемых формах часто преподносит неприятные сюрпризы в виде низкой производительности. Одной из классических проблем является возникновение «фризов» или задержек (от 2 до 6 секунд) при программном изменении свойства Видимость элементов формы. Особенно остро эта проблема проявляется в клиент-серверном варианте работы, в то время как на файловой базе всё может работать мгновенно. Рассмотрим причины этого поведения и разберем эффективные методы решения.
Для начала проанализируем ситуацию: на форме АРМ (автоматизированного рабочего места) расположено несколько динамических списков и множество кнопок. При выборе строки в таблице программа должна показать только актуальные команды в контекстном меню. Программист меняет свойство Видимость для десятка элементов, и форма «замирает».
Выясним причину такого поведения платформы. В управляемом приложении за отрисовку интерфейса отвечает клиентское приложение, но логика компоновки (Layout) элементов находится на стороне сервера. Когда мы изменяем свойство Видимость, платформа выполняет следующие действия:
Важно отметить, что в старых версиях платформы (до 8.3.15, включая популярную 8.3.10) механизмы оптимизации отрисовки работали слабее, и почти каждое изменение видимости приводило к полноценному серверному вызову.
Самый простой и быстрый способ избежать пересчета компоновки формы — использовать свойство Доступность (Enabled). Проанализируем разницу: при изменении доступности элемент остается на своем месте, его геометрические размеры не меняются, меняется лишь визуальное состояние (он становится серым и некликабельным). Платформе не нужно пересчитывать положение других элементов, поэтому такая операция выполняется на клиенте мгновенно.
Однако этот способ имеет эстетический недостаток: неактивные кнопки продолжают занимать место, загромождая интерфейс. Если это критично для пользователя, перейдем к более сложным методам.
Рассмотрим решение, которое применил автор темы после долгих тестов. Вместо того чтобы управлять видимостью десяти различных кнопок, мы можем создать фиксированное количество элементов (например, 4 универсальные кнопки) и менять их внутренние свойства, которые не влияют на Layout формы.
Разберем, как это реализовать. Вместо кода:
Элементы.КнопкаСоздать.Видимость = Ложь;
Элементы.КнопкаУдалить.Видимость = Истина;
Мы используем изменение заголовка, картинки и действия. Посмотрим на пример реализации логики в событии Выбор или ПриАктивизацииСтроки:
&НаКлиенте
Процедура ТаблицаРасписанияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ТекущиеДанные = Элементы.ТаблицаРасписания.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
// Вместо Видимости меняем только наполнение существующих кнопок
Если ЗначениеЗаполнено(ТекущиеДанные.ЗаписьНаПрием) Тогда
Элементы.КонтекстноеМеню_Кнопка1.Заголовок = "Просмотреть прием";
Элементы.КонтекстноеМеню_Кнопка1.ИмяКоманды = "КомандаПросмотреть";
Иначе
Элементы.КонтекстноеМеню_Кнопка1.Заголовок = "Создать запись";
Элементы.КонтекстноеМеню_Кнопка1.ИмяКоманды = "КомандаСоздать";
КонецЕсли;
// Вызов меню через эмуляцию клавиш (если требуется)
Скрипт = Новый COMОбъект("WScript.Shell");
Скрипт.SendKeys("+{F10}");
КонецПроцедуры
Преимущество метода: Количество элементов в дереве формы остается неизменным. Платформа не инициирует тяжелый пересчет интерфейса, и пользователь не ощущает задержек.
Если вы хотите точно убедиться, что именно вызывает тормоза, необходимо проанализировать работу системы с помощью Технологического журнала (ТЖ). Обычный замер производительности в конфигураторе часто не показывает внутренние механизмы платформы по отрисовке Layout.
Настройте сбор события CALL. В логах вы увидите событие ContextCall в момент изменения видимости. Если время выполнения этого события совпадает с длительностью «фриза», значит, гипотеза о серверном пересчете формы подтверждена. Также обратите внимание на количество данных, передаваемых между сервером и клиентом.
Часто «тормозит» не сама видимость, а побочный эффект в виде обновления динамических списков. Проанализируем настройки ваших списков на форме:
ПриАктивизацииСтроки основного списка не вызывается метод Элементы.ДругойСписок.Обновить().Если стандартное контекстное меню продолжает работать медленно, рассмотрим более радикальные, но эффективные способы:
ОткрытьФорму() в координатах курсора. Поскольку это отдельный объект, открытие такой формы не вызывает пересчета основной тяжелой формы АРМ.ТекущаяСтраница. Это работает быстрее, чем перебор видимости каждого элемента в отдельности.Подведем итог. Чтобы избавиться от тормозов при изменении видимости, выполните следующие шаги:
Видимость на Доступность.Видимость. Лучше один раз скрыть целую группу, чем 10 отдельных кнопок.Применяя эти подходы, вы сможете создать отзывчивый интерфейс даже на очень загруженных формах в крупных корпоративных системах.