Содержание
- Создание массива
- Добавление элементов
- Разные количества
- Получение данных
- Редактирование данных
- Удаление элементов
- Работа с массивом
Не хочу утомлять долгими предисловиями, сразу к делу.
Существует 3 способа объявить новый массив.
Массив = Новый Массив;
Это самый распространенный способ создания простого пустого массива.
Далее, создание массива по количеству элементов:
Массив = Новый Массив(3);
Создает новый массив и добавляет в него 3 элемента "Неопределено"
Есть "грязный хак", которым не стоит пользоваться, но надо знать о его существовании. Переданное значение в конструктор будет приведено к числу насильно:
Массив = Новый Массив("5");
Массив = Новый Массив(Истина);
Конструкции типа:
Массив = Новый Массив(0);
Массив = Новый Массив(Ложь);
Вызовут исключение "Ошибка при вызове конструктора (Массив)"
Также можно создать многомерный массив из конструктора:
Массив = Новый Массив(2, 3, 4);
Такая конструкция создаст массив с 2 элементами, которые в свою очередь будут массивами с 3 элементами внутри, которые в свою очередь будут массивами с 4 элементами "Неопределено"
Ну и массив можно создать на основании фиксированного массива, но об этом чуть позже.
Как можно добавлять элементы в массив.
Массив = Новый Массив;
Массив.Добавить("Какой-то элемент №0");
Массив.Добавить("Какой-то элемент №1");
Массив.Добавить("Какой-то элемент №2");
Массив.Добавить("Какой-то элемент №3");
Массив.Добавить("Какой-то элемент №4");
Самый распространенный способ - это вызвать метод массива "Добавить". Код, приведенный выше, добавит 5 элементов в массив. Обратите внимание, что индексы массива начинаются с 0. А это значит, что при выполнении кода выше, количество элементов будет 5, а максимальный индекс - 4.
Массив = Новый Массив;
Массив.Вставить(3, "Какой-то элемент №0");
Массив.Вставить(7, "Какой-то элемент №1");
Метод массива "Вставить" добавляет элемент по указанному индексу. Код выше инициирует пустой массив и вставляет по индексам 3 и 7 два элемента. Но в пустом массиве нет никаких элементов по указанным индексам. На этот случай платформа делает так
Она просто создает элементы до указанного индекса, заполняя пустые элементы значением "Неопределено". Если мы попытаемся вставить в этот массив какое-то значение по индексу 5:
Массив = Новый Массив;
Массив.Вставить(3, "Какой-то элемент №0");
Массив.Вставить(7, "Какой-то элемент №1");
Массив.Вставить(5, "Какой-то элемент №2");
То платформа не установит в указанный индекс значение, а сдвинет его. То есть значение по индексу 5 перейдет на 6, и т.д. Давайте попробуем вставить значение по индексу 8:
Массив = Новый Массив;
Массив.Вставить(3, "Какой-то элемент №0");
Массив.Вставить(7, "Какой-то элемент №1");
Массив.Вставить(5, "Какой-то элемент №2");
Массив.Вставить(8, "Какой-то элемент №3");
Как видно из скрина, "Какой-то элемент №1" переехал на строку с индексом 9, а его место заняло то значение, которое мы вставили.
Так же мы можем не указывать значение, которое хотим вставить:
Массив = Новый Массив;
Массив.Вставить(3, "Какой-то элемент №0");
Массив.Вставить(7, "Какой-то элемент №1");
Массив.Вставить(5, "Какой-то элемент №2");
Массив.Вставить(8, "Какой-то элемент №3");
Массив.Вставить(10);
И получим новый элемент массива со значением "Неопределено"
И конечно, тут тоже можно устроить вакханалию с приведением типа значения, передаваемого в индекс, к числу:
Массив = Новый Массив;
Массив.Вставить(Ложь, "Ложь");
Массив.Вставить(Истина, "Истина");
Массив.Вставить("2", "2");
Теперь поработаем с числами
Для примера будем брать массив
Посчитаем количество элементов, для этого вызовем метод:
Массив.Количество();
В ответ нам возвращается число с количеством элементов. А как узнать самый большой индекс в массиве? Поскольку количество считаем мы от 1, а индекс идет от 0, многим кажется хорошим решением вызвать такую конструкцию:
Массив.Количество() - 1;
Но разработчики платформы любезно предоставили нам метод:
Массив.ВГраница();
Попробуем получить данные из массива.
Обход массива в цикле оставим на десерт, а сейчас глянем на методы массива.
Для примера возьмем массив
В конец массива мы добавили такое же значение, что и по индексу 3
Итак, попробуем найти значение "Какой-то элемент №3":
Массив.Найти("Какой-то элемент №3");
Массив не сообщает нам о том, что у него есть 2 одинаковых элемента, он просто отдает индекс первого попавшегося от начала массива
Если мы ищем значение, которого в массиве нет:
Массив.Найти("Какой-то элемент №10")
То получим значение "Неопределено"
Если нам известен индекс, и мы хотим получить значение, можно вызвать:
Массив.Получить(2);
Если мы попытаемся передать сюда индекс, которого нет в массиве, получим исключение "Ошибка при вызове метода контекста (Получить)"
Так же мы можем получить элемент массива по индексу, используя конструкцию:
Массив[4]
В случае, если мы передадим индекс, которого в массиве нет, получим ошибку "Индекс находится за границами массива"
Ну и по классике, такой говнокод будет работать
Массив.Получить(Истина);
Массив.Получить(Ложь);
Массив.Получить("2");
А вот с квадратными скобками такой финт не прокатит, и вы получите исключение
Теперь попробуем заменить какой-нибудь элемент массива. Для примера опять же возьмем массив
И вызовем метод
Массив.Установить(3, "Какой-то новый элемент №3");
Этот метод не будет двигать строки массива, он просто подменит элемент по указанному индексу на тот, что вы передали
Все приколы с передачей значения индекса в виде булева или строки сохранены. Наверное, чтобы код в проде был надежнее.
Ну и чтобы не заморачиваться с запоминанием метода, можно использовать квадратные скобки
Массив[3] = "Какой-то новый элемент №3";
Такой код тоже будет работать.
Метод:
Массив.Очистить();
не принимает никаких параметров, а просто удаляет все элементы из массива.
Последний метод массива говорит об удалении элементов. Для экспериментов возьмем массив
И вызовем метод
Массив.Удалить(2);
И увидим, что элемента действительно в массиве больше нет
То есть индекс 2 остался, но строки массива после индекса 1 сдвинулись на одну назад, чтобы не было пустот после удаления
Теперь немного про обход массива в цикле.
Мы можем обойти массив по элементам:
Для Каждого Элемент Из Массив Цикл
// тут что-то делаем с элементом
КонецЦикла;
Тогда в переменную попадает сам элемент, не строка с массивом, а именно элемент со всеми оттуда вытекающими. То есть, имея массив документов, можно сделать так:
Для Каждого Документ Из МассивДокументов Цикл
Документ.Записать();
КонецЦикла;
Еще мы можем обойти массив по индексам
Для Индекс = 0 По Массив.ВГраница() Цикл
Массив[Индекс] // тут что-то делаем с элементом массива
Массив.Получить(Индекс) // тут тоже что-то делаем с элементом массива
Массив.Получить(Строка(Индекс)) // и тут тоже что-то можно делать с элементом, но лучше не стоит
КонецЦикла;
// Кстати, есть более распространенный обход, он странный, но почему-то все используют именно его.
// Наверное потому, что программистам нравятся математические выражения
Для Счет = 0 По Массив.Количество() - 1 Цикл
Массив[Счет] // тут что-то делаем с элементом массива
КонецЦикла
Мы можем обойти цикл с конца
Для Индекс = 0 По Массив.ВГраница() Цикл
Массив[Массив.ВГраница() - Индекс] // тут что-то делаем с элементом массива
КонецЦикла;
// Добавил SerVer1C
Для Индекс = -Массив.ВГраница() По 0 Цикл
Массив[-Индекс] // тут что-то делаем с элементом массива
КонецЦикла;
Но, при обходе массива в цикле, не советую изменять массив методами, меняющими количество элементов массива. Давайте попробуем в нашем массиве для примера заменить все значения, а элемент по индексу 3 удалить.
Массив = Новый Массив;
Массив.Добавить("Какой-то элемент №0");
Массив.Добавить("Какой-то элемент №1");
Массив.Добавить("Какой-то элемент №2");
Массив.Добавить("Какой-то элемент №3");
Массив.Добавить("Какой-то элемент №4");
Для Индекс = 0 По Массив.ВГраница() Цикл
Если Индекс = 3 Тогда
Массив.Удалить(Индекс);
КонецЕсли;
Массив[Индекс] = СтрЗаменить(Массив[Индекс], "элемент", "новый элемент");
КонецЦикла;
Выполнение этого кода вызовет исключение потому, что вы обходите массив до индекса 4, но в моменте удаляете элемент с индексом 3, а значит элемент с индексом 4 сдвигается на 1 строку назад, и при попытке изменить элемент по индексу 4, вы получите что-то типа "Индекс находится за границами массива". Все изменения, связанные с изменением количества элементов массива, надо сделать вне цикла (то есть до или после);
Для адекватного удаления элементов массива в цикле по условию, нужно обходить массив в обратном порядке. Вариант шаблона zqzq:
Для Индекс = 1 - <?"Коллекция">.Количество() По 0 Цикл
<?"Элемент коллекции"> = <?"Коллекция">[-Индекс];
Если <?> Тогда
<?"Коллекция">.Удалить(<?"Элемент коллекции">);
КонецЕсли;
КонецЦикла;
Вы можете удалить нежелательные элементы из массива в цикле
Массив = Новый Массив;
Массив.Вставить(4, "Какой-то элемент №4");
Массив.Вставить(7, "Какой-то элемент №7");
// как вы помните, элементы по индексам 0,1,2,3,5,6 будут со значением "Неопределено". Удалим их все.
Пока Массив.Найти(Неопределено) <> Неопределено Цикл
Элемент = Массив.Найти(Неопределено);
Массив.Удалить(Элемент);
КонецЦикла;
Теперь попробуем удалить дубли из массива
Массив = Новый Массив;
Массив.Добавить("Какой-то элемент №0");
Массив.Добавить("Какой-то элемент №4");
Массив.Добавить("Какой-то элемент №1");
Массив.Добавить("Какой-то элемент №4");
Массив.Добавить("Какой-то элемент №2");
Массив.Добавить("Какой-то элемент №4");
Массив.Добавить("Какой-то элемент №3");
Массив.Добавить("Какой-то элемент №4");
НовыйМассив = Новый Массив;
Для Каждого Элемент Из Массив Цикл
Если НовыйМассив.Найти(Элемент) = Неопределено Тогда
НовыйМассив.Добавить(Элемент);
КонецЕсли;
КонецЦикла;
Сортировки пузырьками, шейкерами и прочими интересными предметами рассматривать не будем, там уже не про функционал массива, а про знания алгоритмов, которыми 1С-ники пользуются чуть чаще, чем никогда.
Ну и на финал немного про фиксированный массив. Фиксированный массив, это такой массив, в котором нет методов "Вставить", "Добавить", "Очистить", "Удалить" и "Установить". Но если в массив нельзя добавить элемент, как его наполнить? Вся соль в том, что он создается на основании обычного массива
Массив = Новый Массив;
Массив.Добавить("Какой-то элемент №0");
Массив.Добавить("Какой-то элемент №1");
Массив.Добавить("Какой-то элемент №2");
Массив.Добавить("Какой-то элемент №3");
Массив.Добавить("Какой-то элемент №4");
ФиксированныйМассив = Новый ФиксированныйМассив(Массив);
Все, теперь при изменении такого массива вы будете ловить исключения. Если же вам очень нужно в таком массиве что-то изменить, вы можете создать обычный массив на основании фиксированного
Массив = Новый Массив;
Массив.Добавить("Какой-то элемент №0");
Массив.Добавить("Какой-то элемент №1");
Массив.Добавить("Какой-то элемент №2");
Массив.Добавить("Какой-то элемент №3");
Массив.Добавить("Какой-то элемент №4");
ФиксированныйМассив = Новый ФиксированныйМассив(Массив);
НовыйМассив = Новый Массив(ФиксированныйМассив);
И все, теперь у вас есть обычный массив, имеющий те же данные, что в фиксированном, но с возможностью изменения.
Если я упустил еще какие-то интересные моменты, связанные с массивами, дополняйте, буду расширять статью цитатами из комментариев.
А так же смотрите другие мои публикации
Генерация штрихкода и QR, разбор настроек и примеры