К статье
Практический материал

Разработка и Конфигурация · 10 мин

Номер строки в 1С: какой тип данных и как с ним работать

Номер строки табличной части в 1С — какой тип данных используется, как получить номер строки в запросе и коде, типичные ошибки и примеры для разработчика.

Вопрос «номер строки в 1С — какой тип» возникает у разработчиков в нескольких ситуациях: при обращении к свойству НомерСтроки строки табличной части, при описании реквизита для хранения номера, при сортировке и сравнении номеров в запросе. Короткий ответ: свойство НомерСтроки строки табличной части имеет тип Число (целое, без дробной части), нумерация начинается с единицы и ведётся платформой автоматически.

При этом сам разработчик не выбирает тип этого свойства — он задан платформой. Но если вы создаёте собственный реквизит для хранения номера строки (например, для фиксации исходного порядка), тип нужно указать явно: Число с длиной, достаточной под максимальное количество строк, и точностью 0. Ошибки возникают, когда номер хранят как строку и потом получают сортировку «1, 10, 2» вместо «1, 2, 10».

Ниже разобраны типы номеров строк в разных объектах платформы, способы получить номер строки в коде и запросе, а также типичные ошибки при сравнении и сортировке.

Какой тип у свойства НомерСтроки табличной части

У каждой строки табличной части документа, справочника или другого объекта есть служебное свойство НомерСтроки. Его тип — Число, целое значение. Платформа присваивает номера автоматически при добавлении строк: первая строка получает номер 1, вторая — 2 и так далее. При удалении строки из середины оставшиеся строки перенумеровываются, чтобы последовательность оставалась непрерывной.

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

Отличие номера от индекса: метод Индекс() возвращает позицию строки в коллекции, начиная с нуля, а НомерСтроки — с единицы. Связь простая: НомерСтроки = Индекс + 1. Путаница между ними — частая причина ошибок «на единицу» при программной обработке.

Тип номера строки в таблице значений и других коллекциях

У строки таблицы значений свойства НомерСтроки нет — таблица значений не ведёт автоматической нумерации. Позицию строки определяют через Таблица.Индекс(Строка) (отсчёт с нуля) либо добавляют собственную колонку «НомерСтроки» с типом Число и заполняют вручную в цикле.

Для динамического списка и табличного поля формы номер строки, который видит пользователь, — это визуальная нумерация элемента управления, а не данные. Программно опираться на неё нельзя: при сортировке или отборе визуальные номера пересчитываются, а данные строк остаются прежними.

В запросе поле НомерСтроки табличной части доступно напрямую и тоже имеет числовой тип. Его можно использовать в условиях, сортировке и соединениях:

ВЫБРАТЬ

Товары.НомерСтроки КАК НомерСтроки,

Товары.Номенклатура КАК Номенклатура

ИЗ

Документ.РеализацияТоваровУслуг.Товары КАК Товары

ГДЕ

Товары.Ссылка = &Ссылка

УПОРЯДОЧИТЬ ПО

Товары.НомерСтроки

Как правильно завести собственный реквизит под номер строки

Если требуется зафиксировать исходный номер строки (например, при загрузке из файла, где порядок строк имеет значение, или при обмене с внешней системой), создайте отдельный реквизит. Правильная настройка типа:

  • тип — Число;
  • длина — с запасом под максимальное число строк (например, 5–6 знаков для типовых документов);
  • точность — 0, дробная часть не нужна;
  • неотрицательное — да, если номера отрицательными не бывают.

Тип Строка для номера использовать не следует. Строковое сравнение лексикографическое: «10» окажется меньше «2», сортировка в запросе и в табличном поле будет неестественной, а поиск максимального номера через МАКСИМУМ() вернёт неожиданный результат.

Получение номера строки в коде: типовые приёмы

Обратиться к номеру текущей строки табличной части объекта можно напрямую:

Для Каждого СтрокаТовары Из Объект.Товары Цикл

Сообщить("Строка " + СтрокаТовары.НомерСтроки + ": " + СтрокаТовары.Номенклатура);

КонецЦикла;

Для таблицы значений собственный номер присваивают вручную:

Номер = 1;

Для Каждого СтрокаТЗ Из ТаблицаЗначений Цикл

СтрокаТЗ.НомерСтроки = Номер;

Номер = Номер + 1;

КонецЦикла;

В обработчиках формы, например при проверке заполнения, номер строки используют, чтобы указать пользователю точное место ошибки. Свойство ТекущиеДанные.НомерСтроки доступно в событиях табличной части формы и помогает сформировать понятное сообщение: «В строке 5 не заполнена номенклатура».

Порядок действий
  1. 1
    Определите, где нужен номер: штатная табличная часть, таблица значений или собственный реквизит.
  2. 2
    Для табличной части объекта используйте готовое свойство НомерСтроки — оно уже числовое.
  3. 3
    Для таблицы значений добавьте колонку типа Число (точность 0) и заполните её в цикле.
  4. 4
    Для реквизита в метаданных задайте тип Число с достаточной длиной и точностью 0.
  5. 5
    Проверьте сортировку и сравнение на данных с номерами больше 9 — там проявляется строковая сортировка.

Сортировка, сравнение и поиск по номеру строки

