Универсальные коллекции в 1С (13 из 100 дней)

Универсальные коллекции в 1С (13 из 100 дней)

Что такое универсальные коллекции?

Универсальные коллекции - это способ обращаться с набором произвольных значений как с единым целым

- Универсальные коллекции предназначены для обработки множеств: списков, таблиц, деревьев

- Универсальность заключается в пригодности этих коллекций для большинства задач, встречающихся в программировании бизнес-систем

- Коллекции, как правило, применяются в сочетании с циклами

Пример. Можно разбить строку на массив слов и обрабатывать их, обходя последовательно или обращаясь к каждому индексу

Пример. Можно сохранить значения реквизитов как свойство структуры и передать их на клиент, где ссылочные объекты и обращения к БД недоступны

Основные классы

Универсальные коллекции в 1С (13 из 100 дней)

- Массив

- Список значения

- Структура

- Соответствие

- Таблица значений

- Дерево значений

Массив

Массивы - это множество элементов, где у каждого элемента есть порядковый номер (индекс)

- В массиве можно обратиться к элементу по его номеру

- Ключевое свойство универсальности коллекций состоит в том, что они подходят для обработки любых элементов

- Элементом может быть что угодно - даты, строки, числа, булево, ссылку или даже другие коллекции

Массив (и любая другая коллекция) сам по себе является объектом. Можно передавать массив целиком между различными участками приложения одной переменной

Универсальные коллекции в 1С (13 из 100 дней)

- Индекс указывается в квадратных скобках после имении переменной массива

Универсальные коллекции в 1С (13 из 100 дней)

- Индексация начинается с нуля. Первый элемент имеет порядковый номер ноль

- Массив создается при помощи конструктора "Новый"

Универсальные коллекции в 1С (13 из 100 дней)

Давайте рассмотрим на практике:

1. Создадим новую обработку (УниверсальныеКоллекции) и команду "РаботаСМассивами"

2. Пропишем следующий код (Установим длину массива, вложем в него элементы, а также выведем информацию о дне недели по текущей дате)

Универсальные коллекции в 1С (13 из 100 дней)

3. Запустим наш алгоритм и увидим, что все выводит корректно (В моем случае сегодня пятница)

Универсальные коллекции в 1С (13 из 100 дней)

Наполнение массива

- Заранее указывать размер массива необязательно

- Если число элементов неизвестно, создаем пустой массив и наполняем его методом "Добавить()"

Универсальные коллекции в 1С (13 из 100 дней)

- Если необходимо вставить какой-то элемент в массив используем метод "Вставить()"

Универсальные коллекции в 1С (13 из 100 дней)

Давайте рассмотрим на практике:

1. Пропишем похожий код только длинна массива изначально неизвестна

Универсальные коллекции в 1С (13 из 100 дней)

2. При запуске увидим точно такой же результат

3. Допустим мы пропустили какой-то элемент и хотим его вставить в середине массива, тогда пропишем следующее

Универсальные коллекции в 1С (13 из 100 дней)

4. Запустим и увидим, что элемент вставился в наш массив и встал на индекс [3]

Универсальные коллекции в 1С (13 из 100 дней)

Совсем необязательно, что у нас в массиве будет лежать только "Строка", может быть и другие виды данных (Дата, Число и т.д.) вместе со "Строкой":

Универсальные коллекции в 1С (13 из 100 дней)

И это важно запомнить, ведь встроенный язык 1С это поддерживает, а, например, Java может содержать в массиве только один тип элементов.

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

- Удалить элементы из массива можно методом "Удалить()"

- Рекомендуется удалять элементы с конца массива, так как при каждом удалении его длина уменьшается и граница цикла, пробегающего по массиву, может стать длиннее, чем весь массив

Пример удаление пустых элементов массива

Универсальные коллекции в 1С (13 из 100 дней)

Давайте разберем пример неправильного удаление элемента из массива:

