Почему исчезают неактивные строки в динамическом списке управляемой формы 1С и как это исправить?

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

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

Механика проблемы: почему данные видны только при выделении

Проанализируем физику работы платформы при отрисовке таблиц управляемых форм. Платформа 1С использует механизм стилизации активной строки. Когда строка получает фокус, к ней применяются системные цвета фокуса — ЦветФонаВыделения и ЦветВыделенногоТекста. Эти системные параметры перекрывают индивидуальное форматирование ячеек.

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

Главным виновником такого поведения является механизм условного оформления. В нем могут быть установлены следующие параметры:

  1. Параметр «Отображать» установлен в значение «Ложь»: платформа резервирует место под ячейку, но подавляет непосредственную отрисовку текста или контрола.
  2. Параметр «Видимость» установлен в значение «Ложь»: поле пытается полностью скрыться по заданному условию.
  3. Параметры «Цвет текста» или «Цвет фона»: цвет шрифта программно или интерактивно приравнен к цвету фона строки (или фону чередования строк).
  4. Параметр «Текст»: в значении переопределения текста задана пустая строка или пробел.

Где искать скрывающее условное оформление

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

  1. Условное оформление самой формы:

    Откроем форму в конфигураторе, перейдем в корень свойств формы и откроем свойство УсловноеОформление. Проверим список настроенных элементов: обратим внимание на условия отбора (колонка «Условие»), оформляемые поля и значения параметров «Отображать», «Видимость» и «ЦветТекста».

  2. Условное оформление динамического списка:

    Если таблица привязана к реквизиту с типом ДинамическийСписок, у самого списка есть собственная компоновка данных. Перейдем на вкладку «Реквизиты», выделим Список, найдем в его свойствах параметр НастройкиКомпоновкиДанных, откроем его и проверим вкладку «Условное оформление». Настройки списка применяются независимо от оформления формы.

  3. Пользовательские настройки формы:

    Пользовательские настройки обладают наивысшим приоритетом и перекрывают параметры, заданные в конфигураторе. Пользователь мог случайно или намеренно настроить оформление под себя. Чтобы проверить эту гипотезу в режиме «1С:Предприятие», выполним в командной панели таблицы команду: Еще → Настроить список... → вкладка «Условное оформление». Для полного сброса индивидуальных правок достаточно выполнить команду: Еще → Установить стандартные настройки.

  4. Программный код в модуле формы:

    Нередко условное оформление добавляется динамически при открытии. Исследуем обработчик ПриСозданииНаСервере и вызываемые из него общие модули на наличие манипуляций с коллекцией УсловноеОформление. Пример того, как разработчик мог ошибочно скрыть данные:

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

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

Правильные стандарты разработки: как скрывать строки корректно

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

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

  1. Статический отбор в запросе списка: добавим требуемые ограничения непосредственно в текст секции ГДЕ основного запроса динамического списка.
  2. Динамический отбор списка: настроим отбор через свойство Список.Отбор или компоновщик настроек списка:

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

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

← На главную