Примеры работы с коллекциями в 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));
			Стр = Сред(Стр,Поз+ДлинаРазделителя);
		КонецЦикла;
	КонецЕсли;
	
КонецФункции

Если выполнить процедуру ПримерМассивы(), то результат в окне сообщений будет выглядеть следующим образом:

You have no rights to post comments