1С поиск в таблице значений по колонке

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

1. При двух и более операциях поиска в объекте ТаблицаЗначений с большим количеством строк (*) рекомендуется:

  • Индексировать колонки, по которым выполняется поиск;
  • Но только те из них, которые обладают хорошей селективностью (т.е. каждому значению этой колонки должно соответствовать небольшое количество строк). В противном случае, индексирование не даст эффекта, либо он будет отрицательным (потрачено лишнее время на индексирование).

* Примечание: следует ориентироваться на 1000 строк и более, а также учитывать не только размер таблицы, в которой выполняется поиск, но и сколько раз он выполняется. Например, даже если таблица относительно небольшая в 100 строк, но поиск по ней выполняется 100 раз, ее тоже имеет смысл индексировать. В то же время, нет смысла индексировать таблицу из-за только одной единственной операции поиска.

2. Для поиска значений предусмотрены два метода объекта ТаблицаЗначений :

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

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

ТЗ.Индексы.Добавить("Колонка1");
ТЗ.Индексы.Добавить("Колонка2");
. = ТЗ.Найти("найдется все", "Колонка1, Колонка2"); // Индекс НЕ используется!

В этом примере, несмотря на наличие индекса для колонок Колонка1 и Колонка2 , поиск все равно будет выполняться перебором всех строк в таблице значений (что очень ресурсоемко на больших объемах данных).

Читайте также:  Скопировать пробел для инстаграмма в тексте

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

ТЗ.Индексы.Добавить("Колонка1"); // Индекс1
ТЗ.Индексы.Добавить("Колонка2"); // Индекс2

. = ТЗ.НайтиСтроки(Новый Структура("Колонка1, Колонка2 ", "Ищу1","Ищу2")); // Индекс НЕ используется!
. = ТЗ.НайтиСтроки(Новый Структура("Колонка1", "Ищу1") ); // OK — используется Индекс1
. = ТЗ.НайтиСтроки(Новый Структура("Колонка2", "Ищу2") ); // OK — используется Индекс2

. = ТЗ.НайтиСтроки(Новый Структура("Колонка1, Колонка2", "Ищу1","Ищу2")); // OK — индекс используется
. = ТЗ.НайтиСтроки(Новый Структура("Колонка2, Колонка1", "Ищу2","Ищу1")); // OK — индекс используется
. = ТЗ.НайтиСтроки(Новый Структура("Колонка1", "Ищу1") ); // Индекс НЕ используется!
. = ТЗ.НайтиСтроки(Новый Структура("Колонка2", "Ищу2") ); // Индекс НЕ используется!

2.3. Аналогичное ограничение действует и для метода Скопировать таблицы значений при вызове с параметром ПараметрыОтбора ( Структура ).

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

  • В тех случаях, когда требуется сортировка по наименованию – сразу, на этапе заполнения, добавлять в таблицу дополнительные колонки с представлениями, и сортировку выполнять уже по ним. Если, конечно, это не вызовет аналогичных многократных обращений к информационной базе;
  • В остальных случаях – сортировать «по ссылке», а не по представлению. Для этого в методе Сортировать следует использовать объект СравнениеЗначений :

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

Особенно это важно для таблиц с большим количеством (несколько сотен и тысяч) строк, в алгоритмах критических ко времени исполнения.

Читайте также:  Steam раздает игры бесплатно

3.1. При поиске в объекте Массив с большим количеством элементов(*) следует отказаться от массива в пользу:

  • объекта Соответствие , если не важен порядок элементов;
  • индексированной ТаблицаЗначений , если порядок элементов значим.

Это обусловлено тем, что в указанных случаях поиск занимает в большинстве случаев константное время, а в массиве поиск выполняется перебором и поэтому пропорционален количеству элементов.

* Примечание: следует ориентироваться на 1000 элементов и более, а также учитывать не только размер массива, но и сколько раз выполняется поиск. Например, если поиск выполняется многократно, в частности, в цикле, то эта рекомендация также действительна для массивов меньшего размера (до 1000 элементов). Особого внимания требуют универсальные механизмы, которые могут применяться на сколь угодно больших объемах данных.

3.2. При необходимости обеспечить уникальность элементов в большом массиве следует однократно в конце алгоритма вызвать функцию СвернутьМассив или процедуру ДополнитьМассив с параметром ТолькоУникальныеЗначения = Истина (модуль ОбщегоНазначения Библиотеки стандартных подсистем).

4. Аналогичный недостаток существует и у объекта ДеревоЗначений , в котором не предусмотрено индексов и поиск выполняется перебором (как в массиве). В указанных выше случаях объект ДеревоЗначений следует заменять индексированным объектом ТаблицаЗначений .

Какие методы существуют и как искать одновременно по нескольким значениям.

Для поиска в таблице значений существует два специальных метода:

1. Найти

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

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

2. НайтиСтроки

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

Читайте также:  Как поменять часовой механизм в настенных часах

Чем ещё хорош этот метод, так это то, что он может искать сразу по нескольким колонкам таблицы значений одновременно:

Единственный минус, как видно, нельзя применять другие виды сравнения кроме как "равно"

Выполняет поиск колонки таблицы значений по имени.

Синтаксис

Метод Найти() имеет следующий синтаксис:

А также альтернативный англоязычный синтаксис:

Параметры

Описание параметров метода Найти() :

Имя параметра Тип Описание
ИмяКолонки Строка Наименование колонки таблицы значений.
Жирным шрифтом выделены обязательные параметры

Возвращаемое значение

КолонкаТаблицыЗначений или Неопределено

Описание

Метод Найти() выполняет поиск колонки в коллекции колонок по имени. Если указанная колонка существует, метод возвращает ее в точку вызова. Если колонка не найдена, возвращает Неопределено .

Доступность

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).

Пример использования

Пример кода с использованием метода Найти() :