Как найти элемент массива структур

Постановка задачи:

На практике часто бывает нужно работать с массивом, каждый элемент которого содержит структуру. При этом было бы хорошо иметь несколько универсальных функций, которые могли бы решать следующие задачи:
1) Поиск элемента массива структур по одному значению;
2) Поиск элемента массива структур по двум значениям;
3) Поиск минимального и максимального значения в массиве структур.

С подобной задачей можно столкнуться, например, когда мы запросом получаем информацию из базы данных, и хотим вернуть ее на клиент в виде таблицы значений. Но с таблицей значений на момент написания статьи в тонком клиенте работать нельзя. Поэтому, чтобы вернуть таблицу значений на клиент можем использовать функцию БСП “ТаблицаЗначенийВМассив”:


В результате на клиенте получаем массив, каждый элемент которого содержит структуру:
Исходные данные:

1. Учебная конфигурация;
2. Платформа 8.3.19.1150.

Решение задачи “Поиск элемента массива структур по одному значению”:


Пояснение:

В цикле обходим каждый элемент массива структур:


Во вложенном цикле обходим структуру, где “Ключ” это наименование столбца в запросе, а “Значение” его значение:

Далее проверяем, если “Ключ” равен ключу, который мы ищем, и значение равно значению, которое мы ищем, фиксирует результат и прерываем цикл.

В результате получаем:


Решение задачи “Поиск элемента массива структур по двум значениям”:
Пояснение:

В цикле обходим каждый элемент массива структур.

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

Если второй ключ для поиска указан, в переменные “ЗначениеСтруктуры” и “ЗначениеСтруктуры2” помещаем соответствующие значения искомых ключей и сравниваем их с искомыми значениями:




В результате получаем:
Решение задачи “Поиск минимального и максимального значения в массиве структур”:
Пояснение:

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

В результате получаем:


Аналогичным образом ищем максимальное значение:
В результате получаем:
Ссылки для скачивания:

  1. Поиск элемента массива структур по одному значению;
  2. Поиск элемента массива структур по двум значениям;
  3. Поиск минимального значения в массиве структур;
  4. Поиск максимального значения в массиве структур.


2022-05-23 11:58

Программирование

Поиск по массиву структур

Я
   AnisaL

10.06.13 – 10:50

Добрый день! Скажите пожалуйста, как правильно искать значение по массиву структур? Простым Найти ничего не находит. Вот структура:

   СтруктураЗаписейРазговоров.Вставить(“Channel”, КлючСтруктуры);

   СтруктураЗаписейРазговоров.Вставить(“Value”, ЗаписьРазговора);

МассивЗаписейРазговоров.Добавить(СтруктураЗаписейРазговоров);

Как в ней найти значение Value по ключу Channel ?

   Ненавижу 1С

1 – 10.06.13 – 10:51

только циклом, а почему вам не использовать соответствие?

   AnisaL

2 – 10.06.13 – 10:52

(1) а как использовать соотвествие?

   Wobland

3 – 10.06.13 – 10:54

&НаСервере

Функция ПолучитьПодразделение_(КодСклада)

   соо=Новый Соответствие;

   соо.Вставить(“Б0137”, “00-000020”);

   соо.Вставить(“Б0132”, “00-000019”);

   соо.Вставить(“Б0050”, “00-000017”);

   
   Возврат Справочники.ПодразделенияОрганизаций.НайтиПоКоду(соо[КодСклада]);

КонецФункции

   AnisaL

4 – 10.06.13 – 10:58

(3) что-то я не пойму, т.е. я должна знать значение Value?

   Ненавижу 1С

5 – 10.06.13 – 11:00

(4) ты должна знать ключ (который называла Channel)

   Wobland

6 – 10.06.13 – 11:01

Функция ПолучитьПодразделение_(Channel)

   соо=Новый Соответствие;

   соо.Вставить(“Б0137”, “00-000020”);

   соо.Вставить(“Б0132”, “00-000019”);

   соо.Вставить(“Б0050”, “00-000017”);

   
   Возврат соо[Channel];

КонецФункции

   Defender aka LINN

7 – 10.06.13 – 11:01

(0) Использование таблиц значений в вашей религии запрещено?

   Wobland

8 – 10.06.13 – 11:01

+(6) Функция ПолучитьValue(Channel)

   Defender aka LINN

9 – 10.06.13 – 11:02

+(7) Зато поощряется использование идентификаторов на латинице

   Defender aka LINN

10 – 10.06.13 – 11:02

ПолучитьValue… Это надо запомнить

   AnisaL

11 – 10.06.13 – 11:02

(8) подожди, а откуда я возьму все эти значения, которые ты указал в своем соотвествии ?

   Ненавижу 1С

