При работе с коллекциями данных в 1С:Предприятие разработчики часто используют метод НайтиСтроки() для быстрого получения строк таблицы значений, соответствующих заданным критериям отбора. У начинающих программистов нередко возникает вопрос: что именно вернет функция, если ни одна строка не подойдет под условия поиска — значение Неопределено или пустой массив?
Рассмотрим синтаксис и поведение платформы 1С. Метод НайтиСтроки() объекта ТаблицаЗначений всегда возвращает массив. Если в таблице значений отсутствуют строки, удовлетворяющие заданному отбору, функция вернет пустой массив, то есть объект типа Массив с количеством элементов, равным 0.
Разберем пример кода с проверкой результата поиска:
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Номенклатура", ВыбраннаяНоменклатура);
ПараметрыОтбора.Вставить("Склад", ВыбранныйСклад);
НайденныеСтроки = ТЗ.НайтиСтроки(ПараметрыОтбора);
Если НайденныеСтроки.Количество() = 0 Тогда
// Строки не найдены
Сообщить("По заданному отбору ничего не найдено.");
Иначе
// Обработка найденных строк
Для Каждого СтрокаТЗ Из НайденныеСтроки Цикл
СтрокаТЗ.Количество = СтрокаТЗ.Количество + 1;
КонецЦикла;
КонецЕсли;
Важно: проверка результата вызовом вида Если НайденныеСтроки = Неопределено Тогда является ошибочной, так как метод гарантированно возвращает объект типа Массив.
Проанализируем специфику работы с элементами массива, полученного в результате выполнения поиска:
СтрокаТаблицыЗначений. Изменение значений колонок у элемента массива сразу меняет данные в исходной таблице значений.ТЗ.Удалить(Строка)), ссылка в массиве станет недействительной. Последующее обращение к свойствам этой строки вызовет ошибку выполнения.Рассмотрим, как платформа выполняет поиск и как можно ускорить работу алгоритма на больших объемах данных:
НайтиСтроки() производит последовательный сканирующий перебор всех строк. На таблицах от 1000 строк и более это может вызывать задержки.Индексы:
ТЗ.Индексы.Добавить("Номенклатура, Склад");
Посмотрим на другие встроенные механизмы 1С, которые применяются для решения похожих задач:
ТаблицаЗначений.Найти(): Применяется, если требуется найти только первое совпадение. В отличие от НайтиСтроки(), этот метод возвращает конкретный объект СтрокаТаблицыЗначений или значение Неопределено, если ничего не найдено.ТаблицаЗначений.Скопировать(): Позволяет передать структуру отбора первым параметром: ТЗ.Скопировать(ПараметрыОтбора). Возвращает не массив, а новую таблицу значений с подходящими строками.МенеджерВременныхТаблиц. Это позволяет выполнять сложные отборы с условиями ИЛИ, диапазонами, группировками и сортировкой.