Почему не отображаются строки и шапка таблицы в динамическом списке 1С и как это исправить?

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

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

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

Выясняем причину: почему пропадают строки и шапка таблицы?

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

  1. Динамический список отображает данные иерархического справочника.
  2. Для таблицы списка установлено свойство «Отображение» в значение Иерархический список.
  3. В динамическом списке программно или интерактивно настроено Условное оформление, которое скрывает определенные строки (установлено свойство оформления Видимость = Ложь).

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

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

Посмотрим на код, который изначально использовал автор темы для скрытия «ненужных» папок справочника:


УО = Список.УсловноеОформление.Элементы;
УО.Oчистить();

Нов = УО.Добавить();

ГруппаОтборов = Нов.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОтборов.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаНе;

Отбор = ГруппаОтборов.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии;
Отбор.ПравоеЗначение = ГруппаВерхнегоУровня;
Отбор.Использование = Истина;

// Отключаем видимость для строк, не входящих в нужную группу
Оформление = Нов.Оформление.Элементы[20]; // 20-й индекс часто отвечает за свойство "Видимость"
Оформление.Значение = Ложь;
Оформление.Использование = Истина;

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

Разберем три основных способа обхода и решения этой проблемы — от быстрого «костыля» до архитектурно правильного подхода.

Решение №1. Быстрый обход проблемы через смену режима отображения

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

Для этого выполните следующие шаги в конфигураторе:

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

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

Недостаток метода: Режим «Дерево» навязывает пользователю строго древовидную структуру. Если бизнес-требования к задаче подразумевают работу именно в режиме плоского или иерархического списка, этот метод не подойдет. Кроме того, продвинутый пользователь может вернуть отображение списка назад через меню «Еще» формы, что снова вернет ошибку.

Решение №2. Использование стандартных отборов списка (Рекомендуемый способ)

Фирма «1С» в своих официальных стандартах разработки настоятельно не рекомендует использовать Условное оформление для управления видимостью строк динамических списков. Скрытие строк через свойство Видимость = Ложь условного оформления создает колоссальную нагрузку на клиентское приложение. Платформа все равно получает эти данные с сервера СУБД, строит дерево объектов в памяти и тратит ресурсы на их последующее скрытие на клиенте. Помимо визуальных багов, это часто приводит к некорректной работе полосы прокрутки.

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


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

// Добавляем новый отбор для отображения только нужной иерархии
НовыйОтбор = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии;
НовыйОтбор.ПравоеЗначение = ГруппаВерхнегоУровня;
НовыйОтбор.Использование = Истина;
НовыйОтбор.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;

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

Решение №3. Фильтрация данных через произвольный запрос списка

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

Давайте разберем, как это сделать:

  1. Откройте свойства динамического списка Список на форме.
  2. Установите флаг «Произвольный запрос».
  3. Откройте конструктор запроса и перейдите на вкладку «Условия».
  4. Напишите условие фильтрации данных, которое ограничит выборку на уровне базы данных.

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


ВЫБРАТЬ
    СправочникНоменклатура.Ссылка КАК Ссылка,
    СправочникНоменклатура.Код КАК Код,
    СправочникНоменклатура.Наименование КАК Наименование
ИЗ
    Справочник.Номенклатура КАК СправочникНоменклатура
ГДЕ
    СправочникНоменклатура.Ссылка В ИЕРАРХИИ(&ДопустимаяГруппаНоменклатуры)

После изменения текста запроса нам останется только передать параметр ДопустимаяГруппаНоменклатуры при создании формы на сервере:


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

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

Резюме

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

← На главную