12 – 10.06.13 – 11:05

(11) подожди, в чем задача вообще? ))

   Serginio1

13 – 10.06.13 – 11:13

   Serginio1

14 – 10.06.13 – 11:14

   AnisaL

15 – 10.06.13 – 12:37

(13) а откуда эта функция берется

Если Вычислить(Условие) Тогда

   AnisaL

16 – 10.06.13 – 12:43

(15)+ Вообще можешь

Например

Процедура СкопироватьПоУсловию(Тз,Условие)

резулт=Тз.СкопироватьКолонки();

Для каждого Стр из Тз Цикл

Если Вычислить(Условие) Тогда

РезСтр=Резулт.Добавить();

ЗаполнитьЗначенияСвойств(РезСтр,стр);

КонецЕсли;

КонецЦЦикла

возврат резулт

КонецФункции

   Serginio1

17 – 10.06.13 – 13:30

(16) К сожалению в 1С нет ни лямбд ни делегатов

но есть функция вычислить, которая выполняет текст

Функция НайтиПоУсловию(Тз,Условие,Список=””,Модуль=””)

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

Для каждого Стр из Тз Цикл

  Если Вычислить(Условие) Тогда

    массив.Добавить(стр)

  КонецЕсли

КонецЦикла;

возврат Тз.Скопировать(массив)

КонецФункции

Рез=НайтиПоУсловию(тз,”стр.ФизЛицо=””Иванов””

   или стр.ФизЛицо=””Сидоров””

   или стр.ФизЛицо=””Петров”””);

или

Список=ОбщегоНазначение.РазложитьСтрокуВМассивПодстрок(“Иванов,Сидоров,Петров”);

Рез=НайтиПоУсловию(тз,”Список.Найти(стр.ФизЛицо)<>Неопределено”);

Или

Рез=НайтиПоУсловию(тз,”Найти(Врег(стр.Значение),Врег(“”акф””))>0″);

Рез=НайтиПоУсловию(тз,”Модуль.ФункцияСравнения(Стр,Список)”,ЭтотОбъект);

То есть в модуле обработки должна быть функция

Функция ФункцияСравнения(стр,МассивСтруктур) Экспорт

   Serginio1

18 – 10.06.13 – 13:32

17 В данном примере Вычислить обрабатывает строку с условием Условие учитывая переменные Стр,тз,Список,Модуль

   zladenuw

19 – 10.06.13 – 13:34

(0)Структура (Structure)

Свойство (Property)

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

Тип: Булево.

Истина – ключ найден; Ложь – в противном случае.

не оно ?

   Serginio1

20 – 10.06.13 – 13:34

Прошу прощения не в тему. Что то перегрелся.

   AnisaL

21 – 10.06.13 – 14:10

(3) а если я буду использовать соответствие, то смогу найти значение Value?

   Рыжий Лис

22 – 10.06.13 – 14:50

(21) ЗаписьРазговора = Соответствие.Получить(КлючСтруктуры);

   AnisaL

23 – 10.06.13 – 14:53

(22) а массив тогда вообще не нужен что ли?

   Рыжий Лис

24 – 10.06.13 – 14:59

(23) Соответствие – это замена массиву структур. И правильнее, и проще, и быстрее работает.

   AnisaL

25 – 10.06.13 – 15:00

(24) Спасибо большое! Я уже сама это начала понимать

  

AnisaL

26 – 10.06.13 – 15:15

Спасибо всем), разобралась с этими соответствиями и структурами

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

Массивы в 1с:Предприятии можно использовать аналогично другим системам программирования.

Методы работы с массивами в 1с
Методы работы с массивами в 1с

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

Для создания массива используется следующий Синтаксис:

Новый Массив(<КоличествоЭлементов1>,…,<КоличествоЭлементовN>)

Массив можно создать при помощи следующей конструкции:

// в массиве сразу 3 элемента

Массив = Новый Массив(3);

//Одномерный массив

ПустойМассив = Новый Массив();//Пустой массив

Массив2 = Новый Массив(2);//массив из двух элементов

//Двумерный массив в 1С 8.3

ДвумерныйМассив = Новый Массив(2,3);

Каждый из двух элементов двумерного массива является массивом из трёх элементов.

Добавление элемента в массив

Синтаксис: Массив.Добавить([Значение]);

Использование метода Добавить добавляет элемент в конец массива. Вывод значений массива производиться с использованием цикла Для. Например:

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

Обработка использование массивов в 1с

Вывод массива в 1с
Вывод массива в 1с

Вставка значений в массив по указанному индексу.

Повторим Команда Добавить() помещает добавляемый элемент в конец массива. Команда Вставить позволяет разместить элемент в произвольный индекс.