1. Добавим числа в наших массив (Мы хотим, чтобы массив содержал только дни недели)

Универсальные коллекции в 1С (13 из 100 дней)

2. Узнаем максимальный индекс массива с помощью метода ".ВГраница()"

Универсальные коллекции в 1С (13 из 100 дней)

3. Пропишем цикл прохода по массиву

Универсальные коллекции в 1С (13 из 100 дней)

4. Запустим алгоритм и увидим, что элементы удалились, но длина массива, как была 10, так и осталась

Универсальные коллекции в 1С (13 из 100 дней)

5. Дойдя до конца увидим следующую ошибку

Универсальные коллекции в 1С (13 из 100 дней)

Такой подход череват пропуском некоторых элементов в массиве и выход за границу массива

- При удалении элементов с конца уменьшение верхней границы компенсируется тем, что мы уже прошли участок, который сокращается, и не выйдем за пределы массива

- Эффект достигается за счет разности ИсходнаяГраница - Сч

Посмотрим на нашем примере:

1. Создадим дополнительную переменную, позволяющая пройти нам с конца массива до его начала и удалять элементы с конца

Универсальные коллекции в 1С (13 из 100 дней)

2. Запустим наш массив и увидим, что все работает корректно

Универсальные коллекции в 1С (13 из 100 дней)

Мы удалили все элементы массива чисел, прошли весь массив и не вышли за границу

Списки значений

- Список значений содержит значения, их представления, пометки и картинки

Универсальные коллекции в 1С (13 из 100 дней)

- Может автоматически выводиться пользователю:

1. Таблицей формы

2. Подменю или списком выбора

В основном списки значений применяются в пользовательских интерфейсах, когда надо отметить значения флажком или представить их в виде нестандартного текста

- Список значений содержит нестандартное меню выбора

- Заданы текстовые представления для значений

Обработка списка значений

- У списков значений есть ряд методов для удобства обработки

- Например, сортировка значений методом "СортироватьПоЗначению", которого нет у массива

Универсальные коллекции в 1С (13 из 100 дней)

Список содержит элементы особого типа "ЭлементСпискаЗначений"

К самим значениям можно обратиться как к свойству Значение через точку: .Представление, .Пометка, .Картинка

Универсальные коллекции в 1С (13 из 100 дней)

Давайте рассмотрим на практике:

1. Создадим в форме новый объект "СписокПраздников" и выберем тип "Список значений", попутно разместив его на форме

Универсальные коллекции в 1С (13 из 100 дней)

2. Также перенесем поле "Пометка" на форму

Универсальные коллекции в 1С (13 из 100 дней)

3. В свойствах формы создадим событие "ПриОткрытии", оно позволит нам заполнить все поле значений при открытии

Универсальные коллекции в 1С (13 из 100 дней)

4. Пропишем следующий код в этой обработке

Универсальные коллекции в 1С (13 из 100 дней)

5. Создадим команду "ВывестиПраздникиВыбранныеПользователем" и пропишем следующий код (Как раз внесенная нами поле "Пометка" позволит нам выводить выбранные праздники)

Универсальные коллекции в 1С (13 из 100 дней)

6. Запустим платформу и увидим, что все выводится корректно

Универсальные коллекции в 1С (13 из 100 дней)

Давайте также рассмотрим популярные команду (Установить все флажки, Снять все флажки и Инвертировать все флажки):

1. Создадим три команду с соответствующими названиями и для них реализуем обработки

2. Внесем их на форму и зададим отображение только через картинки

Универсальные коллекции в 1С (13 из 100 дней)

3. Пропишем для каждой обработки следующий код

Универсальные коллекции в 1С (13 из 100 дней)

4. Запустим платформу и увидим, что все работает корректно

Универсальные коллекции в 1С (13 из 100 дней)

Структуры

Структура - это одно составное значение с разными свойствами. Хранит именованные элементы, как правило, разнородные

Примеры:

