Разработка и Конфигурация · 10 мин
Как узнать номер строки в таблице 1С
Как узнать номер строки в табличной части 1С: свойство НомерСтроки, метод Индекс, отображение в пользовательском режиме. Примеры кода и типичные ошибки.
Вопрос о номере строки возникает в двух разных ситуациях. Первая — пользовательская: нужно быстро понять, какая по счёту строка в табличной части документа или в динамическом списке. Вторая — программная: разработчику требуется получить номер строки табличной части, таблицы значений или табличного поля из встроенного языка 1С. Способы в этих сценариях различаются, и путать их нельзя: у табличной части и таблицы значений разные объектные модели.
Ключевой момент, который стоит понять сразу: в 1С нумерация строк табличной части документа начинается с единицы, а индексация строк таблицы значений — с нуля. Из-за этого метод Индекс() и свойство НомерСтроки для одной и той же строки вернут разные значения. Именно на этом расхождении строится большинство ошибок начинающих разработчиков.
Ниже разобраны оба подхода: как посмотреть номер строки в пользовательском режиме без программирования и как получить его в коде для табличной части, таблицы значений и табличного поля формы. Отдельно рассмотрены типичные ошибки и способы проверить результат.
Как посмотреть номер строки в пользовательском режиме
В типовых конфигурациях 1С табличные части документов по умолчанию отображают колонку с номером строки — обычно она называется «№» или «N». Достаточно открыть документ и посмотреть на первую колонку таблицы: нумерация идёт сверху вниз начиная с единицы. Это самый быстрый способ, не требующий никаких настроек.
Если колонка с номером не видна, её могли скрыть при настройке формы. В управляемых формах откройте меню «Ещё» в шапке табличной части и выберите пункт «Изменить форму». В дереве элементов найдите поле с номером строки и установите для него видимость. После сохранения настроек колонка появится.
В динамических списках (журналы документов, списки справочников) нумерации строк как таковой нет, потому что состав списка меняется при фильтрации и сортировке. Порядковое положение записи в таком списке не является устойчивым номером — полагаться на него в прикладной логике нельзя.
Как получить номер строки табличной части в коде
У каждой строки табличной части есть встроенное свойство НомерСтроки. Оно заполняется платформой автоматически и всегда соответствует текущему положению строки. Обращение к нему — основной способ узнать номер строки в программном коде.
Для Каждого СтрокаТовары Из Объект.Товары Цикл
Сообщить("Строка № " + СтрокаТовары.НомерСтроки + ": " + СтрокаТовары.Номенклатура);
КонецЦикла;
Если нужен номер текущей (выделенной) строки на форме документа, обратитесь к данным текущей строки элемента формы:
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
НомерТекущейСтроки = ТекущиеДанные.НомерСтроки;
КонецЕсли;
Проверка на Неопределено обязательна: если в таблице нет ни одной строки или фокус находится вне табличной части, свойство ТекущиеДанные вернёт Неопределено, и обращение к НомерСтроки вызовет ошибку выполнения.
НомерСтроки = Элементы.Товары.ТекущиеДанные.НомерСтроки;Как узнать номер строки в таблице значений
У строк таблицы значений нет свойства НомерСтроки — это принципиальное отличие от табличной части. Позицию строки определяют методом Индекс(), который возвращает индекс с нуля. Чтобы получить «человеческий» номер, к результату прибавляют единицу.
ТЗ = Объект.Товары.Выгрузить();
Для Каждого СтрокаТЗ Из ТЗ Цикл
НомерПоПорядку = ТЗ.Индекс(СтрокаТЗ) + 1;
КонецЦикла;
Более эффективный вариант — цикл по индексам, когда номер вычисляется без вызова метода:
Для Инд = 0 По ТЗ.Количество() - 1 Цикл
НомерСтроки = Инд + 1;
СтрокаТЗ = ТЗ[Инд];
КонецЦикла;
Метод Индекс() выполняет поиск строки перебором, поэтому внутри цикла по большой таблице он заметно замедляет обработку. Для таблиц из тысяч строк предпочтителен цикл по индексам или добавление служебной колонки с номером при заполнении таблицы.
Сравнение способов
Табличная часть документа или справочника. Нумерация с 1, поддерживается платформой автоматически.
Таблица значений. Индекс с нуля, поиск перебором — медленно на больших таблицах.
Таблица значений любого размера. Самый быстрый вариант, номер вычисляется без поиска.
Когда номер нужен многократно или таблица передаётся между процедурами. Требует заполнения вручную.
Как определить номер строки в табличном поле формы
Когда таблица на форме отсортирована или отфильтрована пользователем, видимый порядок строк может не совпадать с порядком в данных. Свойство НомерСтроки при этом всё равно возвращает номер в исходной табличной части, а не позицию на экране. Если требуется именно «экранный» номер, его придётся вычислять через индекс строки в данных формы.
Для таблицы формы, связанной с динамическим списком или таблицей значений, текущую строку получают через Элементы.ИмяТаблицы.ТекущаяСтрока. Это свойство возвращает идентификатор строки, а не её номер. Идентификатор можно преобразовать в данные методом НайтиПоИдентификатору() объекта данных формы, а затем вычислить индекс.
Учитывайте, что идентификаторы строк данных формы не имеют ничего общего с порядковыми номерами: это внутренние числовые ключи, которые платформа назначает при создании строк. Использовать их как номер строки — ошибка.
Типичные ошибки при работе с номерами строк
Самая распространённая ошибка — смешение Индекс() и НомерСтроки. Разработчик получает индекс строки таблицы значений (с нуля) и выводит его пользователю как номер, в результате первая строка отображается как «№ 0». Обратная ситуация: к НомерСтроки прибавляют единицу по привычке, и нумерация начинается с двойки.
Вторая группа ошибок связана с изменением коллекции во время обхода. Если внутри цикла удалять строки табличной части, номера оставшихся строк пересчитаются прямо во время итерации, и часть строк будет пропущена. Правильный приём — удалять в цикле с конца (от последней строки к первой) или собирать строки для удаления в отдельный массив.
Третья типичная ситуация — обращение к ТекущиеДанные.НомерСтроки без проверки, что строка вообще выбрана. В пустой таблице это приводит к падению кода с ошибкой «Поле объекта не обнаружено» или обращению к Неопределено.
Как проверить, что номер строки определён правильно
Простейшая проверка — вывести номер вместе с содержимым строки и сверить с тем, что видно на форме документа. Если колонка «№» в табличной части показывает 3, а код вернул 2 или 4, значит используется не тот метод или смещена нумерация.
Для таблицы значений удобно проверить граничные случаи: первая строка должна давать номер 1, последняя — совпадать с Количество(). Если последний номер меньше количества строк на единицу, наверняка забыт инкремент после Индекс().
При работе с текущей строкой формы проверяйте поведение на пустой таблице и на таблице с одной строкой — именно здесь проявляются необработанные случаи с Неопределено.
Как проверить результат
Равен 1
Равен 0 — не прибавлена единица к Индекс()
Совпадает с Количество() таблицы
Меньше на 1 — смещение нумерации
Код отрабатывает без ошибки
Падение при обращении к ТекущиеДанные
Номер в коде равен колонке «№»
Расхождение — использован индекс вместо номера
Когда номер строки использовать не стоит
Номер строки подходит для сообщений пользователю («ошибка в строке 5»), для протоколирования и для простых визуальных задач. Он не подходит для идентификации данных: любое редактирование таблицы делает сохранённые номера бессмысленными.
Если нужно связать строки двух табличных частей (например, товары и серии), используйте реквизит-ключ связи — в типовых конфигурациях для этого служит поле «КлючСвязи». Если нужно вернуться к строке после обработки, сохраняйте саму строку или её уникальные ключевые поля, а не номер.
Что важно запомнить
Табличная часть: свойство НомерСтроки, нумерация с 1. Таблица значений: метод Индекс() с прибавлением 1 или цикл по индексам. Форма: ТекущиеДанные с обязательной проверкой на Неопределено. Номер строки — не идентификатор, для связи данных используйте ключевые поля.
Частые вопросы
Почему Индекс() возвращает номер на единицу меньше ожидаемого?
Потому что индексация коллекций во встроенном языке 1С начинается с нуля, а привычная пользователю нумерация — с единицы. Метод Индекс() возвращает позицию в коллекции, поэтому для отображения пользователю к результату прибавляют 1.
Можно ли изменить номер строки табличной части вручную?
Напрямую присвоить значение свойству НомерСтроки нельзя — оно управляется платформой. Изменить номер можно только косвенно: переместить строку методом Сдвинуть() или удалить и вставить строку в нужную позицию методом Вставить().
Как узнать номер строки при поиске по значению?
Используйте метод Найти() таблицы значений или НайтиСтроки() табличной части — они вернут найденную строку. Затем для таблицы значений примените Индекс() к найденной строке, а для табличной части прочитайте её свойство НомерСтроки.
Почему после удаления строки номера «съехали»?
Это штатное поведение: платформа автоматически перенумеровывает строки табличной части, чтобы нумерация оставалась непрерывной. Если код запомнил номера до удаления, их нужно получить заново после изменения коллекции.
Как вывести номер строки в печатной форме?
В макете обычно заводят переменную-счётчик, которую увеличивают на единицу в цикле вывода строк, и подставляют в параметр области. Полагаться на НомерСтроки здесь можно только если выводятся все строки подряд без группировок и пропусков.
Есть ли номер строки у записи регистра сведений?
Нет. Наборы записей регистров не имеют порядковых номеров строк — записи идентифицируются измерениями и периодом. Если нужен порядок, добавьте в запрос упорядочивание и нумеруйте записи при обходе результата.