Синтаксис: Массив.Вставить(Индекс[, Значение]);

Вставить в массив 1с
Вставить в массив 1с

Результат работы команды Вставка().

Результат работы метода Вставить
Результат работы метода Вставить

Найти элемент массива

Найти осуществляет поиск элемента массива.

Синтаксис: Массив.Найти(ЗначениеЭлемента);

Фрагмент кода:

Метод Найти в массиве 1с
Метод Найти в массиве 1с

Определение количества элементов массива в 1с

Количество. Определяет количество элементов в массиве.

Синтаксис: Массив.Количество();

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

Определение наибольший индекс массива в 1с

ВГраница Получает наибольший индекс массива.

Синтаксис: Массив.ВГраница

Фрагмент кода:

наибольший индекс массива в 1с
наибольший индекс массива в 1с

Удаление элемента массива в 1с

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

Синтаксис: Массив.Удалить(Индекс);

Фрагмент кода:

Удаление элемента массива в 1с
Удаление элемента массива в 1с

Очистить массив в 1с.

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

Синтаксис: Массив.Очистить().

Фрагмент кода:

Очистить массив в 1с
Очистить массив в 1с

Примеры

КАК ПЕРЕБРАТЬ ЭТОТ МАССИВ И ПОКАЗАТЬ, ЧТО В НЕМ ХРАНИТСЯ?

Для Каждого ЭлементМассива Из СозданныйМассив Цикл

Сообщить(ЭлементМассива);

КонецЦикла; // результат: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

Преобразование таблицы значений в массив структур.

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

Табабб=новый ТаблицаЗначений;
абб=новый массив;

//МассивСтруктур = Новый Массив;

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

ЭлементСтруктура = Новый Структура;

Для Каждого ИмяКолонки Из Табабб.Колонки Цикл

ЭлементСтруктура.Вставить(ИмяКолонки.Имя, СтрокаТЗ[ИмяКолонки.Имя]);

КонецЦикла;

абб.Добавить(ЭлементСтруктура);

КонецЦикла;

Код преобразования Таблицы Значений в массив
Код преобразования Таблицы Значений в массив

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

Синтаксис

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

число Найти(Значение)

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

number Find(Value)

Параметры

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

Имя параметра* Тип Описание
Значение Произвольный Значение, которое нужно найти
*Жирным шрифтом выделены обязательные параметры

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

Число — индекс первого найденного элемента массива
Неопределено — если элемент не был найден

Описание

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

Важно! Метод эффективно использовать для поиска уникальных значений

Доступность

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

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

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

м = Новый Массив;
...
элт = м.Найти(1);
Если элт = Неопределено Тогда
	м.Добавить(1);
КонецЕсли;
элт = м.Найти(2);
Если элт = Неопределено Тогда
	м.Добавить(2);
КонецЕсли;
...

Поделиться страницей в соц.сетях

Добрый день! Скажите пожалуйста, как правильно искать значение по массиву структур? Простым Найти ничего не находит. Вот структура: МассивЗаписейРазговоров.Добавить(СтруктураЗаписейРазговоров); Как в ней найти значение Value по ключу Channel ?

только циклом, а почему вам не использовать соответствие?

а как использовать соотвествие?

что-то я не пойму, т.е. я должна знать значение Value?

ты должна знать ключ (который называла Channel)

Использование таблиц значений в вашей религии запрещено?

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

+ Зато поощряется использование идентификаторов на латинице

ПолучитьValue… Это надо запомнить

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

подожди, в чем задача вообще? ))

а откуда эта функция берется Если Вычислить(Условие) Тогда

+ Вообще можешь КонецФункции

К сожалению в 1С нет ни лямбд ни делегатов но есть функция вычислить, которая выполняет текст Функция НайтиПоУсловию(Тз,Условие,Список=””,Модуль=””) Массив новый массив; Или То есть в модуле обработки должна быть функция

17 В данном примере Вычислить обрабатывает строку с условием Условие учитывая переменные Стр,тз,Список,Модуль

Возвращаемое значение: Тип: Булево. Истина – ключ найден; Ложь – в противном случае. не оно ?

Прошу прощения не в тему. Что то перегрелся.

а если я буду использовать соответствие, то смогу найти значение Value?

ЗаписьРазговора = Соответствие.Получить(КлючСтруктуры);

а массив тогда вообще не нужен что ли?

Соответствие – это замена массиву структур. И правильнее, и проще, и быстрее работает.

Спасибо большое! Я уже сама это начала понимать

Спасибо всем), разобралась с этими соответствиями и структурами

Тэги: 1С 8

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

Добавить комментарий