Универсальные коллекции в 1С (13 из 100 дней)

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

- Имя - строка

- Email - строка

- АдминистративныйДоступ - булево

- ДатаПоследнегоВхода - дата

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

- Сама по себе структура является коллекцией, но именно как коллекцию для обхода в цикле её используют редко

- Структуры применяют, когда надо сохранить много разных переменных в один объект и пользоваться им как единым целым

- Элементы структуры называются свойствами и имеют имена, подчиняющиеся тем же правилам, что и имена переменных

Создание структуры

Структуры создаются при помощи конструктора "Новый"

Универсальные коллекции в 1С (13 из 100 дней)

Давайте рассмотрим на примере:

1. Создадим в нашей же форме новую команду "РаботаСоСтруктурами" и заполним её в коде

Универсальные коллекции в 1С (13 из 100 дней)

2. Запустим откладку и увидим, что в нашу структуры внеслись различные данные

Универсальные коллекции в 1С (13 из 100 дней)

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

Универсальные коллекции в 1С (13 из 100 дней)

Элементы структуры

Структура - это вид коллекции, поэтому для неё тоже работает цикл "Для Каждого Из"

Универсальные коллекции в 1С (13 из 100 дней)

Элементы структуры - это значение особого типа КлючИЗначение со свойствами Ключ и Значение:

- Ключ - имя свойства структуры

- Значение - значение этого свойства

Массив структур

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

Универсальные коллекции в 1С (13 из 100 дней)

Соответствия

Соответствие - это инструмент для быстрого поиска и сопоставления одних объектов с другими: поиска дубликатов, сопоставления коллекций и т.д.

Универсальные коллекции в 1С (13 из 100 дней)

- Элементами соответствия, так же, как и элементами структуры, являются объекты типа КлючИЗначение

- В качестве ключа выступает не имя переменной, а вообще любое значение

- Соответствие определяет соответствие одного объекта к другому

Главная особенность соответствия - быстрый поиск по ключу

- Поиск по ключу будет очень быстрым, даже если соответствие состоит из миллиона элементов

Обращение к элементам соответствия

Универсальные коллекции в 1С (13 из 100 дней)

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

Однако чаще используются специальные методы соответствий, упрощающие чтение кода

Особенность соответствия: если попытаться установить значение для уже существующего ключа, то оно будет перезаписано.

На этом можно построить алгоритм поиска дубликатов

Универсальные коллекции в 1С (13 из 100 дней)

Давайте рассмотрим все на примере:

1. Создадим новую команду "РаботаССоответствием"

2. Пропишем следующий код и увидим, как работает алгоритм

Универсальные коллекции в 1С (13 из 100 дней)

Хорошо, как работает соответствие мы поняли, а теперь давайте рассмотрим хрестоматийный пример работы с соответствием - поиск дублей:

1. В нашей же обработке пропишем следующий код для поиска дублей

Универсальные коллекции в 1С (13 из 100 дней)

Переменная "Повтор" пытается получить ключ от числа в соответствии (На первый ход ключ ещё в состоянии "неопределённо", мы записываем наше число в соответствие и идем дальше). Если нам попадается дубликат числа, то переменная "Повтор" определяется и выполняется "Иначе", где к значению добавляется повтор

2. Запустив код, мы увидим, что нашлось несколько дублей

Универсальные коллекции в 1С (13 из 100 дней)

Таблицы значений

Таблица значений - это коллекция строк с определенным составом колонок

Универсальные коллекции в 1С (13 из 100 дней)

- К колонкам обращаются через точку, как к свойству строки

- К именам колонок предъявляются те же требования, что к именам переменных и ключам структур

Больше всего ТаблицаЗначений похожа на массив структур:

- К строкам можно обратиться по числовому индексу в квадратных скобках

- Полученное значение ведет себя, как структура - набор переменных, доступных через точку

- Есть дополнительные функции, такие как поиск, свертка, сортировка и т.д.

