Массив — это коллекция элементов. Элементы массива могут быть разного типа.1С предоставляет класс Массив для работы с массивами. Массив можно передавать с клиента на сервер и обратно. В основном массивы используются для работы с временными наборами данных.
- Создание массива
- Индекс массива
- Перебор массива
- Основные методы для работы с массивами
- Многомерные массивы
- Примеры работы с массивами
- Как добавить элементы в массив
- Как изменить значение элемента массива
- Как узнать сколько элементов в массиве
- Как узнать максимальный индекс массива
- Как удалить все элементы из массива
- Как найти значение в массиве
- Сортировка массива
- Сортировка выбором
- Сортировка пузырьком
- Быстрая сортировка
- Фиксированный массив
- Правильное удаление элементов из середины массива
Создание массива
Для создания массива в 1С используется ключевое слово Новый после которого указывается имя класса.
1 |
Массив = Новый Массив; //в массиве 0 элементов |
В переменной Массив будет находиться массив.
В конструкторе массива можно указать количество элементов:
1 |
Массив = Новый Массив(5); //в массиве 5 элементов |
Сразу после создания все элементы массива будут равны Неопределено. При этом размер массива может быть изменен, при добавлении в него новых элементов.
Для добавления элементов используется метод Добавить():
1 2 3 4 |
Массив = Новый Массив; Массив.Добавить("Строка"); Массив.Добавить(2); Массив.Добавить(Истина); |
Индекс массива
Чтобы обратиться к элементам массива можно использовать индексы. Индекс — это номер элемента в массиве. Нумерация элементов начинается с 0. Чтобы обратиться к первому элементу нужно использовать индекс 0, а чтобы обратиться к пятому элементу — индекс 4. При этом, если мы обратимся к несуществующему элементу массива, то будет ошибка «Индекс находится за границами массива».
1 2 3 4 5 6 7 8 |
Массив = Новый Массив; Массив.Добавить("Строка"); Массив.Добавить(2); Массив.Добавить(Истина); Массив[0] = "НоваяСтрока"; Массив[2] = 12; Массив[5] = 10; //так нельзя, будет ошибка |
Перебор массива
С помощью цикла Для Каждого:
1 2 3 4 5 6 7 8 |
МассивЗначений = Новый Массив; МассивЗначений.Добавить("Строка"); МассивЗначений.Добавить(2); МассивЗначений.Добавить(Истина); Для Каждого ЭлементМассива Из МассивЗначений Цикл //метод Сообщить() выводит сообщение на экран Сообщить(ЭлементМассива); КонецЦикла; |
Через цикл Для Каждого нельзя изменить значения массива, меняться будет переменная ЭлементМассива.
Перебрать массив можно и через цикл Для. В этом случае через индекс можно изменять значения массива:
1 2 3 4 5 6 7 8 9 |
МассивЗначений = Новый Массив; МассивЗначений.Добавить("Строка"); МассивЗначений.Добавить(2); МассивЗначений.Добавить(Истина); //метод ВГраница() возвращает максимальный индекс массива Для Сч = 0 По МассивЗначений.ВГраница() Цикл ЭлементМассива[Сч] = 1; КонецЦикла; |
Основные методы для работы с массивами
- Добавить(<Значение>) — добавляет значение в конец массива, количество элементов увеличивается на 1.
- Вставить(<Индекс>, <Значение>) — вставляет значение в массив в элемент с индексом <Индекс>, если индекс больше чем количество элементов, то массив будет дополнен нужным количеством элементов со значением Неопределено.
- Установить(<Индекс>, <Значение>) — устанавливает значение в массив в элемент с индексом <Индекс>, можно так: Массив[0] = «Первый»;
- Количество() — вернет количество элементов в массиве.
- ВГраница() — вернет максимальный индекс в массиве, если в массиве 0 элементов, то вернет -1. Равен Количество() — 1
- Получить(<Индекс>) — получает значение по индексу, можно так: Значение = Массив[0];
- Удалить(<Индекс>) — удаляет значение по индексу.
- Очистить() — удаляет все элементы из массива.
- Найти(<Значение>) — поиск в массиве, если найдено то вернется индекс элемента, иначе Неопределено. При поиске элемента в массиве будет выполняться перебор всех элементов массива, поэтому время поиска пропорционально размеру массива (чем больше элементов, тем медленнее ищет)
Многомерные массивы
Многомерный массив в 1С — это массив массивов:
1 2 3 4 5 6 7 8 9 10 11 |
МногомерныйМассив = Новый Массив(); ОдномерныйМассив = Новый Массив; ОдномерныйМассив.Добавить(1); ОдномерныйМассив.Добавить(2); МногомерныйМассив.Добавить(ОдномерныйМассив); ОдномерныйМассив2 = Новый Массив; ОдномерныйМассив2.Добавить(3); ОдномерныйМассив2.Добавить(4); МногомерныйМассив.Добавить(ОдномерныйМассив2); |
В переменной МногомерныйМассив будет 2 элемента типа массив, каждый из которых содержит по 2 элемента типа число.
Через индексы можно изменять и читать значения многомерного массива:
1 2 3 4 |
МногомерныйМассив[0][0] = 1; МногомерныйМассив[0][1] = 2; Сообщить(МногомерныйМассив[0][0]); |
Через конструктор можно сразу создать многомерный массив:
1 2 |
ДвухмерныйМассив = Новый Массив(2,2); ТрехмерныйМассив = Новый Массив(3,3,3); |
Примеры работы с массивами
Как добавить элементы в массив
1 2 3 |
МассивЗначений.Добавить("Массив"); МассивЗначений.Добавить(12); МассивЗначений.Добавить(Истина); |
Как изменить значение элемента массива
1 2 3 4 |
МассивЗначений[0] = "Новый массив"; МассивЗначений[1] = МассивЗначений[1] + 1; //редко используемый вариант МассивЗначений.Установить(2, Ложь); |
Как узнать сколько элементов в массиве
1 |
Колво = МассивЗначений.Количество(); |
Как узнать максимальный индекс массива
1 |
МаксИнд = МассивЗначений.ВГраница(); |
Как удалить все элементы из массива
1 |
МассивЗначений.Очистить(); |
Как найти значение в массиве
1 2 3 4 |
Индекс = МассивЗначений.Найти(12); Если Индекс <> Неопределено Тогда МассивЗначений[Индекс] = 13; КонецЕсли; |
Сортировка массива
Сортировка выбором
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//Сортировка выбором МассивЧисел = Новый Массив; МассивЧисел.Добавить(2); МассивЧисел.Добавить(4); МассивЧисел.Добавить(1); МассивЧисел.Добавить(5); МассивЧисел.Добавить(3); ВерхняяГраница = МассивЧисел.ВГраница(); Для i = 0 По ВерхняяГраница Цикл Мин = i; Для j = i + 1 По ВерхняяГраница Цикл Если МассивЧисел[j] < МассивЧисел[Мин] Тогда Мин = j; КонецЕсли; КонецЦикла; Если Не МассивЧисел [Мин] = МассивЧисел [i] Тогда Буфер = МассивЧисел[i]; МассивЧисел[i] = МассивЧисел[Мин]; МассивЧисел[Мин] = Буфер; КонецЕсли; КонецЦикла; |
Сортировка пузырьком
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
//сортировка пузырьком МассивЧисел = Новый Массив; МассивЧисел.Добавить(2); МассивЧисел.Добавить(4); МассивЧисел.Добавить(1); МассивЧисел.Добавить(5); МассивЧисел.Добавить(3); ВерхняяГраница = МассивЧисел.ВГраница(); Для i = 0 По ВерхняяГраница Цикл Для j = 0 По ВерхняяГраница - i - 1 Цикл Если МассивЧисел[j] > МассивЧисел[j + 1] Тогда Буфер = МассивЧисел[j]; МассивЧисел[j] = МассивЧисел[j + 1]; МассивЧисел[j + 1] = Буфер; КонецЕсли; КонецЦикла; КонецЦикла; |
Быстрая сортировка
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 |
//быстрая сортировка МассивЧисел = Новый Массив; МассивЧисел.Добавить(2); МассивЧисел.Добавить(4); МассивЧисел.Добавить(1); МассивЧисел.Добавить(5); МассивЧисел.Добавить(3); БыстраяСортировка(МассивЧисел); Процедура БыстраяСортировка(МассивЧисел, Мин = Неопределено, Макс = Неопределено) Если Мин = Неопределено Тогда Мин = 0; КонецЕсли; Если Макс = Неопределено Тогда Макс = МассивЧисел.ВГраница(); КонецЕсли; i = Мин; j = Макс; m = МассивЧисел[Цел(i + j) / 2]; Пока i <= j Цикл Пока МассивЧисел[i] < m Цикл i = i + 1; КонецЦикла; Пока МассивЧисел[j] > m Цикл j = j - 1; КонецЦикла; Если i <= j Тогда Если i <> j Тогда Буфер = МассивЧисел[i]; МассивЧисел[i] = МассивЧисел[j]; МассивЧисел[j] = Буфер; КонецЕсли;; i = i + 1; j = j - 1; КонецЕсли; КонецЦикла; Если Мин < j Тогда БыстраяСортировка(МассивЧисел, Мин, j); КонецЕсли; Если i < Макс Тогда БыстраяСортировка(МассивЧисел, i, Макс); КонецЕсли; КонецПроцедуры |
Фиксированный массив
Фиксированный массив — это тот же самый массив, но у которого нельзя изменить ни количество элементов, ни значения массива. Создается 1 раз и больше не может быть изменен. Может быть создан на основании обычного массива:
1 2 3 4 5 |
ОбычныйМассив = Новый Массив; ОбычныйМассив.Добавить(1); ОбычныйМассив.Добавить(2); ФиксМассив = Новый ФиксированныйМассив(ОбычныйМассив); |
Если попытаться изменить элемент фиксированного массива, то будет ошибка «Индексированное значение доступно только для чтения».
На основании фиксированного массива можно создать обычный массив:
1 2 3 4 5 6 7 8 |
ОбычныйМассив = Новый Массив; ОбычныйМассив.Добавить(1); ОбычныйМассив.Добавить(2); ФиксМассив = Новый ФиксированныйМассив(ОбычныйМассив); СноваОбычныйМассив = Новый Массив(ФиксМассив); СноваОбычныйМассив[0] = 11; //теперь можно менять значения |
У фиксированного массива есть следующие методы:
- Количество()
- ВГраница()
- Получить(<Индекс>), можно так: Значение = Массив[0];
- Найти(<Значение>)
которые выполняют те же действия, что и у обычного массива.
Правильное удаление элементов из середины массива
При удалении элемента из середины массива, массив как бы «смыкается». Если перебирать все элементы массива в цикле и удалять по какому-то условию, то после удаления элемента, следующий элемент будет пропущен. Поэтому правильно перебирать массив с конца:
1 2 3 4 5 6 7 |
Инд = МассивЗначений.ВГраница(); Пока Инд >= 0 Цикл Если МассивЗначений[Инд]) = 5 Тогда МассивЗначений.Удалить(Инд); КонецЕсли; Инд = Инд - 1; КонецЦикла; |
Данный код удаляет из массива все элементы, которые равны 5.