1с найти в массиве значение

Обновлено: 04.07.2024

Поиск в коллекциях значений

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

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. В тех случаях, когда для таблицы значений применяется сортировка по колонкам, содержащим ссылочные значения, необходимо учитывать, что при этом для каждой из этих колонок для всех строк таблицы значений системой будет выполнено обращение к информационной базе за представлением этой ссылки.

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

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

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

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

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

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

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

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

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


Как создать массив

Для создания массива в 1С используется ключевое слово Новый после которого указывается имя класса.

В переменной МассивЗначений будет находиться массив.

В конструкторе массива можно указать количество элементов:

МассивЗначений = Новый Массив ( 8 ) ; //в массиве 8 элементов

Сразу после создания все элементы массива будут равны Неопределено. При этом размер массива может быть изменен, при добавлении в него новых элементов.

Для добавления элементов используется метод Добавить:

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

//в массиве [Первый, Второй, Третий, Неопределено, Неопределено, Шестой]

Количество элементов в массиве

При добавлении каждого нового элемента в массив, количество элементов увеличивается на единицу. Получить общее количество элементов в массиве можно с помощью метода Количество:

Индекс массива

//будет ошибка Индекс находится за границами массива

Граница массива

Получить элемент массива

Получить элемент массива можно через квадратные скобки или методом Получить:

Перебор массива

С помощью цикла Для Каждого:

Через цикл Для Каждого нельзя изменить значения массива, меняться будет переменная ЭлементМассива.

Перебрать массив можно и через цикл Для. В этом случае через индекс можно изменять значения массива:

//метод ВГраница() возвращает максимальный индекс массива

Поиск в массиве

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

Создание массива

1. Как создать массив нужного размера

//Внесем значения элементов массива

2. Как создать пустой массив и добавить в него элементы

пМассив = новый Массив ; //создали пустой массив

//Внесем значения элементов массива

3. Как создать многомерный массив.

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

//Внесем значения элементов массива, пронумеровав каждое слово

4. Как создать фиксированный массив

Фиксированный массив отличается от обычного тем, что его нельзя изменять. Нельзя добавлять, удалять или менять значения элементов такого массива.

Фиксированный массив может быть получен из обычного:

пМассив = новый Массив ;

Функции работы с массивами

Работу функций будем рассматривать на примере одномерного массива пМассив, созданного выше и состоящего из 4 элементов:

Функция ВГраница()

Получает наибольший индекс элемента массива. Он всегда на единицу меньше количества элементов массива.

Функция Вставить()

Вставляет какое-то значение в элемент массива с указанным индексом. Последующие элементы массива сдвигаются

Функция Добавить()

Создает новый элемент в конце массива и вставляет туда заданное значение

Функция Количество()

Возвращает количество элементов массива.

Функция Найти()

Ищет в массиве заданный элемент. Если находит, возвращает его индекс. Если не находит, возвращает Неопределено.

Функция Очистить()

Удаляет все значения из массива.

Функция Получить()

Получает значение массива по индексу. Эту же задачу можно решить через [].

Функция Удалить()

Удаляет элемент массива по индексу

Функция Установить()

Устанавливает значение элемента массива по индексу. Работает аналогично [].

Как обойти массив

Можно обойти все элементы массива без указания индекса:

Можно при обходе использовать индекс:

Как обойти многомерный массив

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

Или с применением индексов.

Сортировка массива

Для сортировки массива нам потребуется вспомогательный объект с типом СписокЗначений.

Сравнение двух массивов

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

Возврат Истина ; // Если дошли до сюда, то массивы равны
КонецФункции

В функцию нужно передать 2 сравниваемых массива. Функция возвращает значение Истина, если массивы равны, и Ложь, если не равны.

Параметры:
<Значение> (необязательный)
Тип: Произвольный. Искомое значение.

Возвращаемое значение:
Тип: Число; Неопределено. Если элемент найден, возвращается его индекс. Если элемент не найден, возвращается Неопределено.

Описание:
Выполняет поиск элемента в массиве.

Если НЕ Счета.Найти(СчетДт)=Неопределено Тогда
Сообщить("Есть такой счет");
КонецЕсли;

