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