Числовой тип номера даёт корректное поведение в трёх операциях. Первая — сортировка: УПОРЯДОЧИТЬ ПО НомерСтроки в запросе или Таблица.Сортировать("НомерСтроки") упорядочат значения арифметически. Вторая — сравнение в условиях: ГДЕ НомерСтроки > 10 работает ожидаемо. Третья — агрегаты: МАКСИМУМ(НомерСтроки) возвращает реальный последний номер, что удобно для определения количества строк без отдельного подсчёта.

Если номер хранится строкой, все три операции ломаются: сортировка идёт по алфавиту, сравнение «'10' > '2'» даёт ложь, максимум возвращает «9» вместо «10». Исправление на лету через ВЫРАЗИТЬ(НомерСтроки КАК ЧИСЛО) в запросе возможно, но замедляет выборку и не работает для значений, которые не преобразуются в число.

Сравнение вариантов

Число (точность 0)

Правильная сортировка, сравнение и агрегаты. Подходит всегда, когда хранится именно порядковый номер.

Строка

Допустима только если «номер» — это код вида «001-А» из внешней системы. Сортировка лексикографическая, сравнение некорректно.

Штатное свойство НомерСтроки

Не требует настройки, но отражает только текущий порядок строк и меняется при их перемещении.

Типичные ошибки и ограничения

Первая ошибка — попытка присвоить НомерСтроки значение вручную. Платформа игнорирует или перезаписывает такое присвоение, потому что номер определяется позицией в коллекции. Для изменения порядка используйте Сдвинуть() или перестройку коллекции.

Вторая ошибка — опора на номер строки как на постоянный идентификатор. После удаления строки из середины все последующие номера сдвигаются. Если нужна устойчивая связь со строкой, храните ключевые поля (номенклатуру, характеристику, ключ строки), а не номер.

Третья ошибка — смешение индекса и номера. Цикл Для Инд = 1 По Таблица.Количество() - 1 с обращением Таблица[Инд] пропускает первую строку, потому что индексация коллекций идёт с нуля. Проверяйте границы циклов на тестовых данных из двух-трёх строк.

Типичные ошибки
01
Хранение номера строкой — ломается сортировка («1, 10, 2») и сравнение в запросах.
02
Присвоение НомерСтроки вручную — платформа перезаписывает значение, логика не срабатывает.
03
Использование номера строки как постоянного идентификатора — после удаления строк связи разъезжаются.
04
Путаница индекса (с 0) и номера (с 1) — ошибки «на одну строку» в циклах.

Как проверить результат

После настройки типа и логики проверьте поведение на контрольном примере. Создайте документ или таблицу минимум с 11 строками — этого достаточно, чтобы проявилась строковая сортировка. Отсортируйте по номеру: порядок должен быть 1, 2, …, 10, 11, а не 1, 10, 11, 2.

Для запроса выполните МАКСИМУМ(НомерСтроки) и сравните с фактическим количеством строк табличной части — значения должны совпадать, если нумерация непрерывна. В отладчике проверьте тип значения через ТипЗнч(Строка.НомерСтроки): ожидается «Число».

Контрольные точки

Как проверить результат

Тип значения в отладчике
Норма

ТипЗнч возвращает Число

Тревожный признак

Тип Строка — реквизит настроен неверно

Сортировка по номеру
Норма

1, 2, 3, …, 10, 11

Тревожный признак

1, 10, 11, 2 — номер хранится строкой

МАКСИМУМ(НомерСтроки) в запросе
Норма

Равен количеству строк табличной части

Тревожный признак

Возвращает меньшее значение или строку

FAQ

Можно ли изменить номер строки табличной части программно?

Напрямую присвоить значение свойству НомерСтроки нельзя — платформа перезаписывает его по положению строки. Чтобы изменить номер, переместите строку методом Сдвинуть() или перестройте порядок строк в коллекции.

Почему сортировка по номеру строки выдаёт 1, 10, 2?

Номер хранится в реквизите с типом Строка, и сравнение идёт посимвольно. Измените тип реквизита на Число с точностью 0 и конвертируйте существующие значения, предварительно сделав резервную копию.

Чем отличается НомерСтроки от Индекс()?

НомерСтроки начинается с единицы и показывает порядковый номер строки, а метод Индекс() возвращает позицию в коллекции с нуля. Связь: НомерСтроки = Индекс + 1.

Есть ли номер строки у таблицы значений?

Штатного свойства НомерСтроки у строк таблицы значений нет. Используйте метод Индекс() для определения позиции или добавьте собственную числовую колонку и заполняйте её в цикле.

Какой длины задавать числовой реквизит под номер строки?

Ориентируйтесь на максимально возможное количество строк с запасом: для большинства документов достаточно 5–6 знаков. Точность всегда 0, признак неотрицательного числа желателен.

Можно ли использовать НомерСтроки в запросе к табличной части?

Да, поле НомерСтроки доступно в запросах к табличным частям и имеет числовой тип. Его можно применять в условиях, сортировке, группировках и агрегатных функциях без дополнительных преобразований.

Итог

Что важно запомнить

Штатное свойство НомерСтроки табличной части в 1С — это Число, заполняемое платформой автоматически с единицы. Для собственных реквизитов под номер выбирайте тип Число с точностью 0, не используйте номер как постоянный идентификатор строки и проверяйте сортировку на данных с двузначными номерами.