Почему динамический список отображает пустые строки без данных и как это исправить?

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

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

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

Анализ исходной ситуации

Рассмотрим типовой сценарий, в котором проявляется данное поведение. В форме справочника создан реквизит с типом ДинамическийСписок, для которого установлен флаг «Произвольный запрос» со следующим текстом:


ВЫБРАТЬ
    РегистрСведенийбитКадроваяИсторияФизическихЛиц.Период,
    РегистрСведенийбитКадроваяИсторияФизическихЛиц.ФизическоеЛицо,
    РегистрСведенийбитКадроваяИсторияФизическихЛиц.Подразделение,
    РегистрСведенийбитКадроваяИсторияФизическихЛиц.битРегистратор
ИЗ
    РегистрСведений.битКадроваяИсторияФизическихЛиц КАК РегистрСведенийбитКадроваяИсторияФизическихЛиц

В свойствах списка указана основная таблица и включено динамическое считывание данных. В модуле формы в обработчике ПриСозданииНаСервере программно устанавливается отбор компоновки данных:


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

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

Причина 1: Рассинхронизация свойства «ПутьКДанным» элементов формы

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

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

Способ решения 1: Пересоздание колонок таблицы формы

Разберем по шагам наиболее быстрое и надежное решение:

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

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

Способ решения 2: Ручная проверка свойства «ПутьКДанным»

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

  1. Выделим проблемную колонку в дереве элементов формы.
  2. В палитре свойств найдем строку ПутьКДанным (DataPath).
  3. Нажмем кнопку выбора с тремя точками и повторно укажем соответствующее поле из дерева реквизита динамического списка.
  4. Повторим процедуру для каждого элемента-колонки.

Другие возможные причины отсутствия данных

Если перепривязка колонок не помогла, проанализируем сопутствующие факторы, способные вызывать подобный эффект:

  1. Ограничения прав на уровне записей и полей (RLS). Если у пользователя есть базовые права на чтение таблицы регистра, но ограничены права на конкретные поля (реквизиты, ресурсы), платформа выведет строки, но значения закрытых полей отображаться не будут.
  2. Кэш пользовательских настроек формы. Платформа 1С сохраняет пользовательские настройки отображения форм. Если ранее состав полей менялся, старый кэш настроек может конфликтовать с новой структурой. В режиме «1С:Предприятие» следует открыть форму, нажать Еще — Изменить форму — Установить стандартные настройки.
  3. Условное оформление списка. Проверим свойства условного оформления динамического списка и самой формы: возможно, в них установлено правило, скрывающее текст (параметр Текст = "") или окрашивающее цвет текста в цвет фона таблицы.
  4. Свойство «Основная таблица». Если в произвольном запросе присутствуют соединения или группировки, указание основной таблицы без флага Использовать всегда для ключевых полей может нарушать выборку. Если редактирование записей непосредственно через эту таблицу не требуется, свойство Основная таблица можно очистить.

Оптимизация фильтрации: параметры запроса вместо отбора СКД

Посмотрим на способ установки отбора. Программное добавление элементов в Отбор.Элементы динамического списка накладывает фильтр через СКД. Для связанных списков внутри формы объекта более производительным и надежным подходом является передача параметра непосредственно в текст запроса.

Изменим запрос динамического списка:


ВЫБРАТЬ
    Регистр.Период КАК Период,
    Регистр.ФизическоеЛицо КАК ФизическоеЛицо,
    Регистр.Подразделение КАК Подразделение,
    Регистр.битРегистратор КАК битРегистратор
ИЗ
    РегистрСведений.битКадроваяИсторияФизическихЛиц КАК Регистр
ГДЕ
    Регистр.ФизическоеЛицо = &ФизическоеЛицо

В модуле формы в процедуре ПриСозданииНаСервере передадим значение параметра:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ИсторияИзмененийПодразделенияУФизическогоЛица.Параметры.УстановитьЗначениеПараметра(
        "ФизическоеЛицо", 
        Объект.Ссылка
    );
КонецПроцедуры

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

← На главную