Нихера он не ищет, ищу отрицательно число, которое заведомо там есть, в результате "неопределено". Че за подстава от 1С такая! (4)
укажите версию платформы разрядность тип ос
приведите пример ошибочной работы

проверил . работает. win7 32 , 1С:Предприятие 8.3 (8.3.10.2505) , тк, модуль формы обработки.
Процедура КнопкаВыполнитьНажатие(Кнопка)
// Вставить содержимое обработчика.

ааа = новый массив;

ааа.Добавить(45);
ааа.Добавить(-1);
ааа.Добавить("ыыы") ;

win7 64 , УТ 11.3.2.193 8.3 (8.3.9.2033)

НайденныеСтроки = ТаблицаЗначений(Отбор) - данные в т.з. есть и массив возвращается как НайденныеСтроки.Количество()>0

В нем возвращено отрицательное число -2550

Имеем:
Неопределено = НайденныеСтроки.Найти(-2550),

потом проверил и + число не ищет также.

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

НайденныеСтроки = ТаблицаЗначений(Отбор) - данные в т.з. есть и массив возвращается как НайденныеСтроки.Количество()>0

НайденныеСтроки - это массив строк таблицы значений.

Отрицательное число стоит в какой-то колонке таблицы значений.

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

Вы можете сделать МассивЗначений = ТаблицаЗначений.ВыгрузитьКолонку("МояКолонкаГдеСтоитОтрицательноеЧисло")

В этом случае Ваш поиск по МассивЗначений вернет Вам индекс найденного элемента.

в отладчике массив сначала просмотрите - потом уже ругайтесь на поиск

НайденныеСтроки - в отладчики показывается как тип данных массив, значит к нему применяются все свойства и методы этого типа данных, или 1С не отвечает за свой help

Текст hep от 1С:
ТаблицаЗначений (ValueTable)
НайтиСтроки (FindRows)
Синтаксис:

Тип: Структура.
Задает условия поиска: ключ структуры определяет имя колонки, по которой будет осуществляться поиск, а значение структуры - искомое значение.
Возвращаемое значение:

Что у 1С платформы есть два разных типа с именем Массив?

(11) массив чего? Чисел, или все же строк ТЧ? Как можно найти в массиве строкТЧ число? Вот если в нем искать строку ТЧ, тогда будет искать.
Чтобы предметно разговаривать, приводите код и значения переменных.
Может там массив индексов найденных строк ТЧ.

(13) Вы невнимательно читаете, разговор уже 2 дня, если что, идет о числовом типе, просыпайтесь. И потом, в методе Найти() не приводится тип искомого значения, внимательно читайте fucking manual от 1С

от 1С на заметку:
Массив (Array)
Найти (Find)
Синтаксис:

Тип: Произвольный.
Искомое значение.

(14) Вы или не понимаете о чем вам все говорят, или делаете вид.
НайденныеСтроки = ТаблицаЗначений(Отбор) - данные в т.з. есть и массив возвращается как НайденныеСтроки.Количество()>0
Вот это что? Приводите полный код, что там в НайденныеСтроки.
По всей видимости Вы не понимаете, что там не нужные числа.

Массив СТРОК ТАБЛИЦЫ ЗНАЧЕНИЙ.

Строка таблицы значений, в свою очередь, является СТРУКТУРОЙ ДАННЫХ.

Массив - есть набор типизированных данных.

Если это массив чисел - можно искать число. Если это массив ссылок на справочник "Номенклатура", то какой результат Вы планируете получить при поиске там значения "1010101"?
При поиске числа внутри структуры, которая является элементом массива, Вы какой результат функции "Найти" планируете получить? ID структуры? Номер элемента массива? Всю структуру целиком?

В массиве структур, число Вы не найдете.

Назовите мне язык программирования с универсальным поиском значения в многомерных массивах.

В данном случае при Вашей реализации есть два метода.

Первый - перебор элементов массива со сравнением необходимого значения с Вашим эталонным.

Второй - выгрузить КОЛОНКУ ТАБЛИЦЫ ЗНАЧЕНИЙ В МАССИВ. Далее в массиве получить индекс искомого элемента. Он будет соответствовать номеру строки таблицы.

Тут, батенька, проблема не в том, что 1С "чего-то там накосячила".
Учите матчасть)))

Читайте также: