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

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

Как выбрать строку в таблице значений 1С

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

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

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

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

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

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

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

Выбор одной строки методом Найти()

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

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

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

Сообщить("Товар с артикулом " + ИскомыйАртикул + " не найден");

Иначе

Цена = СтрокаТовара.Цена;

КонецЕсли;

Второй параметр может содержать список колонок через запятую, например "Артикул, Склад". Тогда поиск идёт по всем перечисленным колонкам, и вернётся первая строка, где значение найдено хотя бы в одной из них. Если нужно совпадение по нескольким колонкам одновременно, используйте НайтиСтроки() со структурой отбора.

Помните о типах данных: поиск сравнивает значения строго. Если в колонке хранится число, а вы ищете строку "123", совпадения не будет. То же касается ссылок разных видов документов и значений NULL из запросов.

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

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

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

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

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

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

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

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

КонецЦикла;

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

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

Цикл Для Каждого — универсальный способ, когда условие выбора сложнее простого равенства: сравнение по диапазону, проверка нескольких полей с «ИЛИ», поиск подстроки. Внутри цикла доступна каждая строка, и условие проверяется произвольным выражением.

Для Каждого Строка Из ТаблицаТоваров Цикл

Если Строка.Цена > 10000 И Строка.Остаток > 0 Тогда

// обработка подходящей строки

КонецЕсли;

КонецЦикла;

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

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

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

Если позиция строки известна, обратиться к ней можно напрямую: Строка = ТаблицаТоваров[0] вернёт первую строку. Индексация начинается с нуля, последняя строка имеет индекс Количество() - 1. Обращение за границы диапазона вызывает ошибку выполнения.

Обратная задача — узнать индекс конкретной строки — решается методом Индекс(Строка). Это полезно, когда нужно вставить новую строку перед найденной или после неё через метод Вставить(Индекс).

Прямой доступ по индексу оправдан в циклах с модификацией таблицы и при работе с заранее известной структурой. В остальных случаях поиск по значению читается лучше и устойчивее к изменениям порядка строк.

Сравнение способов выбора строки

СпособКогда подходитОграничения
Найти()Одна строка, отбор по равенствуТолько первое совпадение, строгое сравнение типов
НайтиСтроки()Несколько строк, отбор по равенству нескольких колонокТолько условие «И», только равенство
Цикл Для КаждогоСложные условия: диапазоны, ИЛИ, подстрокиМедленнее на больших таблицах, больше кода
По индексуИзвестна позиция, модификация при перебореРиск выхода за границы, привязка к порядку строк
Запрос к таблицеСложная фильтрация и сортировка больших данныхТребует помещения таблицы во временную таблицу

Для больших таблиц с десятками тысяч строк и сложными условиями эффективнее поместить таблицу в запрос как временную и выбрать строки средствами языка запросов. Это особенно актуально при соединениях с другими данными и группировках.

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

Найти() / НайтиСтроки()

Быстро и лаконично для отбора по равенству; не подходит для условий «больше», «содержит», «ИЛИ»

Цикл с условием

Гибкие условия любой сложности; проигрывает по скорости на больших таблицах

Запрос с временной таблицей

Оптимален для сложной фильтрации больших объёмов; требует больше кода и понимания языка запросов

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

Главное правило безопасной работы: никогда не обращайтесь к колонкам строки, не убедившись, что строка найдена. Обращение Строка.Цена при Строка = Неопределено вызывает ошибку «Поле объекта не обнаружено» и прерывает выполнение кода.

Типичные ошибки
01
Обращение к колонкам без проверки на Неопределено — код падает с ошибкой, если строка не найдена
02
Поиск строкового значения в числовой колонке — совпадение не находится из-за различия типов
03
Удаление строк в прямом цикле Для Каждого — пропускаются строки из-за сдвига индексов
04
Ожидание одной строки от НайтиСтроки без проверки Количество() — обращение к элементу пустого массива вызывает ошибку
05
Поиск по наименованию с лишними пробелами — строки не находятся из-за нестрогого сравнения

Ещё одна частая проблема — поиск по представлению вместо ссылки. В колонке может храниться ссылка на элемент справочника, а разработчик ищет строку с наименованием. Сравнение ссылки со строкой никогда не даст совпадения. Проверяйте тип данных колонки через ТаблицаТоваров.Колонки.Артикул.ТипЗначения.

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

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

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

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

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

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

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

Массив с Количество() > 0

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

Пустой массив — условия отбора не выполнены

Типы значений в отборе
Норма

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

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

Строка ищется в числовой колонке или наоборот — совпадений нет

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

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

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

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

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

Как выбрать строки по условию «больше» или «содержит»?

Методы Найти() и НайтиСтроки() работают только на равенство. Для нестрогих условий используйте цикл Для Каждого с проверкой внутри (например, Строка.Сумма > 1000 или СтрНайти(Строка.Наименование, "текст") > 0) либо поместите таблицу в запрос и используйте язык запросов.

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

Передайте строку в метод Удалить(): ТаблицаТоваров.Удалить(СтрокаТовара). Если удаляете несколько строк в цикле, перебирайте таблицу по индексу от конца к началу или сначала соберите строки в массив через НайтиСтроки(), а затем удаляйте их в отдельном цикле.

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

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

Как узнать номер (индекс) найденной строки?

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

Итог

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

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