Подсветка строки под курсором в списках и таблицах 1С
Содержание
Чтобы изменить цвет фона текущей строки в 1С, у платформы нет одной галочки. Цвет строки задаётся условным оформлением формы, а строку «под курсором» приходится подсвечивать отдельно: условие строится по идентификатору текущей строки, который запоминается в событии таблицы. Пользователь может настроить оформление списка сам, разработчик делает это в Конфигураторе или в расширении.
Типичная ситуация: бухгалтер листает список из 800 документов, взгляд теряется, и он промахивается мимо нужной строки. Цвет выделения платформы бледный, на мониторе с плохой матрицей почти не виден. Просят «сделать, чтобы строка с курсором горела жёлтым». Ниже собраны все рабочие способы, от безопасных настроек до программной подсветки.
Что такое «текущая строка» и почему её нельзя подсветить одной настройкой
В управляемых формах 1С у таблицы есть две разные вещи: выделенные строки и текущая строка. Выделенных может быть несколько (Shift или Ctrl), текущая всегда одна: там стоит курсор. Платформа сама рисует рамку и закрашивает выделение цветом из стиля. Этот цвет задаётся оформлением системы, а не формы.
Условное оформление работает иначе. Оно смотрит на данные строки: сумма больше 100 000, статус «Не проведён», дата просрочена. Положение курсора в данные не входит. Поэтому прямое условие «если строка текущая» в конструкторе условного оформления составить нельзя.
Отсюда три пути:
- 🎨 Раскрасить строки по данным. Курсор не нужен: проведённые зелёные, непроведённые серые. Делается без кода.
- 🖱️ Подсветить именно строку с курсором. Нужен код: запомнить текущую строку и построить по ней условие оформления.
- ⚙️ Поменять цвет самого выделения. Это настройка стиля, она затрагивает все формы сразу.
Какой путь выбрать, зависит от задачи. Если нужно просто отличать строки по смыслу, хватит первого. Если важна «светящаяся» позиция курсора, нужен второй.
| Способ | Кому доступен | Нужен код | Затрагивает |
|---|---|---|---|
| Настройка условного оформления списка в режиме 1С:Предприятие | Пользователь | Нет | Только его список |
| Условное оформление в Конфигураторе | Разработчик | Нет | Все пользователи |
| Подсветка по событию таблицы | Разработчик | Да | Конкретная форма |
| Изменение элементов стиля | Разработчик | Нет | Весь интерфейс |
Настройка пользователем: оформление списка без Конфигуратора
Для динамических списков (справочники, журналы документов) пользователь может задать условное оформление сам. Конфигуратор для этого не нужен.
- Откройте нужный список, например журнал документов .
- В командной панели списка откройте меню
Ещеи найдите команду настройки списка. В разных конфигурациях она может называться чуть по-разному, но находится в этом меню. - Перейдите на вкладку условного оформления.
- Добавьте элемент: задайте условие (например,
ПроведенравноЛожь), выберите оформление «Цвет фона» и нужный цвет. - Сохраните настройку и закройте окно.
Настройка запоминается в пользовательских настройках: другие пользователи её не увидят. Это удобно для личных предпочтений и опасно для общих регламентов. Если бухгалтер раскрасил журнал «под себя», а потом жалуется, что у коллеги всё выглядит иначе, причина в этом.
Пользовательская настройка списка не даёт условия «строка с курсором». Она работает только по полям данных.
Если в форме нет команды настройки списка, её могла убрать доработка конфигурации. Тогда варианты два: попросить разработчика вернуть команду или попросить сделать оформление в самой форме.
Условное оформление в Конфигураторе: цвет по данным строки
Это основной способ для разработчика. Он не требует ни строчки кода и работает во всех клиентах.
Порядок действий:
- Откройте форму списка или документа в Конфигураторе.
- В дереве элементов выберите таблицу (для списка это обычно элемент
Список). - В палитре свойств найдите свойство
Условное оформлениеи откройте его. Либо перейдите на вкладкуРеквизитыформы и найдите то же свойство у самого динамического списка. - Добавьте элемент оформления.
- В блоке отбора задайте условие по полю данных.
- В блоке оформления выберите параметр
Цвет фонаи укажите цвет. - В блоке
Оформляемые поляоставьте пустым, чтобы красилась вся строка, либо перечислите только нужные колонки.
Три момента, на которых чаще всего ошибаются.
Первый. Если оформляемые поля не заданы, красится вся строка. Если заданы одна-две колонки, подсветятся только они. Хотели строку целиком, а получили одну ячейку: проверьте этот блок.
Второй. Порядок элементов важен. Когда условия пересекаются, побеждает тот элемент, что стоит ниже в списке. Элемент «все непроведённые серые» выше, а «непроведённые на сумму больше миллиона красные» ниже: так сработают оба правила, красный перекроет серый.
Третий. У каждого элемента есть флажок использования. Выключенный элемент остаётся в списке, но не работает . После чужих правок загляните, не снят ли флажок.
Для цвета берите из палитры стиля либо web-цвета. Так оформление остаётся читаемым в разных темах.
Подсветка строки с курсором: событие таблицы и динамическое условие
Теперь главный случай: нужна не раскраска по данным, а подсветка той строки, где стоит курсор. Приём простой: в событии таблицы запомнить, какая строка стала текущей, и добавить в условное оформление правило «идентификатор строки равен запомненному».
В свойствах таблицы есть событие ПриАктивизацииСтроки. Оно срабатывает при каждом переходе на другую строку. Обработчик на клиенте выглядит так:
&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
ПодключитьОбработчикОжидания("ПодсветитьТекущуюСтроку", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПодсветитьТекущуюСтроку()
ПодсветитьСтрокуНаСервере(Элементы.Список.ТекущаяСтрока);
КонецПроцедуры
Обработчик ожидания нужен, чтобы не гонять сервер на каждое нажатие стрелки. Пока пользователь быстро листает список, вызов откладывается и сбрасывается; на сервер уходит запрос, только когда курсор остановился на 0,1 секунды.
На сервере правило пересоздаётся:
&НаСервере
Процедура ПодсветитьСтрокуНаСервере(ТекущаяСтрока)
КоллекцияОформления = Список.УсловноеОформление.Элементы;
КоллекцияОформления.Очистить();
Если ТекущаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
Элемент = КоллекцияОформления.Добавить();
ЭлементОтбора = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = ТекущаяСтрока;
ЭлементОтбора.Использование = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(255, 247, 170));
Элемент.Использование = Истина;
КонецПроцедуры
Здесь Список — динамический список формы, а Ссылка — поле, которое идёт в его запросе. Для справочников и документов оно есть всегда. Для списка на произвольном запросе подставьте поле-ключ вашей выборки.
Для таблиц значений (не динамических списков) идентификатор строки не равен ссылке. Берите ТекущаяСтрока как идентификатор и сравнивайте с идентификатором, который сохранили в колонке таблицы. Либо добавьте вспомогательную колонку-флаг и меняйте её при переходе по строкам.
Очищайте коллекцию оформления перед добавлением правила. Иначе при каждом шаге по списку будет копиться новый элемент, и через сотню строк форма начнёт тормозить, а вся пройденная часть списка останется жёлтой.
Если очистка выполняется, но подсветка «залипает» на предыдущей строке, проверьте, что условие использует именно текущий идентификатор, а не значение, закэшированное на клиенте.
Расширения конфигурации: как добавить подсветку, не трогая типовую форму
Типовую форму в поддержке редактировать неудобно: при обновлении конфигурации правки превращаются в конфликты объединения. Для этого есть расширения конфигурации , они появились в платформе 8.3.6.
Порядок:
- Создайте расширение и добавьте в него нужную форму списка через команду заимствования объектов.
- В заимствованной форме создайте обработчик события таблицы. Он вызывается дополнительно к коду типовой формы, не заменяя его.
- Добавьте в расширение процедуры из предыдущего раздела.
- Если нужен постоянный цвет по данным, настройте условное оформление прямо в заимствованной форме.
- Загрузите расширение в информационную базу и обновите конфигурацию базы данных отдельным шагом.
Для методов, которые уже есть в типовой форме, используются аннотации перехвата: &Перед, &После, &Вместо. Для подсветки достаточно &После на процедуре, которая отрабатывает при открытии формы: туда можно добавить стартовое оформление.
Расширение удобно тем, что его можно отключить одним переключателем. Если после установки список начал тормозить или подсветка конфликтует с типовым оформлением, расширение отключается без потери типовой формы.
Перед загрузкой расширения в рабочую базу проверьте его на копии. Структурное обновление базы идёт отдельным действием и требует, чтобы остальные пользователи вышли из базы.
Тонкий клиент и веб-клиент: чем отличается результат
Условное оформление выполняется одинаково в тонком и веб-клиенте: цвета задаются в форме, а клиент их применяет. Код на сервере не зависит от типа клиента. Различия появляются в мелочах.
- 🖥️ Тонкий клиент рисует строки быстро. Задержка подсветки определяется временем серверного вызова.
- 🌐 Веб-клиент добавляет задержку браузера и сети. Если сервер отвечает за 200 мс, а канал медленный, подсветка отстаёт от курсора заметно. Подберите интервал обработчика ожидания: на веб-клиенте имеет смысл ставить не 0,1, а 0,3 секунды.
- 📱 Мобильный клиент обычно работает с другими формами и другим оформлением, повторять код не стоит.
Цвета в веб-клиенте могут чуть отличаться из-за настроек цветопередачи монитора и режима высокой контрастности операционной системы. В этом режиме операционная система может принудительно менять цвета интерфейса, и оформление формы будет выглядеть не так, как в задумке.
Другое отличие: цвет фона текущей строки, заданный условным оформлением, может конфликтовать с системным цветом выделения. Если выделенная строка перекрывается синим системным цветом, оформление не видно. Смотрите, как строка выглядит в обычном состоянии, и проверьте, стоит ли выбирать цвет с нужной насыщенностью.
Почему цвет не применяется: диагностика
Если вы добавили правило, а строка не красится, пройдите по списку.
| Симптом | Вероятная причина | Что проверить |
|---|---|---|
| Красится одна ячейка, а не вся строка | Заданы оформляемые поля | Очистите блок Оформляемые поля |
| Правило не срабатывает вообще | Выключен флажок использования | Включите элемент и условие |
| Срабатывает не то правило | Перекрытие нижним элементом | Поменяйте порядок элементов |
| Подсветка «залипла» на старой строке | Не очищена коллекция | Вызовите Очистить() перед добавлением |
| Условие по полю ничего не находит | Поле не попало в запрос списка | Проверьте текст запроса и имя поля |
| Цвет не виден на выбранной строке | Перекрыт цветом выделения | Выберите более насыщенный цвет |
| В веб-клиенте отстаёт | Серверный вызов на каждый шаг | Увеличьте интервал ожидания |
Если правило добавлено в расширении, а в типовой форме то же поле уже оформлено, проверьте порядок: оформление расширения и типовое складываются, но при пересечении параметров приоритет определяет порядок элементов.
Для разбора удобно временно поставить яркий цвет, например красный, и убрать все остальные элементы оформления. Если красный появился, правило работает, а проблема в условии или в конфликте с соседними элементами.
Отдельный случай: списки, построенные на произвольном запросе, где поле Ссылка не выбирается. Тогда условие, составленное по нему, ничего не найдёт. Добавьте в запрос выбор поля-ключа и укажите его в основной таблице динамического списка.