Примеры работы с коллекциями в 1С 8.x Массивы
Объекты состоящие из нескольких однотипных элементов, такие как Массив, Структура, Список значений, Таблица значений, Соответствие, используются в программах 1С повсеместно. Рассмотрим основные приемы работы с такими объектами, по другому их можно назвать "коллекциями".
Массивы
Процедура ПримерМассивы() Экспорт
//создание массива
МойМассив = Новый Массив();
//добавление элемента в массив
МойМассив.Добавить("Иванов");
МойМассив.Добавить("Петров");
//удаление элемента из массива
МойМассив.Удалить(0); //0-индекс элемента
//добавление элемента на первое место в коллекции
МойМассив.Вставить(0, "Сидоров");
//установка значения во второй элемент
МойМассив.Установить(1, "Зубарев");
МойМассив[1] = "Зубарев"; //еще один вариант
//перебор массива с выводом на экран
Для Каждого ЗначениеЭлемента Из МойМассив Цикл
Сообщить(ЗначениеЭлемента); //Сидоров, Зубарев...
КонецЦикла;
//перебор массива по индексам
Для Сч = 0 По МойМассив.Количество()-1 Цикл
Сообщить(МойМассив[Сч]); //Сидоров, Зубарев...
КонецЦикла;
//копирование массива
МойМассивВторой = Новый Массив();
Для Каждого ЗначениеЭлемента Из МойМассив Цикл
МойМассивВторой.Добавить(ЗначениеЭлемента);
КонецЦикла;
//количество элементов массива (последний индекс меньше на 1 от количества)
ВсегоЭлементов = МойМассив.Количество();
ПоследнийИндекс = МойМассив.Количество() - 1;
ПоследнийИндекс = МойМассив.ВГраница(); //еще один вариант наибольшего индекса массива
//получить последний элемент, это элемент с индексом <ВсегоЭлементов-1>
ЗначениеПоследнегоЭлемента = МойМассив[ПоследнийИндекс];
Сообщить("Последний "+ЗначениеПоследнегоЭлемента);
//получить первый элемент, это элемент с индексом 0
ЗначениеПервогоЭлемента = МойМассив[0];
Сообщить("Первый "+ЗначениеПервогоЭлемента);
//сортировать массив
//метода сортировать нет у массива, можно воспользоваться другой коллекцией которая это умеет (список значений или таблица значений)
СписокЗначенийМой = Новый СписокЗначений();
СписокЗначенийМой.ЗагрузитьЗначения(МойМассив);
СписокЗначенийМой.СортироватьПоЗначению();
МойМассив = СписокЗначенийМой.ВыгрузитьЗначения();
//многомерный массив (элементы массива являются массивами)
МногоМерныйМассив = Новый Массив(2,3);
МногоМерныйМассив[0][0] = 11;
МногоМерныйМассив[0][1] = 12;
МногоМерныйМассив[0][2] = 13;
МногоМерныйМассив[1][0] = 120;
МногоМерныйМассив[1][1] = 122;
МногоМерныйМассив[1][2] = 124;
//перебор элементов многомерного массива
Для Каждого Эл Из МногоМерныйМассив Цикл
Для Каждого Эл2 Из Эл Цикл
Сообщить(Эл2); //11,12,13,120,122,124
КонецЦикла;
КонецЦикла;
//получение массива из колонки таблицы значений
ТЗ = Новый ТаблицаЗначений();
ТЗ.Колонки.Добавить("Фамилия");
НоваяСтрокаТЗ = ТЗ.Добавить();
НоваяСтрокаТЗ.Фамилия = "Уткин";
НоваяСтрокаТЗ = ТЗ.Добавить();
НоваяСтрокаТЗ.Фамилия = "Жучкин";
МойМассивТретий = ТЗ.ВыгрузитьКолонку("Фамилия");
Для Каждого ЗначениеЭлемента Из МойМассивТретий Цикл
МойМассивВторой.Добавить(ЗначениеЭлемента); //Уткин, Жучкин
КонецЦикла;
//фиксированный массив, элементы неизменны
МойФиксированныйМассив = Новый ФиксированныйМассив(МойМассивТретий);
Сообщить("Фиксированный массив: "+ЗначениеВСтрокуВнутр(МойФиксированныйМассив));
//поиск в массиве
Индекс = МойМассивТретий.Найти("Жучкин"); //от 0 до ВГраница, если не найден то Неопределено
Если Индекс = Неопределено Тогда
Сообщить("Такого значения нет в массиве!");
КонецЕсли;
//сравнение массивов
Если МойМассив.Количество() <> МойМассивТретий.Количество() Тогда
Сообщить("Массивы не равны!");
Иначе
Для Сч = 0 По МойМассив.Количество()-1 Цикл
Если МойМассив[Сч] <> МойМассивТретий[Сч] Тогда
Сообщить("Массивы не равны в элементе "+Сч+"!");
КонецЕсли
КонецЦикла;
КонецЕсли;
//очистка массива
МойМассив.Очистить();
//получение массива из строки с разделителями
МойМассив = РазложитьСтрокуВМассивПодстрок("Сухарев,Романов,Шмаков"); //в типовых конфигурациях эта функция есть в одном из общих модулей
Для Каждого ЗначениеЭлемента Из МойМассив Цикл
Сообщить(ЗначениеЭлемента); //Сухарев, Романов...
КонецЦикла;
КонецПроцедуры
Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт
МассивСтрок = Новый Массив();
Если Разделитель = " " Тогда
Стр = СокрЛП(Стр);
Пока Истина Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
МассивСтрок.Добавить(Лев(Стр,Поз-1));
Стр = СокрЛ(Сред(Стр,Поз));
КонецЦикла;
Иначе
ДлинаРазделителя = СтрДлина(Разделитель);
Пока Истина Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
МассивСтрок.Добавить(Лев(Стр,Поз-1));
Стр = Сред(Стр,Поз+ДлинаРазделителя);
КонецЦикла;
КонецЕсли;
КонецФункции
Если выполнить процедуру ПримерМассивы(), то результат в окне сообщений будет выглядеть следующим образом: