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

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

Как найти строку по номеру в 1С

Как найти строку по номеру в 1С: поиск в табличной части документа, в таблице значений на встроенном языке, через запрос и в динамическом списке. Примеры кода.

Задача найти строку по номеру возникает в 1С в двух разных контекстах: пользователь ищет строку в табличной части документа или справочника визуально, а разработчик — программно обращается к строке таблицы значений, табличной части или результата запроса. Способы в этих случаях принципиально различаются, и путаница между ними — частая причина ошибок.

Важно понимать: «номер строки» в 1С — это не всегда одно и то же. У табличной части есть порядковый номер, который виден пользователю в колонке «N». У таблицы значений есть индекс строки, который начинается с нуля и не совпадает с видимым номером. У результата запроса порядок строк вообще не гарантирован, если не задана сортировка. Эти различия определяют, какой метод поиска применять.

Ниже разобраны все рабочие сценарии: от простого поиска глазами и горячих клавиш до программного обращения по индексу, поиска по значению и получения номера строки через запрос. Каждый способ сопровождается условиями применения и типичными ошибками.

Поиск строки по номеру в интерфейсе пользователя

В типовых конфигурациях на управляемых формах (1С:Бухгалтерия, 1С:Управление торговлей, ERP) табличные части документов показывают колонку «N» — порядковый номер строки. Если документ содержит сотни позиций, прокручивать список вручную неудобно, и есть несколько способов быстро попасть на нужную строку.

Самый простой прием — нажать Ctrl+F, когда курсор стоит в табличной части, и ввести номер или значение из любой колонки. Поиск работает по текущей колонке либо по всем видимым колонкам, в зависимости от настроек формы. Если табличная часть большая, убедитесь, что поиск идет по нужной колонке: иначе система найдет первое вхождение цифры в другом поле, например в количестве или цене.

Второй вариант — сортировка. Клик по заголовку колонки «N» упорядочит строки по номерам, если порядок был нарушен ручной сортировкой или перетаскиванием. После этого строку с нужным номером легко найти прокруткой, а в некоторых формах работает быстрый переход: начните набирать цифры, стоя в колонке «N», и курсор переместится на совпадающую строку.

Как обратиться к строке табличной части по номеру в коде

Во встроенном языке 1С табличная часть объекта — это коллекция строк, к которой можно обращаться по индексу. Индексация начинается с нуля, поэтому строка с видимым номером N соответствует индексу N−1. Это главный источник ошибок у начинающих разработчиков: обращение по номеру без вычитания единицы возвращает соседнюю строку.

// Получить третью строку табличной части "Товары"

СтрокаТовара = Объект.Товары[2]; // индекс = номер - 1

// Безопасный вариант с проверкой

НомерСтроки = 3;

Если НомерСтроки >= 1 И НомерСтроки <= Объект.Товары.Количество() Тогда

СтрокаТовара = Объект.Товары[НомерСтроки - 1];

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

Иначе

Сообщить("Строки с таким номером нет");

КонецЕсли;

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

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

Порядок действий при программном обращении
  1. 1
    Получите номер строки от пользователя или из источника данных
  2. 2
    Проверьте, что номер в диапазоне от 1 до Количество()
  3. 3
    Обратитесь к строке по индексу Номер - 1
  4. 4
    В сообщениях используйте свойство НомерСтроки, а не индекс

Поиск строки в таблице значений по значению

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

// Найти первую строку с нужным товаром

НайденнаяСтрока = ТаблицаТоваров.Найти(ИскомыйТовар, "Номенклатура");

Если НайденнаяСтрока <> Неопределено Тогда

Индекс = ТаблицаТоваров.Индекс(НайденнаяСтрока);

Сообщить("Найдено в строке № " + (Индекс + 1));

КонецЕсли;

// Найти все строки по условию

Отбор = Новый Структура("Склад", ОсновнойСклад);

НайденныеСтроки = ТаблицаТоваров.НайтиСтроки(Отбор);

Для Каждого Строка Из НайденныеСтроки Цикл

Сообщить("Строка № " + (ТаблицаТоваров.Индекс(Строка) + 1));

КонецЦикла;

Метод Индекс() возвращает позицию найденной строки в коллекции, и именно он связывает поиск по значению с номером строки. Помните: если строк не найдено, Найти() возвращает Неопределено, а НайтиСтроки() — пустой массив. Обращение к свойствам результата без проверки на Неопределено — одна из самых частых причин падения кода.

Для больших таблиц (десятки тысяч строк и больше) последовательный поиск методом Найти() в цикле работает медленно. В таких случаях эффективнее построить индекс методом ТаблицаЗначений.Индексы.Добавить("Номенклатура") или вынести поиск в запрос.

Номер строки в запросе и результата запроса

Язык запросов 1С не имеет встроенной функции нумерации строк результата. Если нужно получить «строку номер 5» из выборки, правильный подход — задать сортировку через УПОРЯДОЧИТЬ ПО, а затем пронумеровать строки при обходе результата в коде.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

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

| Товары.Количество КАК Количество

|ИЗ

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

|ГДЕ

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

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

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

Выборка = Запрос.Выполнить().Выбрать();

Счетчик = 0;

Пока Выборка.Следующий() Цикл

Счетчик = Счетчик + 1;

Если Счетчик = 5 Тогда

// Это пятая строка результата

КонецЕсли;

КонецЦикла;

Обратите внимание на поле НомерСтроки в табличных частях документов: оно доступно в запросе и хранит исходный порядковый номер строки. Если задача — найти именно строку документа с конкретным номером, проще отобрать её условием ГДЕ Товары.НомерСтроки = &Номер, чем перебирать выборку.

