На практике часто бывает нужно работать с массивом, каждый элемент которого содержит структуру. При этом было бы хорошо иметь несколько универсальных функций, которые могли бы решать следующие задачи:
1) Поиск элемента массива структур по одному значению;
2) Поиск элемента массива структур по двум значениям;
3) Поиск минимального и максимального значения в массиве структур.
С подобной задачей можно столкнуться, например, когда мы запросом получаем информацию из базы данных, и хотим вернуть ее на клиент в виде таблицы значений. Но с таблицей значений на момент написания статьи в тонком клиенте работать нельзя. Поэтому, чтобы вернуть таблицу значений на клиент можем использовать функцию БСП “ТаблицаЗначенийВМассив”:
В результате на клиенте получаем массив, каждый элемент которого содержит структуру:
Исходные данные:
1. Учебная конфигурация;
2. Платформа 8.3.19.1150.
Решение задачи “Поиск элемента массива структур по одному значению”:
Пояснение:
В цикле обходим каждый элемент массива структур:
Во вложенном цикле обходим структуру, где “Ключ” это наименование столбца в запросе, а “Значение” его значение:
Далее проверяем, если “Ключ” равен ключу, который мы ищем, и значение равно значению, которое мы ищем, фиксирует результат и прерываем цикл.
В результате получаем:
Решение задачи “Поиск элемента массива структур по двум значениям”:
Пояснение:
В цикле обходим каждый элемент массива структур.
Если второй ключ для поиска не указан, обходим структуру текущего элемента массива и проверяем, есть ли в ней нужное значение.
Если второй ключ для поиска указан, в переменные “ЗначениеСтруктуры” и “ЗначениеСтруктуры2” помещаем соответствующие значения искомых ключей и сравниваем их с искомыми значениями:
В результате получаем:
Решение задачи “Поиск минимального и максимального значения в массиве структур”:
Пояснение:
В цикле обходим элементы массива. Во вложенном цикле обходим структуру и сравниваем минимальное значение со значением в текущей итерации.
В результате получаем:
Аналогичным образом ищем максимальное значение:
В результате получаем:
Ссылки для скачивания:
- Поиск элемента массива структур по одному значению;
- Поиск элемента массива структур по двум значениям;
- Поиск минимального значения в массиве структур;
- Поиск максимального значения в массиве структур.
2022-05-23 11:58
Программирование
Поиск по массиву структур |
Я |
10.06.13 – 10:50
Добрый день! Скажите пожалуйста, как правильно искать значение по массиву структур? Простым Найти ничего не находит. Вот структура:
СтруктураЗаписейРазговоров.Вставить(“Channel”, КлючСтруктуры);
СтруктураЗаписейРазговоров.Вставить(“Value”, ЗаписьРазговора);
МассивЗаписейРазговоров.Добавить(СтруктураЗаписейРазговоров);
Как в ней найти значение Value по ключу Channel ?
1 – 10.06.13 – 10:51
только циклом, а почему вам не использовать соответствие?
2 – 10.06.13 – 10:52
(1) а как использовать соотвествие?
3 – 10.06.13 – 10:54
&НаСервере
Функция ПолучитьПодразделение_(КодСклада)
соо=Новый Соответствие;
соо.Вставить(“Б0137”, “00-000020”);
соо.Вставить(“Б0132”, “00-000019”);
соо.Вставить(“Б0050”, “00-000017”);
Возврат Справочники.ПодразделенияОрганизаций.НайтиПоКоду(соо[КодСклада]);
КонецФункции
4 – 10.06.13 – 10:58
(3) что-то я не пойму, т.е. я должна знать значение Value?
5 – 10.06.13 – 11:00
(4) ты должна знать ключ (который называла Channel)
6 – 10.06.13 – 11:01
Функция ПолучитьПодразделение_(Channel)
соо=Новый Соответствие;
соо.Вставить(“Б0137”, “00-000020”);
соо.Вставить(“Б0132”, “00-000019”);
соо.Вставить(“Б0050”, “00-000017”);
Возврат соо[Channel];
КонецФункции
7 – 10.06.13 – 11:01
(0) Использование таблиц значений в вашей религии запрещено?
8 – 10.06.13 – 11:01
+(6) Функция ПолучитьValue(Channel)
9 – 10.06.13 – 11:02
+(7) Зато поощряется использование идентификаторов на латинице
10 – 10.06.13 – 11:02
ПолучитьValue… Это надо запомнить
11 – 10.06.13 – 11:02
(8) подожди, а откуда я возьму все эти значения, которые ты указал в своем соотвествии ?
12 – 10.06.13 – 11:05
(11) подожди, в чем задача вообще? ))
13 – 10.06.13 – 11:13
14 – 10.06.13 – 11:14
15 – 10.06.13 – 12:37
(13) а откуда эта функция берется
Если Вычислить(Условие) Тогда
16 – 10.06.13 – 12:43
(15)+ Вообще можешь
Например
Процедура СкопироватьПоУсловию(Тз,Условие)
резулт=Тз.СкопироватьКолонки();
Для каждого Стр из Тз Цикл
Если Вычислить(Условие) Тогда
РезСтр=Резулт.Добавить();
ЗаполнитьЗначенияСвойств(РезСтр,стр);
КонецЕсли;
КонецЦЦикла
возврат резулт
КонецФункции
17 – 10.06.13 – 13:30
(16) К сожалению в 1С нет ни лямбд ни делегатов
но есть функция вычислить, которая выполняет текст
Функция НайтиПоУсловию(Тз,Условие,Список=””,Модуль=””)
Массив новый массив;
Для каждого Стр из Тз Цикл
Если Вычислить(Условие) Тогда
массив.Добавить(стр)
КонецЕсли
КонецЦикла;
возврат Тз.Скопировать(массив)
КонецФункции
Рез=НайтиПоУсловию(тз,”стр.ФизЛицо=””Иванов””
или стр.ФизЛицо=””Сидоров””
или стр.ФизЛицо=””Петров”””);
или
Список=ОбщегоНазначение.РазложитьСтрокуВМассивПодстрок(“Иванов,Сидоров,Петров”);
Рез=НайтиПоУсловию(тз,”Список.Найти(стр.ФизЛицо)<>Неопределено”);
Или
Рез=НайтиПоУсловию(тз,”Найти(Врег(стр.Значение),Врег(“”акф””))>0″);
Рез=НайтиПоУсловию(тз,”Модуль.ФункцияСравнения(Стр,Список)”,ЭтотОбъект);
То есть в модуле обработки должна быть функция
Функция ФункцияСравнения(стр,МассивСтруктур) Экспорт
18 – 10.06.13 – 13:32
17 В данном примере Вычислить обрабатывает строку с условием Условие учитывая переменные Стр,тз,Список,Модуль
19 – 10.06.13 – 13:34
(0)Структура (Structure)
Свойство (Property)
Возвращаемое значение:
Тип: Булево.
Истина – ключ найден; Ложь – в противном случае.
не оно ?
20 – 10.06.13 – 13:34
Прошу прощения не в тему. Что то перегрелся.
21 – 10.06.13 – 14:10
(3) а если я буду использовать соответствие, то смогу найти значение Value?
22 – 10.06.13 – 14:50
(21) ЗаписьРазговора = Соответствие.Получить(КлючСтруктуры);
23 – 10.06.13 – 14:53
(22) а массив тогда вообще не нужен что ли?
24 – 10.06.13 – 14:59
(23) Соответствие – это замена массиву структур. И правильнее, и проще, и быстрее работает.
25 – 10.06.13 – 15:00
(24) Спасибо большое! Я уже сама это начала понимать
AnisaL
26 – 10.06.13 – 15:15
Спасибо всем), разобралась с этими соответствиями и структурами
Массив в 1с 8.3 — это пронумерованная коллекция значений произвольного типа. Использование массивов в 1с позволяет получить значение элемента массива по его индексу. Массивы бывают одномерные и многомерные (состоящие из нескольких коллекций значений). Они относятся к универсальным коллекциям значений.
Массивы в 1с:Предприятии можно использовать аналогично другим системам программирования.
Создание массивов в 1с.
Для создания массива используется следующий Синтаксис:
Новый Массив(<КоличествоЭлементов1>,…,<КоличествоЭлементовN>)
Массив можно создать при помощи следующей конструкции:
// в массиве сразу 3 элемента
Массив = Новый Массив(3);
//Одномерный массив
ПустойМассив = Новый Массив();//Пустой массив
Массив2 = Новый Массив(2);//массив из двух элементов
//Двумерный массив в 1С 8.3
ДвумерныйМассив = Новый Массив(2,3);
Каждый из двух элементов двумерного массива является массивом из трёх элементов.
Добавление элемента в массив
Синтаксис: Массив.Добавить([Значение]);
Использование метода Добавить добавляет элемент в конец массива. Вывод значений массива производиться с использованием цикла Для. Например:
Обработка использование массивов в 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
Комментарии доступны только авторизированным пользователям