При разработке интерфейсов в 1С:Предприятии часто возникает задача обработать или удалить активную строку таблицы. При этом разработчики нередко сталкиваются с путаницей между порядковым индексом строки, ее внутренним идентификатором на клиенте и ссылкой на данные. Разберем подробно, как правильно обращаться к активной строке таблицы формы, как вычислить ее индекс и как выполнить необходимые манипуляции.
В управляемых формах 1С данные табличной части или таблицы значений хранятся в специальном объекте ДанныеФормыКоллекция. Для корректной работы с элементами этой коллекции важно различать два понятия:
ТекущаяСтрока возвращает числовой идентификатор строки на клиенте. Этот идентификатор уникален внутри открытой формы и не изменяется при сортировках или удалении соседних строк. Метод ПолучитьИдентификатор() у объекта данных строки возвращает именно это число.Индекс() коллекции принимает на вход объект строки, а не числовой идентификатор.Рассмотрим типовой сценарий, когда табличная часть или таблица значений привязана к реквизиту формы. Чтобы получить порядковый номер текущей выделенной строки, обратимся к свойствам ТекущиеДанные элемента управления и методу Индекс() коллекции данных:
ТекущиеДанныеСтроки = Элементы.Товары.ТекущиеДанные;
Если ТекущиеДанныеСтроки <> Неопределено Тогда
ИндексСтроки = Объект.Товары.Индекс(ТекущиеДанныеСтроки);
Сообщить("Индекс текущей строки: " + ИндексСтроки);
КонецЕсли;
Если таблица значений является самостоятельным реквизитом управляемой формы (например, ТаблицаВыбора), обращение к коллекции выполняется напрямую по имени реквизита:
ТекущиеДанныеСтроки = Элементы.ТаблицаВыбора.ТекущиеДанные;
Если ТекущиеДанныеСтроки <> Неопределено Тогда
ИндексСтроки = ТаблицаВыбора.Индекс(ТекущиеДанныеСтроки);
КонецЕсли;
Проанализируем ситуацию, когда обработка выполняется внутри события таблицы (например, ПриАктивизацииСтроки или Выбор). В такие процедуры платформа передает параметр Элемент, представляющий собой объект ТаблицаФормы. В этом случае мы можем написать универсальный код без жесткой привязки к имени элемента через коллекцию Элементы:
&НаКлиенте
Процедура ТаблицаПриАктивизацииСтроки(Элемент)
СтрокаДанных = Элемент.ТекущиеДанные;
Если СтрокаДанных <> Неопределено Тогда
Идентификатор = СтрокаДанных.ПолучитьИдентификатор();
// Получаем коллекцию формы универсально через путь к данным
КоллекцияФормы = ЭтаФорма[Элемент.ПутьКДанным];
ИндексСтроки = КоллекцияФормы.Индекс(СтрокаДанных);
КонецЕсли;
КонецПроцедуры
Если цель получения индекса или идентификатора — удаление активной строки из таблицы значений формы, рассмотрим доступные варианты реализации:
Если Элементы.ТаблицаВыбора.ТекущиеДанные <> Неопределено Тогда
ТаблицаВыбора.Удалить(Элементы.ТаблицаВыбора.ТекущиеДанные);
КонецЕсли;
ТекущаяСтрока.
ИдентификаторСтроки = Элементы.ТаблицаВыбора.ТекущаяСтрока;
Если ИдентификаторСтроки <> Неопределено Тогда
СтрокаДляУдаления = ТаблицаВыбора.НайтиПоИдентификатору(ИдентификаторСтроки);
Если СтрокаДляУдаления <> Неопределено Тогда
ТаблицаВыбора.Удалить(СтрокаДляУдаления);
КонецЕсли;
КонецЕсли;
Если Элементы.ТаблицаВыбора.ТекущиеДанные <> Неопределено Тогда
ИндексСтроки = ТаблицаВыбора.Индекс(Элементы.ТаблицаВыбора.ТекущиеДанные);
Если ИндексСтроки >= 0 Тогда
ТаблицаВыбора.Удалить(ИндексСтроки);
КонецЕсли;
КонецЕсли;
Выясним важные различия в зависимости от типа формы и источника данных:
Обычные формы (толстый клиент): В неуправляемых формах элемент ТабличноеПоле работает напрямую с объектом ТаблицаЗначений. Свойство Элемент.ТекущаяСтрока сразу возвращает объект СтрокаТаблицыЗначений. Индекс в этом случае получается через метод ТаблицаЗначений.Индекс(ЭлементыФормы.Таблица.ТекущаяСтрока).
Динамические списки: Если в форме выбора отображается ДинамическийСписок, понятие индекса строки таблицы значений к нему неприменимо. Свойство ТекущаяСтрока динамического списка возвращает не числовой идентификатор коллекции, а ссылку на объект информационной базы (Ссылка). Удаление строк из динамического списка методами коллекции формы невозможно — изменение выполняется непосредственно в базе данных с последующим вызовом метода Элементы.ИмяСписка.Обновить().