Почему свойство НомерСтроки возвращает 0 при выборе текущей строки в 1С?

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

При разработке интерфейсов форм в платформе 1С:Предприятие часто возникает задача получить порядковый номер выделенной строки в табличном поле или таблице формы. Нередко разработчики сталкиваются с ситуацией, когда конструкция вида ЭлементыФормы.ТФ.ТекущаяСтрока.НомерСтроки постоянно возвращает 0, независимо от того, какая строка фактически выбрана пользователем. Давайте разберем причины такого поведения и рассмотрим правильные варианты получения номера строки.

Причины возникновения проблемы

Проанализируем основные причины, приводящие к возврату нулевого значения:

  1. Несоответствие типа источника данных: стандартное свойство НомерСтроки присутствует только у строк табличных частей прикладных объектов (документов, справочников и т. д.). Если в качестве источника данных для таблицы используется ТаблицаЗначений, у её строк по умолчанию нет такого свойства. При обращении к несуществующему реквизиту платформа либо возвратит значение по умолчанию (для числовых полей это 0), либо вызовет ошибку, если колонка не была предварительно добавлена в структуру.
  2. Особенности создания новых строк табличной части: если таблица связана с реальной табличной частью объекта базы данных, то у вновь добавленных пользователем строк реквизит НомерСтроки может оставаться равным 0 до момента проведения автоматической перенумерации или непосредственной записи объекта в базу.
  3. Разница между свойствами ТекущаяСтрока и ТекущиеДанные: свойство ТекущаяСтрока возвращает саму строку или её идентификатор, тогда как свойство ТекущиеДанные возвращает объект с актуальными данными строки таблицы с учетом состава колонок.

Способ 1. Получение порядкового номера строки Таблицы Значений через индекс (Обычные формы)

Рассмотрим случай, когда табличное поле связано с объектом ТаблицаЗначений в обычном приложении. Чтобы определить порядковый номер текущей строки, выясним её позицию во внутренней коллекции с помощью метода Индекс(). Так как индексация строк в 1С начинается с нуля, для получения привычного пользователю номера строки прибавим единицу.

Разберем пример реализации:


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

Способ 2. Получение данных через ТекущиеДанные для табличных частей (Обычные формы)

Если табличное поле привязано к стандартной табличной части объекта (например, документа), для чтения номера строки обратимся к свойству ТекущиеДанные элемента управления. Обязательно предусмотрим проверку на Неопределено на случай, если в таблице нет строк или фокус снят.

Посмотрим на пример кода:


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

Способ 3. Получение номера строки в управляемых формах (1С v8.3)

В управляемом интерфейсе логика работы элементов формы отличается: свойство Элементы.ТФ.ТекущаяСтрока возвращает числовой идентификатор строки, а не саму строку коллекции. Чтобы вычислить порядковый номер в управляемой форме, применим обращение через ТекущиеДанные либо поиск по идентификатору.

Разберем вариант вычисления номера через ТекущиеДанные:


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

Также рассмотрим вариант получения строки по идентификатору:


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

Важные рекомендации при работе с номерами строк

Выделим ключевые нюансы, о которых следует помнить при написании программного кода:

  1. Всегда проверяйте наличие строки: перед обращением к свойствам или методам обязательно делайте проверку на Неопределено, чтобы исключить аварийное завершение работы модуля при пустой таблице.
  2. Сортировки и отборы: метод Индекс() возвращает физический индекс строки внутри коллекции источника данных, а не ее визуальный порядковый номер на экране, если к табличному полю применены пользовательские отборы или сортировки.
← На главную