К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как выделить строку в 1С программно

Как программно выделить строку в 1С: ТекущаяСтрока, ТекущиеДанные, программный вызов оформления строк табличного поля и динамического списка, примеры кода и типичные ошибки.

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

Для установки текущей строки используется свойство ТекущаяСтрока табличного поля формы, а для чтения данных выделенной строки — свойство ТекущиеДанные. Для цветового выделения применяется условное оформление формы (в управляемых формах) или обработчик ПриПолученииДанных / ПриВыводеСтроки (в обычных формах). Ниже разобраны оба подхода с примерами кода.

Что означает «выделить строку» в 1С

Прежде чем писать код, определите, какой результат нужен. Если требуется, чтобы после открытия формы или после добавления записи курсор стоял на конкретной строке — это установка текущей строки. Если требуется подсветить строки по условию (например, просроченные документы красным) — это условное оформление. Третий вариант — множественное выделение, когда пользователь выделяет несколько строк мышью, а программа должна их обработать: здесь используется свойство ВыделенныеСтроки.

Маршрут решения

Как выбрать подход

Нужно спозиционировать курсор на конкретной записиИспользуйте Элементы.ИмяТаблицы.ТекущаяСтрока
Нужно подсветить строки цветом по условиюНастройте условное оформление формы
Нужно обработать строки, выделенные пользователемПереберите коллекцию Элементы.ИмяТаблицы.ВыделенныеСтроки

Установка текущей строки в динамическом списке

В управляемой форме списка (документы, справочники) таблица обычно связана с динамическим списком. Свойство ТекущаяСтрока в этом случае принимает ключ записи — ссылку на объект для списков ссылочных типов или значение ключа записи регистра для регистров сведений. Присвоение выполняется так:

&НаКлиенте

Процедура ПозиционироватьНаДокумент(СсылкаНаДокумент)

Элементы.Список.ТекущаяСтрока = СсылкаНаДокумент;

КонецПроцедуры

Типичный сценарий — после создания нового элемента из формы списка вернуться и спозиционироваться на нём. Для этого в обработчике ОбработкаОповещения формы списка проверяют имя события и устанавливают текущую строку:

&НаКлиенте

Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)

Если ИмяСобытия = "Запись_Номенклатура" Тогда

Элементы.Список.ТекущаяСтрока = Параметр.Ссылка;

КонецЕсли;

КонецПроцедуры

Учтите ограничение: спозиционироваться можно только на строке, которая реально присутствует в списке с текущими отборами. Если отбор скрывает запись, установка ТекущаяСтрока не покажет её — сначала снимите или измените отбор.

Текущая строка в табличной части и таблице значений

Если таблица формы связана с табличной частью объекта или с реквизитом типа «ТаблицаЗначений», свойству ТекущаяСтрока присваивается не ссылка, а строка коллекции данных либо её идентификатор. В управляемой форме коллекции хранятся как ДанныеФормыКоллекция, и у каждой строки есть метод ПолучитьИдентификатор():

&НаКлиенте

Процедура ВыделитьПервуюСтроку(Команда)

Если Объект.Товары.Количество() > 0 Тогда

Элементы.Товары.ТекущаяСтрока = Объект.Товары[0].ПолучитьИдентификатор();

КонецЕсли;

КонецПроцедуры

Для поиска нужной строки по значению используйте метод НайтиСтроки коллекции данных, а затем установите текущей первую найденную строку. Это удобно, например, когда после подбора товара нужно показать пользователю строку с этим товаром:

&НаКлиенте

Процедура НайтиИВыделить(ИскомаяНоменклатура)

Найденные = Объект.Товары.НайтиСтроки(Новый Структура("Номенклатура", ИскомаяНоменклатура));

Если Найденные.Количество() > 0 Тогда

Элементы.Товары.ТекущаяСтрока = Найденные[0].ПолучитьИдентификатор();

КонецЕсли;

КонецПроцедуры

Как получить данные выделенной строки

Обратная задача — прочитать данные строки, которую выделил пользователь. Для этого служит свойство ТекущиеДанные таблицы формы. Оно доступно на клиенте и возвращает объект с полями строки:

&НаКлиенте

Процедура СписокПриАктивизацииСтроки(Элемент)

ТекДанные = Элементы.Список.ТекущиеДанные;

Если ТекДанные = Неопределено Тогда

Возврат;

КонецЕсли;

// работаем с ТекДанные.Ссылка, ТекДанные.Наименование и т.д.

КонецПроцедуры