Создание таблицы значений

Само создание таблицы начинается с наполнения её колонок - структуры будущих записей

После того как колонки созданы, можно переходить к наполнению таблицы данными

- В таблицах используем метод "Добавить()", который возвращает специальный объект СтрокаТаблицыЗначений

Универсальные коллекции в 1С (13 из 100 дней)

- Строку таблицы мы наполняем, обращаясь к свойствам через точку

Давайте рассмотрим на практике

1. Создадим команду "РаботаСТаблицамиЗначений" (Стоит учитывать, что на стороне клиента мы не можем напрямую работать с таблицами значений, поэтому нужно реализовать работу через сервер)

2. Создадим дополнительную процедуру "РаботаСТаблицамиЗначенийНаСервере" и пропишем следующий код, позволяющий создать колонки (Наша таблица пуста пока что)

Универсальные коллекции в 1С (13 из 100 дней)

3. Заполним таблицу строками

Универсальные коллекции в 1С (13 из 100 дней)

4. Запустим отладку

Универсальные коллекции в 1С (13 из 100 дней)

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

- Строку таблицы можно получить по её числовому индексу, как из массива

- Кроме того, строку можно искать методом Найти()

- Можно найти несколько строк методом НайтиСтроки()

- Таблица доступа для перебора циклом Для каждого

Рассмотрим все способы получения

1. Поиск по индексу (Выведет нам нужную строку в указанном индексе)

Универсальные коллекции в 1С (13 из 100 дней)

2. Поиск через метод "Найти()" (Выведет нам первую подходящую строку

Универсальные коллекции в 1С (13 из 100 дней)

3. Поиск через метод "НайтиСтроки()" (Важно, что нужно создать структуру, где ключом выступает - имя колонки, а поиск - строка. Выведется все строки нужной категории)

Универсальные коллекции в 1С (13 из 100 дней)

4. Поиск через цикл "ДляКаждого"

Универсальные коллекции в 1С (13 из 100 дней)

Сортировка таблиц

Данные в таблице можно отсортировать по нескольким колонкам

Универсальные коллекции в 1С (13 из 100 дней)

- Доступна сортировка в разном порядке возрастания или убывания

Попробуем в нашей таблице отсортировать строки по возрастанию суммы через метод "Сортировать ( "Имя_Колонки Возр/Убыв" )":

Универсальные коллекции в 1С (13 из 100 дней)

Свёртка таблиц

- Данные в таблице можно агрегировать (Свернуть) по набору полей

- Свертка работает для одинаковых значений полей

Универсальные коллекции в 1С (13 из 100 дней)

Давайте в нашей таблице воспользуемся сверткой

1. Пропишем следующий код, который должен нам вернуть таблицу с общим количеством и общей суммой категории "Обувь"

Универсальные коллекции в 1С (13 из 100 дней)

2. Как видим, что все вывелось четко

Универсальные коллекции в 1С (13 из 100 дней)

Деревья значений

Дерево значений - это такая же таблица значений, но каждая строка в нем может иметь точно такую же коллекцию подчиненных строк

Универсальные коллекции в 1С (13 из 100 дней)

Наполнение дерева значений

- Все коллекции строк доступны через свойство "Строки"

- Дерево значений наполняется строками с помощью свойства "Строки", которое содержит коллекцию дочерних строк

- В остальном дерево значений - это таблица значений с колонками, работа с ним осуществляется аналогичным образом, с минимум исключений

Посмотрим на практике:

1. Создадим команду "РаботаСДеревомЗначений" (Оно также, как и таблица значений работает только через сервер)

2. Создадим новое дерево и заполним его строками и дочерними строками

Универсальные коллекции в 1С (13 из 100 дней)

3. Запустим откладку и увидим, что есть родительские строки и дочерние

Универсальные коллекции в 1С (13 из 100 дней)

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

Встретимся с вами уже скоро с объектами платформы

1