1С 8.3 Копия массива
Данные > Примеры кода 1С > 1С 8.3 Массив
Перейти в раздел примеры кода 1С 8.3:
Возвращает копию массива с указанием числа элементов и начального индекса.
В коде есть две реализации метода:
- КопияМассиваНаполнением - Создает пустой массив и наполняет его циклом из оригинала.
- КопияМассиваУдалениемЛишних - Создает полную копию и удаления лишние элементы.
КопияМассиваНаполнением и КопияМассиваУдалениемЛишних в 1С 8.3:
// Возвращает копию массива с указанием числа элементов и начального индекса
// Внутри есть определение метода копирования
// Источник: 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;
КонецЦикла;
Возврат КопияМассива;
КонецФункции
// Внутри есть определение метода копирования
// Источник: 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;
КонецЦикла;
Возврат КопияМассива;
КонецФункции
// MIT License
// Copyright (c) 2024 SeiOkami
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files
// (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// Copyright (c) 2024 SeiOkami
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files
// (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
0
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник