1С 8.3 Копия массива - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

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;

   КонецЦикла;

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

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

// 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:

// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
0
комментарии
____________________
Copyright©, «Программист 1С в г.Минске», 15.09.2024
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Яндекс.Метрика
Защищенное соединение ssl
visa
mastercard
Maestro
Яндекс деньги
Назад к содержимому