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