При проектировании интерфейсов в 1С часто возникает задача визуального акцентирования внимания пользователя на определенных данных. Например, может потребоваться выделить первую строку табличной части документа, так как она часто содержит итоговые, сервисные или наиболее приоритетные позиции. В этой статье мы подробно разберем, как решить эту задачу в различных режимах работы платформы 1С:Предприятие 8.
Мы проанализируем интерактивный способ настройки в управляемых формах, изучим программный метод управления оформлением на сервере, рассмотрим особенности реализации этой логики в устаревших обычных формах, а также разберем важные поведенческие нюансы, с которыми может столкнуться разработчик при сортировке или фильтрации строк табличной части.
В управляемом приложении платформы 1С решение подобных задач не требует написания программного кода. Платформа предоставляет мощный встроенный механизм декларативной настройки интерфейса — Условное оформление формы. Настроить его можно интерактивно в процессе разработки формы документа или справочника.
Рассмотрим по шагам процесс интерактивной настройки:
Шрифт, нажмем кнопку выбора, установим флажок напротив свойства "Жирный" в значение Да и нажмем "ОК".Объект.ИмяВашейТабличнойЧасти.НомерСтроки, установим вид сравнения Равно, а в качестве правого значения укажем число 1.После этого при открытии документа первая строка его табличной части автоматически примет жирное начертание шрифта.
Хотя интерактивная настройка условного оформления удобна, она имеет свои недостатки. Такое оформление сложно переносить через расширения конфигурации, трудно контролировать в процессе групповой разработки и объединения модулей, а также невозможно динамически включать или отключать в зависимости от прав пользователя или состояния документа.
Чтобы обойти эти ограничения, мы можем создать элемент условного оформления программно. Лучше всего делать это при создании формы на сервере. Проанализируем пример кода, реализующий данную логику:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Инициализируем создание нового элемента условного оформления формы
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
// Шаг 1. Задаем оформление (устанавливаем жирный шрифт)
// Параметры конструктора шрифта: ШрифтКомпоновкиДанных(Шрифт, Размер, СистемноеИмя, Жирный, Курсив, Подчеркнутый)
НовыйШрифт = Новый Шрифт(, , , Истина);
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Шрифт", НовыйШрифт);
// Шаг 2. Задаем условие: НомерСтроки = 1
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.НомерСтроки");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = 1;
ЭлементОтбора.Использование = Истина;
// Шаг 3. Указываем оформляемые поля (колонки табличной части)
// Для примера выделим всю строку, добавив ключевые колонки ТЧ "Товары"
ПолеНоменклатура = ЭлементОформления.Поля.Элементы.Добавить();
ПолеНоменклатура.Поле = Новый ПолеКомпоновкиДанных("ТоварыНоменклатура");
ПолеНоменклатура.Использование = Истина;
ПолеКоличество = ЭлементОформления.Поля.Элементы.Добавить();
ПолеКоличество.Поле = Новый ПолеКомпоновкиДанных("ТоварыКоличество");
ПолеКоличество.Использование = Истина;
ПолеЦена = ЭлементОформления.Поля.Элементы.Добавить();
ПолеЦена.Поле = Новый ПолеКомпоновкиДанных("ТоварыЦена");
ПолеЦена.Использование = Истина;
// Активируем элемент условного оформления
ЭлементОформления.Использование = Истина;
КонецПроцедуры
Этот код динамически внедряет логику форматирования в структуру формы в момент ее инициализации на сервере, обеспечивая гибкость разработки и поддержку чистоты метаданных.
Если вы работаете в старых конфигурациях 1С (например, УПП 1.3 или УТ 10.3), использующих обычные формы, то встроенного механизма УсловноеОформление на уровне формы там нет. В этом случае задача решается написанием кода в обработчиках событий самого табличного поля. Рассмотрим два основных метода.
Вариант А. Использование события ПриВыводеСтроки
Событие ПриВыводеСтроки генерируется платформой в момент визуальной отрисовки каждой строки таблицы на экране пользователя. Мы можем перехватить этот момент и программно изменить шрифт строки, если ее порядковый номер равен единице.
Процедура ТоварыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
Если ДанныеСтроки <> Неопределено Тогда
// Проверяем, является ли строка первой
Если ДанныеСтроки.НомерСтроки = 1 Тогда
// Устанавливаем жирный шрифт для текущей строки
ОформлениеСтроки.Шрифт = Новый Шрифт(ОформлениеСтроки.Шрифт, , , Истина);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Данный метод отлично подходит для небольших табличных частей. Однако у него есть существенный минус: событие срабатывает очень часто (при любой прокрутке, изменении фокуса, перерисовке экрана), что может замедлить работу интерфейса на слабых компьютерах, если строк в таблице много.
Вариант Б. Использование события ПриПолученииДанных (оптимально для производительности)
Для оптимизации скорости отрисовки больших списков и таблиц лучше использовать событие ПриПолученииДанных. Оно отрабатывает не для каждой строки по отдельности, а сразу для пакета строк, видимых на экране пользователя.
Процедура ТоварыПриПолученииДанных(Элемент, ОформленияСтрок)
Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
ДанныеСтроки = ОформлениеСтроки.ДанныеСтроки;
Если ДанныеСтроки <> Неопределено И ДанныеСтроки.НомерСтроки = 1 Тогда
ОформлениеСтроки.Шрифт = Новый Шрифт(ОформлениеСтроки.Шрифт, , , Истина);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Такой подход минимизирует количество обращений к свойствам графических объектов и значительно ускоряет прокрутку табличной части.
Разрабатывая подобное оформление, важно учитывать поведение платформы в нестандартных сценариях, чтобы избежать логических ошибок и жалоб со стороны пользователей:
НомерСтроки = 1 жестко привязано к физическому индексу строки в базе данных. Если пользователь решит отсортировать таблицу кликом по шапке колонки (например, по алфавиту номенклатуры или по убыванию цены), строка с физическим индексом 1 может переместиться в самый конец списка или в его середину. При этом она все равно останется жирной, а визуально первая строка (которая теперь имеет другой физический номер) жирной не станет. Если ваша цель — всегда выделять именно визуально верхнюю строку таблицы вне зависимости от сортировки, стандартное условное оформление по номеру строки использовать нельзя.
НомерСтроки. Нумерация строк в динамических списках генерируется "на лету" на стороне клиента, и получить доступ к первой видимой строке через условное оформление без сложных манипуляций в запросе невозможно. В таких случаях задачу выделения первой записи решают другими способами (например, программной установкой активной строки при открытии).
Резюмируя все вышесказанное: для современных управляемых интерфейсов идеальным и наиболее надежным решением является использование механизма Условного оформления формы с условием по полю НомерСтроки, настроенное интерактивно или программно.