Как получить индекс и идентификатор текущей активной строки в таблице формы 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Различие между индексом и идентификатором строки

В управляемых формах 1С данные табличной части или таблицы значений хранятся в специальном объекте ДанныеФормыКоллекция. Для корректной работы с элементами этой коллекции важно различать два понятия:

  1. Идентификатор строки: Свойство элемента формы ТекущаяСтрока возвращает числовой идентификатор строки на клиенте. Этот идентификатор уникален внутри открытой формы и не изменяется при сортировках или удалении соседних строк. Метод ПолучитьИдентификатор() у объекта данных строки возвращает именно это число.
  2. Индекс строки: Порядковый номер строки в коллекции данных, который начинается с нуля (0, 1, 2...). Индекс динамически меняется при удалении или добавлении элементов. Метод Индекс() коллекции принимает на вход объект строки, а не числовой идентификатор.

Получение индекса текущей строки через элементы формы

Рассмотрим типовой сценарий, когда табличная часть или таблица значений привязана к реквизиту формы. Чтобы получить порядковый номер текущей выделенной строки, обратимся к свойствам ТекущиеДанные элемента управления и методу Индекс() коллекции данных:


ТекущиеДанныеСтроки = Элементы.Товары.ТекущиеДанные;
Если ТекущиеДанныеСтроки <> Неопределено Тогда
    ИндексСтроки = Объект.Товары.Индекс(ТекущиеДанныеСтроки);
    Сообщить("Индекс текущей строки: " + ИндексСтроки);
КонецЕсли;

Если таблица значений является самостоятельным реквизитом управляемой формы (например, ТаблицаВыбора), обращение к коллекции выполняется напрямую по имени реквизита:


ТекущиеДанныеСтроки = Элементы.ТаблицаВыбора.ТекущиеДанные;
Если ТекущиеДанныеСтроки <> Неопределено Тогда
    ИндексСтроки = ТаблицаВыбора.Индекс(ТекущиеДанныеСтроки);
КонецЕсли;

Работа в контексте событий элемента формы (параметр «Элемент»)

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


&НаКлиенте
Процедура ТаблицаПриАктивизацииСтроки(Элемент)
    СтрокаДанных = Элемент.ТекущиеДанные;
    Если СтрокаДанных <> Неопределено Тогда
        Идентификатор = СтрокаДанных.ПолучитьИдентификатор();
        
        // Получаем коллекцию формы универсально через путь к данным
        КоллекцияФормы = ЭтаФорма[Элемент.ПутьКДанным];
        ИндексСтроки = КоллекцияФормы.Индекс(СтрокаДанных);
    КонецЕсли;
КонецПроцедуры

Способы удаления текущей строки из таблицы формы

Если цель получения индекса или идентификатора — удаление активной строки из таблицы значений формы, рассмотрим доступные варианты реализации:

  1. Удаление напрямую по объекту строки: Самый простой и надежный способ, не требующий предварительного вычисления числового индекса.
    
    Если Элементы.ТаблицаВыбора.ТекущиеДанные <> Неопределено Тогда
        ТаблицаВыбора.Удалить(Элементы.ТаблицаВыбора.ТекущиеДанные);
    КонецЕсли;
    
  2. Удаление по идентификатору строки: Используем поиск строки по свойству ТекущаяСтрока.
    
    ИдентификаторСтроки = Элементы.ТаблицаВыбора.ТекущаяСтрока;
    Если ИдентификаторСтроки <> Неопределено Тогда
        СтрокаДляУдаления = ТаблицаВыбора.НайтиПоИдентификатору(ИдентификаторСтроки);
        Если СтрокаДляУдаления <> Неопределено Тогда
            ТаблицаВыбора.Удалить(СтрокаДляУдаления);
        КонецЕсли;
    КонецЕсли;
    
  3. Удаление по вычисленному индексу:
    
    Если Элементы.ТаблицаВыбора.ТекущиеДанные <> Неопределено Тогда
        ИндексСтроки = ТаблицаВыбора.Индекс(Элементы.ТаблицаВыбора.ТекущиеДанные);
        Если ИндексСтроки >= 0 Тогда
            ТаблицаВыбора.Удалить(ИндексСтроки);
        КонецЕсли;
    КонецЕсли;
    

Особенности для обычных форм и динамических списков

Выясним важные различия в зависимости от типа формы и источника данных:

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

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

← На главную