Универсальные коллекции в 1С (13 из 100 дней)
Что такое универсальные коллекции?
Универсальные коллекции - это способ обращаться с набором произвольных значений как с единым целым
- Универсальные коллекции предназначены для обработки множеств: списков, таблиц, деревьев
- Универсальность заключается в пригодности этих коллекций для большинства задач, встречающихся в программировании бизнес-систем
- Коллекции, как правило, применяются в сочетании с циклами
Пример. Можно разбить строку на массив слов и обрабатывать их, обходя последовательно или обращаясь к каждому индексу
Пример. Можно сохранить значения реквизитов как свойство структуры и передать их на клиент, где ссылочные объекты и обращения к БД недоступны
Основные классы
- Массив
- Список значения
- Структура
- Соответствие
- Таблица значений
- Дерево значений
Массив
Массивы - это множество элементов, где у каждого элемента есть порядковый номер (индекс)
- В массиве можно обратиться к элементу по его номеру
- Ключевое свойство универсальности коллекций состоит в том, что они подходят для обработки любых элементов
- Элементом может быть что угодно - даты, строки, числа, булево, ссылку или даже другие коллекции
Массив (и любая другая коллекция) сам по себе является объектом. Можно передавать массив целиком между различными участками приложения одной переменной
- Индекс указывается в квадратных скобках после имении переменной массива
- Индексация начинается с нуля. Первый элемент имеет порядковый номер ноль
- Массив создается при помощи конструктора "Новый"
Давайте рассмотрим на практике:
1. Создадим новую обработку (УниверсальныеКоллекции) и команду "РаботаСМассивами"
2. Пропишем следующий код (Установим длину массива, вложем в него элементы, а также выведем информацию о дне недели по текущей дате)
3. Запустим наш алгоритм и увидим, что все выводит корректно (В моем случае сегодня пятница)
Наполнение массива
- Заранее указывать размер массива необязательно
- Если число элементов неизвестно, создаем пустой массив и наполняем его методом "Добавить()"
- Если необходимо вставить какой-то элемент в массив используем метод "Вставить()"
Давайте рассмотрим на практике:
1. Пропишем похожий код только длинна массива изначально неизвестна
2. При запуске увидим точно такой же результат
3. Допустим мы пропустили какой-то элемент и хотим его вставить в середине массива, тогда пропишем следующее
4. Запустим и увидим, что элемент вставился в наш массив и встал на индекс [3]
Совсем необязательно, что у нас в массиве будет лежать только "Строка", может быть и другие виды данных (Дата, Число и т.д.) вместе со "Строкой":
И это важно запомнить, ведь встроенный язык 1С это поддерживает, а, например, Java может содержать в массиве только один тип элементов.
Удаление элементов массива
- Удалить элементы из массива можно методом "Удалить()"
- Рекомендуется удалять элементы с конца массива, так как при каждом удалении его длина уменьшается и граница цикла, пробегающего по массиву, может стать длиннее, чем весь массив
Пример удаление пустых элементов массива
Давайте разберем пример неправильного удаление элемента из массива:
1. Добавим числа в наших массив (Мы хотим, чтобы массив содержал только дни недели)
2. Узнаем максимальный индекс массива с помощью метода ".ВГраница()"
3. Пропишем цикл прохода по массиву
4. Запустим алгоритм и увидим, что элементы удалились, но длина массива, как была 10, так и осталась
5. Дойдя до конца увидим следующую ошибку
Такой подход череват пропуском некоторых элементов в массиве и выход за границу массива
- При удалении элементов с конца уменьшение верхней границы компенсируется тем, что мы уже прошли участок, который сокращается, и не выйдем за пределы массива
- Эффект достигается за счет разности ИсходнаяГраница - Сч
Посмотрим на нашем примере:
1. Создадим дополнительную переменную, позволяющая пройти нам с конца массива до его начала и удалять элементы с конца
2. Запустим наш массив и увидим, что все работает корректно
Мы удалили все элементы массива чисел, прошли весь массив и не вышли за границу
Списки значений
- Список значений содержит значения, их представления, пометки и картинки
- Может автоматически выводиться пользователю:
1. Таблицей формы
2. Подменю или списком выбора
В основном списки значений применяются в пользовательских интерфейсах, когда надо отметить значения флажком или представить их в виде нестандартного текста
- Список значений содержит нестандартное меню выбора
- Заданы текстовые представления для значений
Обработка списка значений
- У списков значений есть ряд методов для удобства обработки
- Например, сортировка значений методом "СортироватьПоЗначению", которого нет у массива
Список содержит элементы особого типа "ЭлементСпискаЗначений"
К самим значениям можно обратиться как к свойству Значение через точку: .Представление, .Пометка, .Картинка
Давайте рассмотрим на практике:
1. Создадим в форме новый объект "СписокПраздников" и выберем тип "Список значений", попутно разместив его на форме
2. Также перенесем поле "Пометка" на форму
3. В свойствах формы создадим событие "ПриОткрытии", оно позволит нам заполнить все поле значений при открытии
4. Пропишем следующий код в этой обработке
5. Создадим команду "ВывестиПраздникиВыбранныеПользователем" и пропишем следующий код (Как раз внесенная нами поле "Пометка" позволит нам выводить выбранные праздники)
6. Запустим платформу и увидим, что все выводится корректно
Давайте также рассмотрим популярные команду (Установить все флажки, Снять все флажки и Инвертировать все флажки):
1. Создадим три команду с соответствующими названиями и для них реализуем обработки
2. Внесем их на форму и зададим отображение только через картинки
3. Пропишем для каждой обработки следующий код
4. Запустим платформу и увидим, что все работает корректно
Структуры
Структура - это одно составное значение с разными свойствами. Хранит именованные элементы, как правило, разнородные
Примеры:
Пользователя можно представить в виде структуры:
- Имя - строка
- Email - строка
- АдминистративныйДоступ - булево
- ДатаПоследнегоВхода - дата
Структуры предназначены для моделирования объектов с различными свойствами
- Сама по себе структура является коллекцией, но именно как коллекцию для обхода в цикле её используют редко
- Структуры применяют, когда надо сохранить много разных переменных в один объект и пользоваться им как единым целым
- Элементы структуры называются свойствами и имеют имена, подчиняющиеся тем же правилам, что и имена переменных
Создание структуры
Структуры создаются при помощи конструктора "Новый"
Давайте рассмотрим на примере:
1. Создадим в нашей же форме новую команду "РаботаСоСтруктурами" и заполним её в коде
2. Запустим откладку и увидим, что в нашу структуры внеслись различные данные
Но мы можем изначально задать фиксированные поля структуры следующим образом, а потом обращаться к полям и заполнять их:
Элементы структуры
Структура - это вид коллекции, поэтому для неё тоже работает цикл "Для Каждого Из"
Элементы структуры - это значение особого типа КлючИЗначение со свойствами Ключ и Значение:
- Ключ - имя свойства структуры
- Значение - значение этого свойства
Массив структур
Достаточно распространенный кейс - использование структур в связке с массивом. Создается массив структур
Соответствия
Соответствие - это инструмент для быстрого поиска и сопоставления одних объектов с другими: поиска дубликатов, сопоставления коллекций и т.д.
- Элементами соответствия, так же, как и элементами структуры, являются объекты типа КлючИЗначение
- В качестве ключа выступает не имя переменной, а вообще любое значение
- Соответствие определяет соответствие одного объекта к другому
Главная особенность соответствия - быстрый поиск по ключу
- Поиск по ключу будет очень быстрым, даже если соответствие состоит из миллиона элементов
Обращение к элементам соответствия
Один из вариантов обращения к элементу соответствия - с помощью указания в квадратных скобках переменной, содержащей значение ключа
Однако чаще используются специальные методы соответствий, упрощающие чтение кода
Особенность соответствия: если попытаться установить значение для уже существующего ключа, то оно будет перезаписано.
На этом можно построить алгоритм поиска дубликатов
Давайте рассмотрим все на примере:
1. Создадим новую команду "РаботаССоответствием"
2. Пропишем следующий код и увидим, как работает алгоритм
Хорошо, как работает соответствие мы поняли, а теперь давайте рассмотрим хрестоматийный пример работы с соответствием - поиск дублей:
1. В нашей же обработке пропишем следующий код для поиска дублей
Переменная "Повтор" пытается получить ключ от числа в соответствии (На первый ход ключ ещё в состоянии "неопределённо", мы записываем наше число в соответствие и идем дальше). Если нам попадается дубликат числа, то переменная "Повтор" определяется и выполняется "Иначе", где к значению добавляется повтор
2. Запустив код, мы увидим, что нашлось несколько дублей
Таблицы значений
Таблица значений - это коллекция строк с определенным составом колонок
- К колонкам обращаются через точку, как к свойству строки
- К именам колонок предъявляются те же требования, что к именам переменных и ключам структур
Больше всего ТаблицаЗначений похожа на массив структур:
- К строкам можно обратиться по числовому индексу в квадратных скобках
- Полученное значение ведет себя, как структура - набор переменных, доступных через точку
- Есть дополнительные функции, такие как поиск, свертка, сортировка и т.д.
Создание таблицы значений
Само создание таблицы начинается с наполнения её колонок - структуры будущих записей
После того как колонки созданы, можно переходить к наполнению таблицы данными
- В таблицах используем метод "Добавить()", который возвращает специальный объект СтрокаТаблицыЗначений
- Строку таблицы мы наполняем, обращаясь к свойствам через точку
Давайте рассмотрим на практике
1. Создадим команду "РаботаСТаблицамиЗначений" (Стоит учитывать, что на стороне клиента мы не можем напрямую работать с таблицами значений, поэтому нужно реализовать работу через сервер)
2. Создадим дополнительную процедуру "РаботаСТаблицамиЗначенийНаСервере" и пропишем следующий код, позволяющий создать колонки (Наша таблица пуста пока что)
3. Заполним таблицу строками
4. Запустим отладку
Получение строк таблицы значений
- Строку таблицы можно получить по её числовому индексу, как из массива
- Кроме того, строку можно искать методом Найти()
- Можно найти несколько строк методом НайтиСтроки()
- Таблица доступа для перебора циклом Для каждого
Рассмотрим все способы получения
1. Поиск по индексу (Выведет нам нужную строку в указанном индексе)
2. Поиск через метод "Найти()" (Выведет нам первую подходящую строку
3. Поиск через метод "НайтиСтроки()" (Важно, что нужно создать структуру, где ключом выступает - имя колонки, а поиск - строка. Выведется все строки нужной категории)
4. Поиск через цикл "ДляКаждого"
Сортировка таблиц
Данные в таблице можно отсортировать по нескольким колонкам
- Доступна сортировка в разном порядке возрастания или убывания
Попробуем в нашей таблице отсортировать строки по возрастанию суммы через метод "Сортировать ( "Имя_Колонки Возр/Убыв" )":
Свёртка таблиц
- Данные в таблице можно агрегировать (Свернуть) по набору полей
- Свертка работает для одинаковых значений полей
Давайте в нашей таблице воспользуемся сверткой
1. Пропишем следующий код, который должен нам вернуть таблицу с общим количеством и общей суммой категории "Обувь"
2. Как видим, что все вывелось четко
Деревья значений
Дерево значений - это такая же таблица значений, но каждая строка в нем может иметь точно такую же коллекцию подчиненных строк
Наполнение дерева значений
- Все коллекции строк доступны через свойство "Строки"
- Дерево значений наполняется строками с помощью свойства "Строки", которое содержит коллекцию дочерних строк
- В остальном дерево значений - это таблица значений с колонками, работа с ним осуществляется аналогичным образом, с минимум исключений
Посмотрим на практике:
1. Создадим команду "РаботаСДеревомЗначений" (Оно также, как и таблица значений работает только через сервер)
2. Создадим новое дерево и заполним его строками и дочерними строками
3. Запустим откладку и увидим, что есть родительские строки и дочерние
Для обработки деревьев значений используется рекурсий, но о ней поговорим позже.
Встретимся с вами уже скоро с объектами платформы