Как в массиве структур найти нужную

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Тэги: 1С 8

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
// control.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <Windows.h>
#include <string.h>
 
using namespace std;
const int NotUsed = system( "color F0" );
 
struct student
{
    char lastname[30];
    char firstname[30];
    char street[30];
             int house;
    int apartment;
}mas;
 
int _tmain(int argc, _TCHAR* argv[])
{
  int option = 0;
  while(option != -1) {
  cout<<endl<<"1 - Make 2 - Print 3 - Save 4 - Load 5 - Sort 6 - Find 0 - Exit"<<endl;
  cout<<"Input Num ";
  cin >> option;
  switch(option) {
           case 1:
   cout <<endl<<"Make"<<endl;
   int i;
   struct student mas[10];
   strcpy_s(mas[0].lastname, "Anisimov");
   strcpy_s(mas[0].firstname, "Anton");
   strcpy_s(mas[0].street, "Budanuva"); 
   mas[0].house=10;
   mas[0].apartment=3;
   strcpy_s(mas[1].lastname, "Bunin");
   strcpy_s(mas[1].firstname, "Pavel");
   strcpy_s(mas[1].street, "Oboronu"); 
   mas[1].house=20;
   mas[1].apartment=5;
   strcpy_s(mas[2].lastname, "Cuprin");
   strcpy_s(mas[2].firstname, "Vasiliy");
   strcpy_s(mas[2].street, "Lesnaay"); 
   mas[2].house=15;
   mas[2].apartment=8;
   strcpy_s(mas[3].lastname, "Dostoevskiy");
   strcpy_s(mas[3].firstname, "Igor");
   strcpy_s(mas[3].street, "Globova"); 
   mas[3].house=1;
   mas[3].apartment=15;
   strcpy_s(mas[4].lastname, "Esenin");
   strcpy_s(mas[4].firstname, "Evgeniy");
   strcpy_s(mas[4].street, "Respublikanskay"); 
   mas[4].house=56;
   mas[4].apartment=5;
   strcpy_s(mas[5].lastname, "Bach");
   strcpy_s(mas[5].firstname, "Anton");
   strcpy_s(mas[5].street, "Chmelnaay"); 
   mas[5].house=11;
   mas[5].apartment=88;
   strcpy_s(mas[6].lastname, "Pushkin");
   strcpy_s(mas[6].firstname, "Aleksandr");
   strcpy_s(mas[6].street, "Rechnaay"); 
   mas[6].house=132;
   mas[6].apartment=33;
   strcpy_s(mas[7].lastname, "Nosov");
   strcpy_s(mas[7].firstname, "Nikolay");
   strcpy_s(mas[7].street, "Treugolnaay"); 
   mas[7].house=16;
   mas[7].apartment=81;
   strcpy_s(mas[8].lastname, "Ostrovskiy");
   strcpy_s(mas[8].firstname, "Igor");
   strcpy_s(mas[8].street, "Komarskaay"); 
   mas[8].house=19;
   mas[8].apartment=8;
   strcpy_s(mas[9].lastname, "Asprin");
   strcpy_s(mas[9].firstname, "Robert");
   strcpy_s(mas[9].street, "Snezhnaay"); 
   mas[9].house=6;
   mas[9].apartment=24;
   for (i=0;i<10;i++)
   cout<<""<<mas[i].lastname<<" "<<mas[i].firstname<<" st. "<<mas[i].street<<" "<<mas[i].house<<", ap."<<mas[i].apartment<<endl;      
           break;
           case 2:
   cout <<endl<<"Print"<<endl;
   for(i=0;i<10;i++)
   cout<<""<<mas[i].lastname<<" "<<mas[i].firstname<<" st. "<<mas[i].street<<" "<<mas[i].house<<", ap."<<mas[i].apartment<<endl;
           break;
           case 3:
   cout <<endl<<"Save"<<endl;
   {
    ofstream outfile;
    outfile.open("outfile.txt");
    for (i=0;i<10;++i)
    outfile << mas[i].lastname << " " << mas[i].firstname << " st. " << mas[i].street << " " << mas[i].house << ", ap. " << mas[i].apartment <<endl;
    outfile.close();
   }
           break;
           case 4:
   cout <<endl<<"Load"<<endl;
   {char buff[100]; 
   ifstream fin("outfile.txt"); 
   for (i=0;i<10;i++)
   {
    fin.getline(buff, 100);
    cout << buff<<endl;
   }
   fin.close();
   }
           break;
           case 5:
   cout <<endl<<"Sort"<<endl;
   int j;
   char mas2[30];
   char mas3[30];
   char mas4[30];
   int mas5;
   int mas6;
   for(i=0;i<10-1;i++)
        for(j=i+1;j<10;j++)
            if(strcmp(mas[i].lastname,mas[j].lastname)>0)
            {strcpy_s(mas2,mas[i].lastname);
     strcpy_s(mas3,mas[i].firstname);
     strcpy_s(mas4,mas[i].street);
     swap(mas[i].house,mas5);
     swap(mas[i].apartment,mas6);
    
     strcpy_s(mas[i].lastname,mas[j].lastname);
     strcpy_s(mas[i].firstname,mas[j].firstname);
     strcpy_s(mas[i].street,mas[j].street);
     swap(mas[i].house,mas[j].house);
     swap(mas[i].apartment,mas[j].apartment);
 
              strcpy_s(mas[j].lastname,mas2);
     strcpy_s(mas[j].firstname,mas3);
     strcpy_s(mas[j].street,mas4);
     swap(mas[j].house,mas5);
     swap(mas[j].apartment,mas6);
             }
    for(i=0;i<10;i++)
    cout<<mas[i].lastname<<" "<<mas[i].firstname<<" st. "<<mas[i].street<<" "<<mas[i].house<<", ap."<<mas[i].apartment<<endl;
           break;
           case 6:
   cout <<endl<<"Find"<<endl;
 
           break;
           case 0: return 0;
           default:
  cout <<endl<<"Error"<<endl;
                             }
                          }
system("pause");
return 0;
}

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

Синтаксис

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

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

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

number Find(Value)

Параметры

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

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

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

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

Описание

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

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

Доступность

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

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

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

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

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

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