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

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

Как получить строку таблицы в 1С

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

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

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

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

Что представляет собой строка таблицы в 1С

Строка табличной части документа или справочника — это объект типа, например, ДокументТабличнаяЧастьСтрока, а строка таблицы значений — объект СтрокаТаблицыЗначений. Обе являются элементами коллекции и поддерживают обращение к колонкам через точку: Строка.Номенклатура, Строка.Количество.

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

Нумерация строк в коллекциях 1С начинается с нуля. Первая строка имеет индекс 0, последняя — Количество() - 1. Это частая причина ошибок у начинающих разработчиков, привыкших к нумерации с единицы.

Получение строки по индексу: метод Получить()

Если известен номер нужной строки, используйте метод Получить() или квадратные скобки — оба варианта эквивалентны:

ТабЧасть = Документ.Товары;

// Два равнозначных способа

Строка = ТабЧасть.Получить(0);

Строка = ТабЧасть[0];

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

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

Если ТабЧасть.Количество() > 0 Тогда

ПерваяСтрока = ТабЧасть[0];

КонецЕсли;

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

Поиск строки по значению: метод Найти()

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

ТЗ = ПолучитьТаблицуТоваров();

// Поиск по одной колонке

Строка = ТЗ.Найти(НужнаяНоменклатура, "Номенклатура");

// Поиск по нескольким колонкам

Строка = ТЗ.Найти(НужныйСклад, "Склад,МестоХранения");

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

Строка.Количество = Строка.Количество + 1;

Иначе

// Строки нет — например, добавляем новую

НоваяСтрока = ТЗ.Добавить();

НоваяСтрока.Номенклатура = НужнаяНоменклатура;

КонецЕсли;

Поиск по нескольким колонкам работает по принципу «И»: строка должна совпасть по всем перечисленным колонкам одновременно. Значения сравниваются на точное равенство, включая тип данных — число 10 не будет найдено, если в колонке хранится строка «10».

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

Выбор нескольких строк: метод НайтиСтроки()

Метод НайтиСтроки(ПараметрыОтбора) принимает структуру с отбором и возвращает массив всех подходящих строк. Массив может быть пустым — это тоже штатная ситуация.

Отбор = Новый Структура;

Отбор.Вставить("Склад", ОсновнойСклад);

Отбор.Вставить("Отгружено", Ложь);

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

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

Строка.Отгружено = Истина;

КонецЦикла;

Найденные строки — это не копии, а ссылки на те же самые строки таблицы. Изменяя их свойства, вы меняете исходную таблицу значений или табличную часть. Это удобно, но требует аккуратности: непреднамеренное изменение затронет исходные данные.

Перебор всех строк в цикле

Когда нужно обработать каждую строку или условие поиска сложнее простого равенства (например, «количество больше 100»), используйте цикл Для Каждого:

Для Каждого Строка Из Документ.Товары Цикл

Если Строка.Количество > 100 Тогда

Строка.Скидка = 5;

КонецЕсли;

КонецЦикла;

Если внутри цикла нужен индекс текущей строки, используйте классический цикл со счётчиком:

ВсегоСтрок = ТЗ.Количество();

Для Индекс = 0 По ВсегоСтрок - 1 Цикл

Строка = ТЗ[Индекс];

// обработка

КонецЦикла;

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

Типичные ошибки
01
Удаление строк в прямом цикле по индексу — часть строк пропускается из-за сдвига индексов
02
Отсутствие проверки результата Найти на Неопределено — ошибка при обращении к полям
03
Сравнение значений разных типов в Найти — строка никогда не будет найдена
04
Перепутанные НомерСтроки и индекс — обращение не к той строке

Получение текущей строки в форме и на клиенте

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

&НаКлиенте

Процедура ТоварыПриАктивизацииСтроки(Элемент)

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

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

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

КонецЕсли;

КонецПроцедуры

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

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

Проверка результата и частые проблемы

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

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

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

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

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

Результат метода Найти
Норма

Возвращён объект строки, поля читаются без ошибок

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

Неопределено — строка не найдена или типы значений не совпадают

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

Индекс от 0 до Количество()-1, ошибок нет

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

Ошибка «Индекс за границами» — таблица пуста или индекс неверен

Результат НайтиСтроки
Норма

Массив содержит ожидаемое число строк

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

Пустой массив при заведомо существующих данных — проверьте отбор и типы

FAQ

Чем отличается Найти от НайтиСтроки?

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

Как получить последнюю строку таблицы?

Используйте Таблица[Таблица.Количество() - 1], предварительно убедившись, что Количество() больше нуля. Для таблиц значений также доступен метод Получить с тем же индексом.

Почему Найти не находит строку, хотя значение есть?

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

Как безопасно удалить часть строк таблицы?

Соберите строки через НайтиСтроки в массив и удаляйте их в отдельном цикле методом Удалить(Строка). Удаление внутри прямого цикла по индексу приводит к пропуску элементов из-за сдвига нумерации.

Можно ли получить строку табличной части на сервере по выделению пользователя?

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

Что вернёт обращение к несуществующей колонке строки?

Ошибку исполнения о том, что поле не найдено. Имена колонок проверяются на этапе выполнения, поэтому опечатки в именах выявляются только при тестировании конкретной ветки кода.

Итог

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

Индексация строк идёт с нуля, Найти требует проверки на Неопределено, НайтиСтроки возвращает массив, а удаление строк безопасно выполнять вне основного цикла перебора. Для повторного поиска по большим таблицам добавляйте индексы.