Что возвращает метод НайтиСтроки у ТаблицыЗначений в 1С, если строки не найдены?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Возвращаемое значение метода НайтиСтроки

Рассмотрим синтаксис и поведение платформы 1С. Метод НайтиСтроки() объекта ТаблицаЗначений всегда возвращает массив. Если в таблице значений отсутствуют строки, удовлетворяющие заданному отбору, функция вернет пустой массив, то есть объект типа Массив с количеством элементов, равным 0.

Разберем пример кода с проверкой результата поиска:


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

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

Если НайденныеСтроки.Количество() = 0 Тогда
    // Строки не найдены
    Сообщить("По заданному отбору ничего не найдено.");
Иначе
    // Обработка найденных строк
    Для Каждого СтрокаТЗ Из НайденныеСтроки Цикл
        СтрокаТЗ.Количество = СтрокаТЗ.Количество + 1;
    КонецЦикла;
КонецЕсли;

Важно: проверка результата вызовом вида Если НайденныеСтроки = Неопределено Тогда является ошибочной, так как метод гарантированно возвращает объект типа Массив.

Особенности работы со ссылками на строки

Проанализируем специфику работы с элементами массива, полученного в результате выполнения поиска:

  1. Прямые ссылки: Возвращаемый массив содержит не скопированные данные, а ссылки на элементы типа СтрокаТаблицыЗначений. Изменение значений колонок у элемента массива сразу меняет данные в исходной таблице значений.
  2. Удаление строк: Если во время обхода массива удалить строку из таблицы значений (например, вызовом ТЗ.Удалить(Строка)), ссылка в массиве станет недействительной. Последующее обращение к свойствам этой строки вызовет ошибку выполнения.

Оптимизация производительности и индексирование

Рассмотрим, как платформа выполняет поиск и как можно ускорить работу алгоритма на больших объемах данных:

  1. Полный перебор по умолчанию: Если для таблицы значений не заданы индексы, метод НайтиСтроки() производит последовательный сканирующий перебор всех строк. На таблицах от 1000 строк и более это может вызывать задержки.
  2. Использование индексов: Для ускорения поиска можно проиндексировать нужные колонки с помощью коллекции Индексы: ТЗ.Индексы.Добавить("Номенклатура, Склад");
  3. Условия задействования индексов: Индекс используется платформой только тогда, когда список полей и их порядок в структуре отбора полностью совпадают с составом проиндексированных колонок, либо поиск выполняется по первой проиндексированной колонке. В противном случае платформа вернется к полному перебору.

Альтернативные способы поиска и отбора

Посмотрим на другие встроенные механизмы 1С, которые применяются для решения похожих задач:

  1. Метод ТаблицаЗначений.Найти(): Применяется, если требуется найти только первое совпадение. В отличие от НайтиСтроки(), этот метод возвращает конкретный объект СтрокаТаблицыЗначений или значение Неопределено, если ничего не найдено.
  2. Метод ТаблицаЗначений.Скопировать(): Позволяет передать структуру отбора первым параметром: ТЗ.Скопировать(ПараметрыОтбора). Возвращает не массив, а новую таблицу значений с подходящими строками.
  3. Использование Запроса: Таблицу значений можно передать в запрос и поместить во временную таблицу с помощью МенеджерВременныхТаблиц. Это позволяет выполнять сложные отборы с условиями ИЛИ, диапазонами, группировками и сортировкой.
← На главную