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

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

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

Способы программного выделения строк в табличном поле 1С 8.3: ТекущаяСтрока, ВыделенныеСтроки, работа в управляемых и обычных формах, типовые ошибки.

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

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

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

Чем отличается выделение в управляемой и обычной форме

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

Быстрый признак: если в модуле формы доступны ЭтаФорма, Элементы и реквизиты формы — это управляемая форма. Если используются ЭтаФорма.ЭлементыФормы и ЭлементыФормы.ТабличноеПоле1 — обычная. Код для одной модели в другой либо не скомпилируется, либо тихо не сработает, поэтому проверка типа формы — первый шаг.

Выделение одной строки в управляемой форме

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

// Найти строку по условию и сделать её текущей

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

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

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

КонецЕсли;

Для динамического списка (например, список документов или справочника) в ТекущаяСтрока передаётся ключ записи — для ссылочных списков это сама ссылка:

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

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

Выделение нескольких строк программно

Множественное выделение выполняется через коллекцию ВыделенныеСтроки элемента формы. Предварительно у таблицы в палитре свойств должен быть разрешён множественный выбор: свойство РежимВыделения — «Множественный». Без этого программное добавление строк в выделение может не дать видимого эффекта.

// Выделить все строки с нулевым количеством

Элементы.Товары.ВыделенныеСтроки.Очистить();

Для Каждого СтрокаТовара Из Объект.Товары Цикл

Если СтрокаТовара.Количество = 0 Тогда

Элементы.Товары.ВыделенныеСтроки.Добавить(СтрокаТовара.ПолучитьИдентификатор());

КонецЕсли;

КонецЦикла;

Обратная задача — узнать, какие строки выделил пользователь. Для этого перебирают ту же коллекцию и получают данные через НайтиПоИдентификатору():

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

ДанныеСтроки = Объект.Товары.НайтиПоИдентификатору(Идентификатор);

// работа с ДанныеСтроки

КонецЦикла;

Выделение строк в обычной форме

В обычных формах у элемента ТабличноеПоле есть свойство ТекущаяСтрока, которому присваивают значение строки данных — например, строку таблицы значений или ссылку для списка. Для выделения диапазона используется метод УстановитьГраницыВыделения либо работа со свойством ВыделенныеСтроки через область выделения.

// Обычная форма: сделать строку таблицы значений текущей

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

Если СтрокаТЗ <> Неопределено Тогда

ЭлементыФормы.Товары.ТекущаяСтрока = СтрокаТЗ;

КонецЕсли;

Для множественного выделения в обычной форме табличное поле должно иметь РежимВыделения = РежимВыделенияТабличногоПоля.Множественный. Программно отметить строки можно, перебирая коллекцию данных и добавляя их в выделение через ЭлементыФормы.Товары.ВыделенныеСтроки.Добавить(СтрокаТЗ) — здесь передаётся сама строка данных, а не идентификатор.

Сравнение подходов

Управляемая форма

ТекущаяСтрока и ВыделенныеСтроки принимают числовые идентификаторы строк; для динамического списка — ссылку. Работает в тонком и веб-клиенте.

Обычная форма

ТекущаяСтрока и ВыделенныеСтроки принимают сами строки данных. Работает только в толстом клиенте обычного приложения.

Как найти нужную строку перед выделением

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

В динамическом списке «поиска строк» нет — данные формирует запрос. Чтобы спозиционироваться на конкретной записи, достаточно знать её ссылку и присвоить её в ТекущаяСтрока. Если запись отфильтрована текущим отбором списка, позиционирование не сработает: сначала сбросьте или скорректируйте отбор.

Порядок действий
  1. 1
    Определите тип формы: управляемая или обычная
  2. 2
    Найдите нужную строку через НайтиСтроки или перебор
  3. 3
    Получите идентификатор строки методом ПолучитьИдентификатор() (для управляемой формы)
  4. 4
    Присвойте идентификатор в Элементы.ИмяТаблицы.ТекущаяСтрока или добавьте в ВыделенныеСтроки
  5. 5
    Проверьте, что таблица прокрутилась к строке и выделение видно пользователю

Визуальное выделение через условное оформление

Иногда под «выделить строки» понимают не курсорное выделение, а подсветку цветом — например, окрасить строки с ошибками. Это решается не через ТекущаяСтрока, а через условное оформление формы: у элемента УсловноеОформление создаётся элемент с отбором по полю и оформлением (ЦветФона, ЦветТекста, Шрифт).

// Подсветить строки с количеством 0 красным фоном

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

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

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

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

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

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

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

ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Товары");

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

Типичные ошибки
01
Передача номера строки вместо идентификатора в ТекущаяСтрока — выделяется не та строка или не выделяется ничего
02
Использование идентификатора, полученного до перезаполнения таблицы, — идентификатор уже недействителен
03
Попытка множественного выделения при одиночном РежимеВыделения таблицы — выделяется только одна строка
04
Позиционирование на записи динамического списка, скрытой текущим отбором, — список не переходит к записи
05
Смешение API обычной и управляемой формы — ЭлементыФормы в управляемой форме недоступны

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

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

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

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

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

ТекущаяСтрока после присвоения
Норма

Содержит идентификатор нужной строки, таблица прокручена к ней

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

Неопределено или другой идентификатор — строка не найдена или коллекция перезаполнена

ВыделенныеСтроки.Количество()
Норма

Равно числу добавленных строк

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

0 или 1 при множественном добавлении — проверьте РежимВыделения

Видимость выделения на форме
Норма

Строки подсвечены курсором выделения

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

Выделение есть в данных, но не видно — таблица не активна или строки вне области

FAQ

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

Чаще всего табличное поле в этот момент не активно или форма ещё не отображена. Попробуйте установить выделение после полной загрузки данных и проверьте, что строка не скрыта отбором. Для динамического списка также убедитесь, что запись присутствует в текущей выборке запроса.

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

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

Можно ли выделить строки в динамическом списке по условию, не зная ссылок?

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

Почему после сортировки таблицы выделение сбрасывается?

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

Чем выделение отличается от условного оформления?

Выделение — это состояние курсора и выбранных строк, оно временно и управляется пользователем и кодом. Условное оформление — постоянная визуальная подсветка по правилу, сохраняющаяся при прокрутке и сортировке. Для статусной подсветки (ошибки, просрочка) используйте условное оформление, для указания «рабочей» строки — выделение.

Работает ли программное выделение в веб-клиенте?

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

Итог

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

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