Без явной сортировки порядок строк в результате запроса не определен: одна и та же выборка может вернуть строки в разном порядке на разных СУБД и даже при повторном выполнении. Никогда не полагайтесь на «естественный» порядок, если по номеру строки строится логика.

Поиск строки в динамическом списке и форме списка

В формах списков документов и справочников номера строк как такового нет — записи идентифицируются ссылкой, а не позицией. Если нужно «найти третью запись», это признак того, что задача сформулирована неверно: в списке следует искать по значимому признаку — номеру документа, коду, наименованию.

Для быстрого перехода в форме списка используйте строку поиска (Ctrl+F или поле поиска в командной панели), установку отбора через «Ещё → Настроить список» или поиск по текущему значению колонки. Программно позиционирование на записи выполняется через Элементы.Список.ТекущаяСтрока = НужнаяСсылка.

// Спозиционировать список на конкретном документе

Элементы.Список.ТекущаяСтрока = ДокументСсылка;

// Узнать, на какой записи стоит курсор

ТекущийДокумент = Элементы.Список.ТекущаяСтрока;

Если ЗначениеЗаполнено(ТекущийДокумент) Тогда

Сообщить("Выбран документ: " + ТекущийДокумент);

КонецЕсли;

Маршрут решения

Как выбрать действие

Нужно найти строку глазами в открытом документеCtrl+F по колонке «N» или сортировка по номеру
Нужна строка табличной части по номеру в кодеОбъект.ТабличнаяЧасть[Номер - 1] с проверкой Количество()
Нужно найти строку по значению колонкиМетод Найти() или НайтиСтроки() плюс Индекс() для номера
Нужна строка результата запроса с заданным номеромУПОРЯДОЧИТЬ ПО и счетчик при обходе выборки
Нужно найти запись в форме спискаПоиск по ссылке или значимому реквизиту, а не по позиции

Типичные ошибки и как их избежать

Первая и самая массовая ошибка — забыть, что индексация начинается с нуля. Код Товары[3] возвращает четвертую строку, а не третью. Всегда вычитайте единицу из пользовательского номера и проверяйте границы.

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

Третья ошибка — ожидание стабильного порядка строк в запросе без УПОРЯДОЧИТЬ ПО. Код, который «вчера работал», начинает возвращать другие строки после обновления СУБД или изменения индексов. Любая логика, завязанная на номер строки результата, требует явной сортировки.

Типичные ошибки
01
Обращение ТЗ[Номер] без вычитания единицы — возвращается соседняя строка
02
Обращение по индексу без проверки Количество() — ошибка выполнения на пустых или коротких таблицах
03
Удаление строк в прямом цикле — индексы сдвигаются, строки пропускаются
04
Отсутствие УПОРЯДОЧИТЬ ПО в запросе — порядок строк непредсказуем
05
Использование НомерСтроки как постоянного ID — номер меняется при редактировании табличной части

Проверка результата

После реализации поиска убедитесь, что код ведет себя корректно на граничных случаях: пустая таблица, одна строка, номер больше количества строк, отсутствие искомого значения. Каждый из этих сценариев должен обрабатываться без ошибки выполнения и с понятным сообщением пользователю.

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

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

Обращение по индексу
Норма

Номер 1..Количество() возвращает ожидаемую строку

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

Ошибка выполнения или соседняя строка

Поиск методом Найти()
Норма

Возвращает строку или Неопределено, код проверяет результат

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

Обращение к свойствам без проверки на Неопределено

Нумерация результата запроса
Норма

Порядок стабилен при повторных выполнениях

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

Строки меняют порядок между запусками

Удаление строк в цикле
Норма

Удалены все целевые строки

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

Часть строк пропущена из-за сдвига индексов

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

Итог

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

В интерфейсе строку ищут через Ctrl+F и колонку «N». В коде индекс строки равен номеру минус один, обращение без проверки границ приводит к ошибке. Для поиска по значению используются Найти() и НайтиСтроки(), а номер строки результата запроса получают счетчиком при обходе с обязательной сортировкой.

Частые вопросы

Почему Товары[1] возвращает вторую строку, а не первую?

Потому что коллекции во встроенном языке 1С индексируются с нуля. Первой строке соответствует индекс 0, второй — индекс 1. Чтобы получить строку с видимым номером N, используйте выражение Товары[N - 1].

Как узнать номер строки, если я нашел её методом Найти()?

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

Можно ли в запросе сразу получить номер строки результата?

Штатной функции нумерации строк в языке запросов 1С нет. Решение — добавить УПОРЯДОЧИТЬ ПО и пронумеровать строки счетчиком при обходе выборки. Для табличных частей документов доступно поле НомерСтроки, которое хранит исходный номер и может использоваться в отборе.

Номер строки изменился после редактирования документа — это нормально?

Да. Номер строки пересчитывается при удалении, вставке и перемещении строк табличной части. Он отражает текущее положение строки, а не постоянный идентификатор. Для связи строк между собой используйте ключевые поля (например, ключ связи в типовых документах), а не номер.

Как найти строку в форме списка документов по её позиции?

Никак — и это правильно. Динамический список не имеет фиксированных номеров строк: порядок зависит от сортировки и отборов. Ищите запись по значимому признаку — номеру документа, дате, контрагенту — через строку поиска или настройку отбора.

Что делать, если при обращении по индексу возникает ошибка «Индекс находится за границами массива»?

Проверьте перед обращением, что индекс находится в диапазоне от 0 до Количество() - 1. Ошибка означает, что таблица короче ожидаемой, пуста, или в коде не вычтена единица из пользовательского номера строки.