Как отобразить пустую страницу на управляемой форме 1С для реализации отложенной загрузки?

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

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

В этой статье мы подробно разберем, почему так происходит, и рассмотрим проверенные способы «заставить» платформу показывать пустые вкладки.

Анализируем причину поведения платформы

Платформа «1С:Предприятие 8.3» использует интеллектуальный алгоритм компоновки интерфейса. Его главная задача — убрать из формы всё лишнее, что не несет полезной нагрузки. С точки зрения платформы, пустой контейнер (страница) бесполезен для пользователя. Поэтому на этапе отрисовки формы система проверяет наличие дочерних элементов в коллекции Элементы конкретной группы. Если коллекция пуста или у всех элементов свойство Видимость установлено в Ложь, родительская группа (страница) исключается из визуального дерева.

Важно различать свойство Видимость и фактическое отображение. Свойство Видимость — это лишь декларативное намерение разработчика. Чтобы проверить, видит ли пользователь элемент на самом деле (с учетом всех иерархических правил платформы), на стороне клиента можно использовать метод ПроверитьОтображение(). Однако для пустой страницы он всегда будет возвращать Ложь, пока на ней не появится хотя бы один объект.

Решение 1: Использование декорации-«затычки»

Самый простой и надежный способ — добавить на страницу декорацию, которая будет «держать» место. Рассмотрим этот метод подробнее.

  1. В конфигураторе выберите нужную страницу.
  2. Добавьте в нее новый элемент типа Декорация - Надпись.
  3. Оставьте заголовок декорации пустым.
  4. Для того чтобы декорация не занимала лишнего места, можно установить свойства высоты в минимальные значения, хотя пустая декорация и так практически незаметна.

Этот метод считается стандартным даже в типовых конфигурациях от самой фирмы «1С». Многие разработчики опасаются, что лишние элементы замедлят форму, но проанализировав ситуацию, можно понять, что создание одной декорации занимает ничтожные доли секунды (около 0,0003 сек) и никак не сказывается на пользовательском опыте.

Решение 2: Программное добавление декорации (подход БСП)

Если вы предпочитаете не загромождать дерево элементов в конфигураторе, можно использовать программный подход, аналогичный механизмам Библиотеки Стандартных Подсистем (БСП). Мы добавляем временный элемент при создании формы и удаляем его, как только страница наполняется реальными данными.

Рассмотрим пример кода:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Проверяем, является ли группа страницей
    ГруппаФормы = Элементы.ГруппаНужнаяСтраница;
    Если ГруппаФормы.Вид = ВидГруппыФормы.Страница Тогда
        // Добавляем пустую декорацию, чтобы страница стала видимой
        ИмяДекорации = "ВременнаяДекорация_" + ГруппаФормы.Имя;
        НоваяДекорация = Элементы.Добавить(ИмяДекорации, Тип("ДекорацияФормы"), ГруппаФормы);
        НоваяДекорация.Вид = ВидДекорацииФормы.Надпись;
        НоваяДекорация.Заголовок = " "; // Пробел или пустая строка
    КонецЕсли;
КонецПроцедуры

После того как пользователь перейдет на эту вкладку и сработает ваш код инициализации, эту декорацию можно удалить методом Элементы.Удалить().

Решение 3: Настройка свойств родительской группы страниц

Существует еще один изящный способ, который позволяет обойтись без добавления декораций на каждую страницу. Мы можем повлиять на поведение всей группы страниц (контейнера вкладок).

Проанализируем шаги настройки:

  1. Найдите в дереве элементов корень страниц (элемент типа Группа - Страницы).
  2. Установите свойство Высота значение 1.
  3. Установите свойство РастягиватьПоВертикали в значение Нет.

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

Реализация отложенной загрузки (Lazy Loading)

Теперь, когда мы добились отображения пустой страницы, выясним, как правильно организовать подгрузку данных. Главная цель — не нагружать сервер тяжелыми запросами при открытии формы, если пользователь даже не собирается заглядывать на определенные вкладки.

Для этого используется событие группы страниц ПриСменеСтраницы. Разберем пример реализации:


&НаКлиенте
Процедура ГруппаСтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница)
    
    // Проверяем, на какую страницу перешел пользователь
    Если ТекущаяСтраница.Имя = "ГруппаОтчеты" Тогда
        
        // Проверяем, не заполняли ли мы ее ранее (чтобы не дублировать запросы)
        Если Элементы.Найти("СписокОтчетов") = Неопределено Тогда
            СоздатьЭлементыОтложенноНаСервере();
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

&НаСервере
Процедура СоздатьЭлементыОтложенноНаСервере()
    // Здесь выполняется тяжелый запрос к БД и программное создание элементов
    // Например, добавление динамического списка или таблицы
    // ...
    
    // Если на странице была декорация-затычка, ее можно удалить здесь
    Попытка
        Элементы.Удалить(Элементы.ВременнаяДекорация_ГруппаОтчеты);
    Исключение
        // Элемент уже удален или не существует
    КонецПопытки;
КонецПроцедуры

Рекомендации и выводы

Подводя итог, можно сказать, что использование пустой декорации — это наиболее стабильный и рекомендуемый метод. Он гарантирует, что ваша логика отложенной загрузки сработает корректно во всех режимах работы (тонкий, толстый, мобильный или веб-клиент).

Важные моменты:

Мы рассмотрели все основные способы борьбы с автоматическим скрытием пустых страниц. Выбор конкретного метода зависит от архитектуры вашей формы и личных предпочтений в кодинге, но теперь вы знаете, как обеспечить предсказуемое поведение интерфейса в любых условиях.

← На главную