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