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