Обязательно проверяйте ТекущиеДанные на Неопределено: если список пуст или строка не выбрана, обращение к полям вызовет ошибку. Для множественного выделения перебирают ВыделенныеСтроки — там хранятся идентификаторы или ссылки выделенных записей:

&НаКлиенте

Процедура ОбработатьВыделенные(Команда)

Для Каждого Строка Из Элементы.Список.ВыделенныеСтроки Цикл

// Строка — ссылка (для динамического списка) или идентификатор строки

КонецЦикла;

КонецПроцедуры

Выделение строк цветом через условное оформление

В управляемых формах визуальное выделение делается через условное оформление формы. Его можно настроить в конфигураторе без кода или добавить программно в обработчике ПриСозданииНаСервере. Программный вариант выглядит так:

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

ЭлементОформления = УсловноеОформление.Элементы.Добавить();

ЭлементОформления.Использование = Истина;

Отбор = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

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

Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

Отбор.ПравоеЗначение = Истина;

ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Серый);

КонецПроцедуры

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

bsl
Элементы.Список.ТекущаяСтрока = СсылкаНаОбъект; // динамический список
Элементы.Товары.ТекущаяСтрока = СтрокаТаблицы.ПолучитьИдентификатор(); // табличная часть

Типичные ошибки и ограничения

Типичные ошибки
01
Присвоение ТекущаяСтрока индекса строки вместо идентификатора — строка не выделяется или выделяется не та
02
Установка текущей строки до того, как данные формы загружены, — присвоение теряется; выполняйте его после заполнения коллекции
03
Попытка спозиционироваться на записи, скрытой отбором динамического списка, — сначала измените отбор
04
Обращение к ТекущиеДанные без проверки на Неопределено — ошибка выполнения при пустом списке
05
Изменение условного оформления на клиенте — элементы оформления корректно добавлять на сервере в ПриСозданииНаСервере

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

Проверка результата

Контрольные точки

Как проверить результат

Позиционирование в списке
Норма

После выполнения кода курсор стоит на нужной записи, она видима на экране

Тревожный признак

Курсор остаётся на первой строке или запись не найдена

Чтение текущей строки
Норма

ТекущиеДанные возвращает объект с заполненными полями

Тревожный признак

ТекущиеДанные равно Неопределено при видимой выделенной строке

Условное оформление
Норма

Строки, удовлетворяющие отбору, окрашены сразу при открытии формы

Тревожный признак

Окраска не применяется или применяется ко всем строкам без разбора

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

Итог

Что важно запомнить

Фокус на строке устанавливается через ТекущаяСтрока: ссылкой для динамического списка, идентификатором строки для табличных частей. Данные выделенной строки читаются через ТекущиеДанные с обязательной проверкой на Неопределено. Цветовое выделение делается условным оформлением формы, а не манипуляциями с курсором.

Частые вопросы

Как выделить сразу несколько строк программно?

Множественное программное выделение в динамических списках платформой напрямую не поддерживается: ТекущаяСтрока задаёт одну активную запись. Если нужно «отметить» несколько записей, используйте дополнительную колонку-флажок или промежуточную таблицу значений с признаком выбора, а обработку ведите по отмеченным строкам.

Почему ТекущаяСтрока присваивается, но курсор не перемещается?

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

Как выделить строку при открытии формы списка?

Передайте в форму параметр (например, «ТекущаяСтрока» или собственный ключ) и в обработчике ПриОткрытии или ОбработкаОповещения присвойте его Элементы.Список.ТекущаяСтрока. Для стандартного параметра «ТекущаяСтрока» многие типовые формы списков позиционируются автоматически.

Чем отличаются ТекущаяСтрока и ТекущиеДанные?

ТекущаяСтрока — это идентификатор активной записи (ссылка или числовой идентификатор), который можно и читать, и устанавливать. ТекущиеДанные — объект с полями этой строки, доступный только для чтения на клиенте.

Как подсветить строку в обычной форме (толстый клиент)?

Используйте обработчик события табличного поля ПриВыводеСтроки: в нём через ОформлениеСтроки.ЦветФона и ОформлениеСтроки.ЦветТекста задайте оформление по условию, проверяя ДанныеСтроки. Этот механизм работает только в обычном приложении.

Можно ли программно снять выделение строки?

Полностью «снять» текущую строку в таблице формы нельзя — у списка всегда есть активная позиция, если в нём есть записи. Можно лишь переместить курсор на другую строку. Если нужно скрыть от пользователя факт выбора, обрабатывайте ТекущиеДанные = Неопределено как признак пустого списка.