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

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

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

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

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

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

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

Как устроена нумерация строк в 1С

Прежде чем искать номер строки, определите, с каким объектом вы работаете. У строки табличной части документа или справочника есть встроенное свойство НомерСтроки — платформа заполняет его автоматически, начиная с единицы, и сохраняет в базе. Это «человеческий» номер, который видит пользователь в колонке «N».

У таблицы значений, массива и результата запроса такого свойства нет. Там позиция определяется индексом, который начинается с нуля: первая строка имеет индекс 0, вторая — 1 и так далее. Получить индекс можно методом Индекс(), передав в него строку-объект.

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

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

Самый простой случай — обход строк табличной части. У каждой строки уже есть готовый номер, его не нужно вычислять:

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

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

+ ", номер строки: " + СтрокаТовары.НомерСтроки);

КонецЦикла;

Если строка найдена через поиск (например, методом Найти() по номенклатуре), её номер читается тем же свойством:

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

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

НомерНайденной = НайденнаяСтрока.НомерСтроки;

Иначе

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

КонецЕсли;

Метод Найти(Значение, "Колонка") возвращает первую подходящую строку или Неопределено. Если совпадений может быть несколько, используйте НайтиСтроки(СтруктураОтбора) — он вернёт массив всех подходящих строк, и у каждой можно прочитать НомерСтроки.

Как найти номер строки в таблице значений

Таблица значений не хранит номеров строк — только индексы. Чтобы получить позицию строки, используйте метод Индекс():

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

// Порядковый номер "для человека":

НомерДляВывода = ИндексСтроки + 1;

Поиск самой строки выполняется так же, как в табличной части: Найти() для первого совпадения или НайтиСтроки() для всех.

Если нужно пронумеровать всю таблицу значений (например, для выгрузки или печати), добавьте колонку и заполните её в цикле:

ТаблицаЗначений.Колонки.Добавить("НомерСтроки");

Счетчик = 1;

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

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

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

КонецЦикла;

Поиск номера строки по условию
  1. 1
    Определите объект: табличная часть (есть НомерСтроки) или таблица значений (только индексы)
  2. 2
    Выполните поиск методом Найти() или НайтиСтроки() с отбором
  3. 3
    Проверьте результат на Неопределено, прежде чем обращаться к свойствам
  4. 4
    Прочитайте НомерСтроки или вычислите Индекс() + 1
  5. 5
    Выведите результат через Сообщить() и сверьте с тем, что видно на форме

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

В языке запросов 1С нет встроенной функции нумерации строк вроде ROW_NUMBER. Это ограничение приходится обходить. Универсальный и самый надёжный способ — выгрузить результат и пронумеровать его на встроенном языке, как показано выше для таблицы значений.

Альтернатива для небольших выборок — самосоединение с подсчётом: для каждой строки считается количество строк, у которых упорядочивающее поле меньше или равно текущему. Такой запрос работает, но на больших таблицах заметно медленнее, потому что фактически выполняет перебор пар строк. Использовать его стоит только когда нумерация обязательно нужна на уровне запроса, например в СКД без возможности постобработки.

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

Способы получить номер строки

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

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

Индекс() + 1

Таблицы значений и результаты запросов в памяти. Быстро, но номер существует только пока жива коллекция

Нумерация в цикле после выгрузки

Универсально для любых выборок. Требует дополнительного прохода по данным

Самосоединение в запросе

Когда номер нужен именно в тексте запроса. Медленно на больших объёмах, сложно сопровождать

Как найти и перейти к строке в конфигураторе

Если под «номером строки» понимается строка кода в модуле, в конфигураторе работают стандартные средства редактора. Быстрый переход к строке по номеру: Ctrl + G — откроется окно ввода номера, после подтверждения курсор встанет на нужную строку. Это особенно удобно, когда в сообщении об ошибке указано «{МодульОбъекта(125)}:..» — номер в скобках и есть строка модуля.

Поиск фрагмента текста по всем модулям конфигурации выполняется через меню «Правка → Глобальный поиск» или сочетанием Ctrl + Shift + F. В результатах поиска показывается объект, модуль и номер строки каждого вхождения, двойной щелчок открывает модуль на нужной позиции.

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

Как пронумеровать строки в отчёте и на форме

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

На управляемой форме динамический список показывает служебную колонку с номером автоматически, но это оформление, а не данные. Если номер нужен как реквизит (например, для печати «строка № 5 из 120»), его следует вычислить программно и записать в данные формы или в источник списка.

Типичные ошибки при работе с номерами строк

Типичные ошибки
01
Смешение индекса и НомерСтроки: обращение к строке по НомерСтроки как к индексу даёт смещение на единицу и чтение не той строки
02
Обращение к НайденнаяСтрока.НомерСтроки без проверки на Неопределено — при отсутствии совпадений возникает ошибка выполнения
03
Использование НомерСтроки как ключа поиска после удаления строк: платформа перенумеровывает оставшиеся строки, и сохранённые номера устаревают
04
Поиск строкового значения без учёта регистра и пробелов — Найти() возвращает Неопределено, хотя данные визуально совпадают
05
Нумерация большой выборки самосоединением в запросе — резкое падение производительности на тысячах строк

Отдельно стоит сказать об удалении строк в цикле. Если удалять строки таблицы значений прямым обходом «сверху вниз», индексы сдвигаются и часть строк пропускается. Правильные варианты: обход в обратном порядке (от последней строки к первой) или сбор строк для удаления в отдельный массив с последующим удалением.

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

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

Номер найденной строки
Норма

Совпадает с номером, который виден в колонке «N» на форме документа

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

Номер отличается на единицу — вероятно, смешаны индекс и НомерСтроки

Поведение при отсутствии результата
Норма

Код корректно отрабатывает ветку «не найдено» без ошибок

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

Возникает ошибка обращения к свойству Неопределено

Нумерация после удаления строк
Норма

Номера идут подряд без пропусков после перезаписи документа

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

В номерах «дыры» или дубли — значит, номера вычислялись до удаления и устарели

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

Почему НомерСтроки начинается с 1, а Индекс с 0?

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

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

Используйте метод НайтиСтроки() со структурой отбора: ключи — имена колонок, значения — искомые данные. Метод вернёт массив всех строк, удовлетворяющих всем условиям одновременно. Для одного условия достаточно Найти(Значение, "ИмяКолонки").

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

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

Что делать, если Найти() не находит строку, хотя она есть?

Чаще всего причина в несовпадении значений: лишние или неразрывные пробелы, другой регистр букв, различие типов (строка вместо числа). Выведите искомое значение и значение из таблицы через Сообщить() и сравните посимвольно. Также проверьте, что поиск идёт по той колонке, в которой реально лежат данные.

Как перейти к строке кода по номеру из сообщения об ошибке?

Откройте указанный в сообщении модуль в конфигураторе и нажмите Ctrl+G, затем введите номер строки. Номер указан в скобках после имени модуля, например «МодульОбъекта(125)» означает строку 125. Учитывайте, что после изменений в коде старые номера из журнала регистрации могут не совпадать с актуальными.

Сохранятся ли номера строк после удаления части строк табличной части?

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

Итог

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

НомерСтроки (с 1) — свойство строк табличных частей, Индекс (с 0) — позиция в таблице значений и массивах. Поиск выполняется через Найти() и НайтиСтроки() с обязательной проверкой на Неопределено. В запросах нумерации нет — её добавляют после выгрузки. В конфигураторе переход к строке кода — Ctrl+G, глобальный поиск — Ctrl+Shift+F.