Копия массива
Теги: 1С,Массив,Желтый Чайник 1С

Возвращает копию массива с указанием числа элементов и начального индекса

В коде есть две реализации метода: 
1. КопияМассиваНаполнением - Создает пустой массив и наполняет его циклом из оригинала
2. КопияМассиваУдалениемЛишних - Создает полную копию и удаления лишние элементы

А так же метод КопияМассива, который в зависимости от числа объектов массива сам выбирает один из методов

# Код реализации

```1c
// Возвращает копию массива с указанием числа элементов и начального индекса
// Внутри есть определение метода копирования
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/150
//
// Параметры:
//  Массив - Массив из Произвольный
//  НачальныйЭлемент - Число - Индекс начального элемента
//  ЧислоЭлементов - Число - Число выбираемых элементов, 0 - все оставшиеся
//  МетодКопирования - Число - 0 - определять автоматически, 1 - наполнение циклом, 2 - удаление лишних
//
// Возвращаемое значение:
//  Массив из Произвольный
//
// Примеры:
//  ИсходныйМассив = СтрРазделить("1,2,3,4,5", ",");
//  Результат = КопияМассива(ИсходныйМассив, 1, 3); //"2,3,4"     - Три элемента с индекса 1
//  Результат = КопияМассива(ИсходныйМассив, 1);    //"2,3,4,5"   - Все элементы с индекса 1
//  Результат = КопияМассива(ИсходныйМассив, 0, 2); //"1,2"       - Первые 2 элемента
//  Результат = КопияМассива(ИсходныйМассив);       //"1,2,3,4,5" - Полная копия массива
//
Функция КопияМассива(Знач Массив, Знач НачальныйЭлемент = 0, Знач ЧислоЭлементов = 0, Знач МетодКопирования = 0) Экспорт

	ВсегоЭлементов = Массив.Количество();

	Если МетодКопирования = 0 Тогда

		//Если массив меньше, то нет принципиально разницы в скорости
		//TODO: Определить экспериментально идеальное значение
		МинимальнаяДлинаМассиваДляПоискаМетода = 10;
		Если ВсегоЭлементов > МинимальнаяДлинаМассиваДляПоискаМетода Тогда

			Если ЧислоЭлементов = 0 Тогда
				ЧислоЭлементов = ВсегоЭлементов - (НачальныйЭлемент + 1);
			КонецЕсли;

			Если ЧислоЭлементов = 0 Тогда
				Возврат Новый Массив;
			Иначе
				ПроцентНужных = (ЧислоЭлементов / ВсегоЭлементов) * 100;
				Если ПроцентНужных > 90 Тогда
					МетодКопирования = 2; //Легче скопировать весь большой массив и удалить лишние элементы
				Иначе
					МетодКопирования = 1; //Легче взять нужные элементы из большого массива
				КонецЕсли;
			КонецЕсли;

		Иначе

			МетодКопирования = 1; //Устроит любой метод

		КонецЕсли;

	КонецЕсли;

	Если МетодКопирования = 1 Тогда
		КопияМассива = КопияМассиваНаполнением(Массив, НачальныйЭлемент, ЧислоЭлементов);
	Иначе
		КопияМассива = КопияМассиваУдалениемЛишних(Массив, НачальныйЭлемент, ЧислоЭлементов);
	КонецЕсли;

	Возврат КопияМассива;

КонецФункции

// Возвращает копию массива с указанием числа элементов и начального индекса
// Создает полную копию и удаления лишние элементы
// Эффективен, когда нужно взять бОльшую часть большОго массива
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/150
//
// Параметры:
//  Массив - Массив из Произвольный
//  НачальныйЭлемент - Число - Индекс начального элемента
//  ЧислоЭлементов - Число - Число выбираемых элементов, 0 - все оставшиеся
//
// Возвращаемое значение:
//  Массив из Произвольный
//
// Примеры:
//  ИсходныйМассив = СтрРазделить("1,2,3,4,5", ",");
//  Результат = КопияМассива(ИсходныйМассив, 1, 3); //"2,3,4"     - Три элемента с индекса 1
//  Результат = КопияМассива(ИсходныйМассив, 1);    //"2,3,4,5"   - Все элементы с индекса 1
//  Результат = КопияМассива(ИсходныйМассив, 0, 2); //"1,2"       - Первые 2 элемента
//  Результат = КопияМассива(ИсходныйМассив);       //"1,2,3,4,5" - Полная копия массива
Функция КопияМассиваУдалениемЛишних(Знач Массив,
	Знач НачальныйЭлемент = 0, Знач ЧислоЭлементов = 0) Экспорт

	КопияМассива = Новый Массив(Новый ФиксированныйМассив(Массив));

	Пока НачальныйЭлемент > 0 Цикл
		КопияМассива.Удалить(0);
		НачальныйЭлемент = НачальныйЭлемент - 1;
	КонецЦикла;

	Если ЧислоЭлементов > 0 Тогда
		ЭлементовКУдалению = КопияМассива.Количество() - ЧислоЭлементов;
		Пока ЭлементовКУдалению > 0 Цикл
			КопияМассива.Удалить(КопияМассива.ВГраница());
			ЭлементовКУдалению = ЭлементовКУдалению - 1;
		КонецЦикла;
	КонецЕсли;

	Возврат КопияМассива;

КонецФункции

// Возвращает копию массива с указанием числа элементов и начального индекса
// Создает пустой массив и наполняет его циклом из оригинала
// Эффективен, когда нужно взять несколько элементов из оригинального большого массива
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/150
//
// Параметры:
//  Массив - Массив из Произвольный
//  НачальныйЭлемент - Число - Индекс начального элемента
//  ЧислоЭлементов - Число - Число выбираемых элементов, 0 - все оставшиеся
//
// Возвращаемое значение:
//  Массив из Произвольный
//
// Примеры:
//  ИсходныйМассив = СтрРазделить("1,2,3,4,5", ",");
//  Результат = КопияМассива(ИсходныйМассив, 1, 3); //"2,3,4"     - Три элемента с индекса 1
//  Результат = КопияМассива(ИсходныйМассив, 1);    //"2,3,4,5"   - Все элементы с индекса 1
//  Результат = КопияМассива(ИсходныйМассив, 0, 2); //"1,2"       - Первые 2 элемента
//  Результат = КопияМассива(ИсходныйМассив);       //"1,2,3,4,5" - Полная копия массива
Функция КопияМассиваНаполнением(Знач Массив,
	Знач НачальныйЭлемент = 0, Знач ЧислоЭлементов = 0) Экспорт

	Если ЧислоЭлементов = 0 Тогда
		ЧислоЭлементов = Массив.Количество() - НачальныйЭлемент;
	КонецЕсли;

	КопияМассива = Новый Массив(ЧислоЭлементов);

	ИндексКопии = 0;
	ИндексМассива = НачальныйЭлемент;

	Пока ИндексКопии < ЧислоЭлементов Цикл

		КопияМассива[ИндексКопии] = Массив[ИндексМассива];

		ИндексМассива = ИндексМассива + 1;
		ИндексКопии = ИндексКопии + 1;

	КонецЦикла;

	Возврат КопияМассива;

КонецФункции
```