Как реализовать загрузку динамического списка при смене закладки в 1С?

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

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

В этой статье мы подробно разберем, как реализовать механизм "ленивой загрузки" (lazy loading), чтобы динамический список заполнялся данными только тогда, когда пользователь непосредственно переходит на соответствующую страницу (закладку) формы. Рассмотрим несколько профессиональных приемов, от простых манипуляций с видимостью до программного управления текстом запроса.

Метод 1: Управление параметрами запроса для «пустого» старта

Проанализируем самый надежный и гибкий способ — использование условий в тексте запроса динамического списка. Суть метода заключается в том, чтобы изначально передать в запрос условие, которое не вернет ни одной строки, тем самым минимизировав нагрузку на сервер БД при открытии формы.

Рассмотрим по шагам, как это реализовать:

  1. Откроем свойства динамического списка в конфигураторе и перейдем к редактированию текста запроса.
  2. В секцию ГДЕ добавим параметр, который будет отвечать за разрешение загрузки. Например:
    
    ВЫБРАТЬ
        Ссылка,
        Номер,
        Дата,
        Контрагент
    ИЗ
        Документ.РеализацияТоваровУслуг
    ГДЕ
        &РазрешитьЗагрузку = ИСТИНА
    
  3. В модуле формы, в процедуре ПриСозданииНаСервере, установим начальное значение этого параметра в Ложь. В этом случае при открытии формы список останется пустым, а запрос выполнится мгновенно, так как сервер поймет, что данных возвращать не нужно.
  4. Теперь разберем, как включить загрузку при переключении закладки. Для этого нам понадобится обработчик события ПриАктивацииСтраницы группы страниц (панели), на которой расположены наши закладки.

Посмотрим на пример кода для активации списка:


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

КонецПроцедуры

&НаСервере
Процедура АктивироватьСписокНаСервере()
    
    // Устанавливаем параметр в Истина, чтобы запрос начал выбирать данные
    ДинамическийСписок.Параметры.УстановитьЗначениеПараметра("РазрешитьЗагрузку", Истина);
    
КонецПроцедуры

Метод 2: Программная установка текста запроса

Выясним причину, по которой этот метод считается более радикальным и эффективным. Если в свойствах реквизита ДинамическийСписок в поле "Текст запроса" пусто, система вообще не инициирует обращение к базе данных при открытии формы. Мы можем назначить запрос программно в нужный нам момент.

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

  1. В конфигураторе оставляем свойство ТекстЗапроса у динамического списка пустым (или не ставим галочку "Произвольный запрос", если это простая выборка из таблицы).
  2. В момент активации закладки вызываем серверный метод, где динамически формируем текст запроса.

Пример реализации на языке 1С:


&НаСервере
Процедура ИнициализироватьЗапросСписка()
    
    ТекстЗапроса = 
    "ВЫБРАТЬ
    |   Таблица.Ссылка КАК Ссылка,
    |   Таблица.Наименование КАК Наименование
    |ИЗ
    |   Справочник.Номенклатура КАК Таблица";
    
    // Назначаем текст запроса основной схеме компоновки данных списка
    ДинамическийСписок.ТекстЗапроса = ТекстЗапроса;
    
КонецПроцедуры

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

Метод 3: Оптимизация через видимость элементов

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

Однако полагаться только на автоматику не всегда безопасно, так как поведение может меняться в зависимости от версии платформы или сложности композиции формы. Тем не менее, использование свойства Видимость в сочетании с обработчиком ПриАктивацииСтраницы дает хороший результат:

Дополнительные советы по оптимизации ресурсов

Чтобы ресурсы "не жрались" (как выразился автор темы), недостаточно просто отложить загрузку. Проанализируем настройки самого динамического списка, которые влияют на потребление памяти и процессорного времени:

1. Динамическое считывание данных. Убедитесь, что это свойство включено. Оно заставляет систему запрашивать данные порциями (по 20-50 строк), необходимыми для отображения на текущем экране. Если его выключить, система попытается прочитать всё содержимое таблицы сразу, что может привести к зависанию интерфейса.

2. Ограничение состава полей. Избегайте использования конструкции ВЫБРАТЬ *. Четко перечисляйте только те поля, которые реально выводятся в таблицу на форме. Помните, что каждое лишнее поле — это дополнительный объем данных, передаваемый по сети от сервера к клиенту.

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

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

← На главную