Перейти к основному содержимому

Коллекции

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

Базовые типы

В основе иерархии типов, предназначенных для работы с коллекциями, лежит тип Обходимое<ТипЭлемента>.

Далее в иерархии располагаются типы ЧитаемаяКоллекция<ТипЭлемента> и ЧитаемоеСоответствие<ТипКлюча,ТипЗначения>, которые реализуют базовый контракт, необходимый для работы со списком элементов и словарем.

Фиксированные и обычные коллекции

Типы, которые реализуют механизм работы с коллекциями, можно разделить на два вида:

  • фиксированные коллекции — типы, которые не позволяют изменять свой состав;
  • обычные коллекции — типы, которые позволяют изменять свой состав.

Типы для работы с коллекциями

В языке поддерживаются следующие типы для работы с коллекциями:

Методы последовательной обработки коллекций

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

Методы делятся на последовательные и терминальные. К последовательным методам относятся те, которые могут применяться к потоку данных несколько раз без его завершения. Например, Преобразовать(), Фильтровать(), Сортировать(), ДляКаждого(). К терминальным методам относятся методы, которые применяются к потоку только один раз и возвращают результат. Это такие методы, как ВМассив(), НетСоответствий(), Соединить().

При вызове цепочки последовательных методов они выполняются лениво: только последний метод в цепочке является терминальным.

Примеры последовательного вызова методов

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

// Без использования потоковой обработки
метод ПолучитьСписокПользователей(Получатели: Массив<Строка>): Массив<Пользователи.Ссылка?>
пер Запрос = Запрос{
Выбрать
Код, Пользователь
Из
Сотрудники
Где
Код В (%Получатели)
}
пер Пользователи = новый Массив<Пользователи.Ссылка?>()
исп РезультатЗапроса = Запрос.Выполнить()
для Строка из РезультатЗапроса
если Строка.Пользователь != Неопределено
Пользователи.Добавить(Строка.Пользователь)
;
;
возврат Пользователи
;

// С использованием потоковой обработки
метод ПолучитьСписокПользователей1(Получатели: Массив<Строка>): Массив<Пользователи.Ссылка?>
возврат Запрос{
Выбрать
Код, Пользователь
Из
Сотрудники
Где
Код В (%Получатели)
}
.Выполнить()
.Преобразовать(Элемент -> Элемент.Пользователь, Истина)
;

Пример использования метода «ЕстьСоответствия»

// Без использования потоковой обработки
метод ВычетыНаДетейВидимость(): Булево
для ЗаписьОРебенке из ТаблицаДети.Дети
если ЗаписьОРебенке.Удалено
продолжить
;
возврат Истина
;
возврат Ложь
;

// С использованием потоковой обработки
метод ВычетыНаДетейВидимость(): Булево
возврат ТаблицаДети.Дети.ЕстьСоответствия(Элемент -> не Элемент.Удалено)
;

Пример использования метода «СортироватьПо»

Если метод СортироватьПо() используется в цепочке вызовов, после него можно вызвать метод ПотомСортироватьПо(). Тогда сортировка будет выполняться по полям поочередно в соответствующем порядке.

структура Сотрудник
пер Фамилия: Строка
пер Должность: Строка
;

метод СортироватьПоДолжностиИФамилии(): Массив<Сотрудник>
знч СписокСотрудников =
[новый Сотрудник(Фамилия = "Яковлев", Должность = "Менеджер"),
новый Сотрудник(Фамилия = "Смирнов", Должность = "Руководитель"),
новый Сотрудник(Фамилия = "Иванов", Должность = "Менеджер")]

возврат СписокСотрудников.СортироватьПо(Элемент -> Элемент.Должность)
.ПотомСортироватьПо(Элемент -> Элемент.Фамилия)
.ВМассив()
;

В результате выполнения метода вернется массив, содержащий следующие элементы:

[0]: {Фамилия="Иванов", Должность="Менеджер"}
[1]: {Фамилия="Яковлев", Должность="Менеджер"}
[2]: {Фамилия="Смирнов", Должность="Руководитель"}

Пример использования метода «ГруппироватьПо»

структура Сотрудники
пер Фамилия: Строка
пер Отдел: Строка
;

метод СгруппироватьСотрудников(): Последовательность<КлючИЗначение<Строка, Множество<Строка>>>
знч СписокСотрудников =
[новый Сотрудники(Фамилия = "Петров", Отдел = "Разработка"),
новый Сотрудники(Фамилия = "Смирнов", Отдел = "Разработка"),
новый Сотрудники(Фамилия = "Иванов", Отдел = "Тестирование")]

возврат СписокСотрудников.КакПоследовательность()
.ГруппироватьПо(Элемент -> Элемент.Отдел,
Элемент -> Элемент.Фамилия,
() -> новый Множество<Строка>())
;

Метод ГруппироватьПо() вернет последовательность, содержащую следующие элементы:

"Тестирование": {"Иванов"}
"Разработка": {"Петров", "Смирнов"}