Разработка и Конфигурация · 11 мин
Как программно выделить строки в табличном поле 1С
Способы программного выделения строк в табличном поле 1С 8.3: ТекущаяСтрока, ВыделенныеСтроки, работа в управляемых и обычных формах, типовые ошибки.
Выделение строк табличного поля из кода — частая задача при доработке форм документов, обработок и списков справочников. Например, после загрузки данных из файла нужно подсветить найденные строки, после копирования — показать пользователю, что именно добавлено, а в форме подбора — отметить уже выбранные позиции. В 1С это делается по-разному в зависимости от типа формы: управляемой или обычной.
Ключевое различие подходов: в управляемых формах табличное поле связано с коллекцией данных (ДинамическийСписок, ТаблицаЗначений, табличная часть), и выделение управляется через свойства ТекущаяСтрока и ВыделенныеСтроки у элемента формы. В обычных формах используются объекты ТабличноеПоле со своими методами. Смешивание этих подходов — самая частая причина того, что код «не срабатывает».
Ниже разобраны рабочие варианты для обеих моделей, способы найти нужную строку, выделить несколько строк, снять выделение и проверить результат. Примеры приведены для платформы 1С:Предприятие 8.3 и применимы к типовым и самописным конфигурациям.
Чем отличается выделение в управляемой и обычной форме
Прежде чем писать код, определите, с какой формой работаете. Управляемая форма строится на данных: у реквизита-коллекции есть идентификаторы строк (целые числа), и именно ими оперирует свойство ТекущаяСтрока. Обычная форма работает с самим объектом табличного поля, где строки адресуются значениями данных (ссылкой, строкой таблицы значений).
Быстрый признак: если в модуле формы доступны ЭтаФорма, Элементы и реквизиты формы — это управляемая форма. Если используются ЭтаФорма.ЭлементыФормы и ЭлементыФормы.ТабличноеПоле1 — обычная. Код для одной модели в другой либо не скомпилируется, либо тихо не сработает, поэтому проверка типа формы — первый шаг.
Выделение одной строки в управляемой форме
Базовый приём — присвоить свойству ТекущаяСтрока элемента формы идентификатор нужной строки. Для таблицы значений или табличной части идентификатор получают методом ПолучитьИдентификатор() у строки коллекции.
// Найти строку по условию и сделать её текущей
Строки = Объект.Товары.НайтиСтроки(Новый Структура("Номенклатура", ИскомаяНоменклатура));
Если Строки.Количество() > 0 Тогда
Элементы.Товары.ТекущаяСтрока = Строки[0].ПолучитьИдентификатор();
КонецЕсли;
Для динамического списка (например, список документов или справочника) в ТекущаяСтрока передаётся ключ записи — для ссылочных списков это сама ссылка:
Элементы.Список.ТекущаяСтрока = ТекущийДокументСсылка;
После присвоения платформа сама прокрутит таблицу к выделенной строке, если она находится вне видимой области. Если строка не выделяется, чаще всего причина в том, что коллекция была перезаполнена после получения идентификатора и он стал недействительным.
Выделение нескольких строк программно
Множественное выделение выполняется через коллекцию ВыделенныеСтроки элемента формы. Предварительно у таблицы в палитре свойств должен быть разрешён множественный выбор: свойство РежимВыделения — «Множественный». Без этого программное добавление строк в выделение может не дать видимого эффекта.
// Выделить все строки с нулевым количеством
Элементы.Товары.ВыделенныеСтроки.Очистить();
Для Каждого СтрокаТовара Из Объект.Товары Цикл
Если СтрокаТовара.Количество = 0 Тогда
Элементы.Товары.ВыделенныеСтроки.Добавить(СтрокаТовара.ПолучитьИдентификатор());
КонецЕсли;
КонецЦикла;
Обратная задача — узнать, какие строки выделил пользователь. Для этого перебирают ту же коллекцию и получают данные через НайтиПоИдентификатору():
Для Каждого Идентификатор Из Элементы.Товары.ВыделенныеСтроки Цикл
ДанныеСтроки = Объект.Товары.НайтиПоИдентификатору(Идентификатор);
// работа с ДанныеСтроки
КонецЦикла;
Выделение строк в обычной форме
В обычных формах у элемента ТабличноеПоле есть свойство ТекущаяСтрока, которому присваивают значение строки данных — например, строку таблицы значений или ссылку для списка. Для выделения диапазона используется метод УстановитьГраницыВыделения либо работа со свойством ВыделенныеСтроки через область выделения.
// Обычная форма: сделать строку таблицы значений текущей
СтрокаТЗ = Товары.Найти(ИскомаяНоменклатура, "Номенклатура");
Если СтрокаТЗ <> Неопределено Тогда
ЭлементыФормы.Товары.ТекущаяСтрока = СтрокаТЗ;
КонецЕсли;
Для множественного выделения в обычной форме табличное поле должно иметь РежимВыделения = РежимВыделенияТабличногоПоля.Множественный. Программно отметить строки можно, перебирая коллекцию данных и добавляя их в выделение через ЭлементыФормы.Товары.ВыделенныеСтроки.Добавить(СтрокаТЗ) — здесь передаётся сама строка данных, а не идентификатор.
Сравнение подходов
ТекущаяСтрока и ВыделенныеСтроки принимают числовые идентификаторы строк; для динамического списка — ссылку. Работает в тонком и веб-клиенте.
ТекущаяСтрока и ВыделенныеСтроки принимают сами строки данных. Работает только в толстом клиенте обычного приложения.
Как найти нужную строку перед выделением
Выделение почти всегда начинается с поиска. Для табличных частей и таблиц значений используйте НайтиСтроки(СтруктураОтбора) — он возвращает массив подходящих строк. Для поиска по части значения или сложному условию перебирайте коллекцию циклом с проверкой условия.
В динамическом списке «поиска строк» нет — данные формирует запрос. Чтобы спозиционироваться на конкретной записи, достаточно знать её ссылку и присвоить её в ТекущаяСтрока. Если запись отфильтрована текущим отбором списка, позиционирование не сработает: сначала сбросьте или скорректируйте отбор.
- 1Определите тип формы: управляемая или обычная
- 2Найдите нужную строку через НайтиСтроки или перебор
- 3Получите идентификатор строки методом ПолучитьИдентификатор() (для управляемой формы)
- 4Присвойте идентификатор в Элементы.ИмяТаблицы.ТекущаяСтрока или добавьте в ВыделенныеСтроки
- 5Проверьте, что таблица прокрутилась к строке и выделение видно пользователю
Визуальное выделение через условное оформление
Иногда под «выделить строки» понимают не курсорное выделение, а подсветку цветом — например, окрасить строки с ошибками. Это решается не через ТекущаяСтрока, а через условное оформление формы: у элемента УсловноеОформление создаётся элемент с отбором по полю и оформлением (ЦветФона, ЦветТекста, Шрифт).
// Подсветить строки с количеством 0 красным фоном
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СветлоКрасный);
Отбор = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Количество");
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Отбор.ПравоеЗначение = 0;
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Товары");
Условное оформление устойчиво к перерисовке и сортировке таблицы, чего нельзя сказать о попытках раскрашивать строки вручную при каждом событии. Используйте его, когда подсветка должна сохраняться при работе пользователя.
Проверка результата и отладка
После выполнения кода убедитесь, что выделение действительно установлено: прочитайте Элементы.Товары.ТекущаяСтрока и сравните с ожидаемым идентификатором, проверьте ВыделенныеСтроки.Количество(). В отладчике удобно смотреть эти свойства сразу после присвоения.
Если код выполняется в обработчике, который срабатывает до отображения данных (например, ПриСозданииНаСервере), выделение может «слетать» при последующем обновлении формы. Переносите установку выделения в обработчики, выполняемые после загрузки данных, либо вызывайте после завершения заполнения коллекции.
Как проверить результат
Содержит идентификатор нужной строки, таблица прокручена к ней
Неопределено или другой идентификатор — строка не найдена или коллекция перезаполнена
Равно числу добавленных строк
0 или 1 при множественном добавлении — проверьте РежимВыделения
Строки подсвечены курсором выделения
Выделение есть в данных, но не видно — таблица не активна или строки вне области
FAQ
Почему ТекущаяСтрока присваивается, но таблица не прокручивается к строке?
Чаще всего табличное поле в этот момент не активно или форма ещё не отображена. Попробуйте установить выделение после полной загрузки данных и проверьте, что строка не скрыта отбором. Для динамического списка также убедитесь, что запись присутствует в текущей выборке запроса.
Как снять выделение со всех строк программно?
В управляемой форме вызовите Элементы.Товары.ВыделенныеСтроки.Очистить() и, при необходимости, присвойте ТекущаяСтрока = Неопределено. В обычной форме очистка выполняется аналогично через коллекцию выделенных строк табличного поля.
Можно ли выделить строки в динамическом списке по условию, не зная ссылок?
Напрямую перебрать строки динамического списка нельзя — данные формируются запросом. Выполните отдельный запрос с тем же отбором, получите ссылки подходящих записей и добавьте их в ВыделенныеСтроки элемента списка.
Почему после сортировки таблицы выделение сбрасывается?
При сортировке или перезаполнении коллекции платформа может пересоздать строки, и идентификаторы изменятся. Сохраните ключевые значения строк (например, ссылки или уникальные поля) перед операцией и после неё найдите строки заново и установите выделение повторно.
Чем выделение отличается от условного оформления?
Выделение — это состояние курсора и выбранных строк, оно временно и управляется пользователем и кодом. Условное оформление — постоянная визуальная подсветка по правилу, сохраняющаяся при прокрутке и сортировке. Для статусной подсветки (ошибки, просрочка) используйте условное оформление, для указания «рабочей» строки — выделение.
Работает ли программное выделение в веб-клиенте?
Да, для управляемых форм механизм ТекущаяСтрока и ВыделенныеСтроки работает в тонком и веб-клиенте одинаково. Ограничения касаются обычных форм и отдельных методов, доступных только в толстом клиенте.
Что важно запомнить
В управляемой форме выделяйте строки через ТекущаяСтрока и ВыделенныеСтроки, передавая идентификаторы из ПолучитьИдентификатор(); в обычной — через строки данных табличного поля. Для множественного выделения включите множественный РежимВыделения, для постоянной подсветки используйте условное оформление, а после сортировки и перезаполнения устанавливайте выделение заново.