//////////////////////////////////////////////////////////////////////////////// // Модуль: A1sAR // Назначение: // Утилиты для работы с массивами: создание, объединение, фильтрация, сортировка. // // Автор: A1sCode (a1scode.ru) // Версия: 1.2 // Дата: 2025-11-17 //////////////////////////////////////////////////////////////////////////////// Функция Of( Знач1 = Неопределено, Знач2 = Неопределено, Знач3 = Неопределено, Знач4 = Неопределено, Знач5 = Неопределено, Знач6 = Неопределено, Знач7 = Неопределено, Знач8 = Неопределено, Знач9 = Неопределено, Знач10 = Неопределено, Знач11 = Неопределено, Знач12 = Неопределено, Знач13 = Неопределено, Знач14 = Неопределено, Знач15 = Неопределено, Знач16 = Неопределено, Знач17 = Неопределено, Знач18 = Неопределено, Знач19 = Неопределено, Знач20 = Неопределено, Знач21 = Неопределено, Знач22 = Неопределено, Знач23 = Неопределено, Знач24 = Неопределено, Знач25 = Неопределено, Знач26 = Неопределено, Знач27 = Неопределено, Знач28 = Неопределено, Знач29 = Неопределено, Знач30 = Неопределено, Знач31 = Неопределено, Знач32 = Неопределено, Знач33 = Неопределено, Знач34 = Неопределено, Знач35 = Неопределено, Знач36 = Неопределено, Знач37 = Неопределено, Знач38 = Неопределено, Знач39 = Неопределено, Знач40 = Неопределено, ТолькоУникальные = Ложь ) Экспорт Массив = Новый Массив; // Заменяем ЗначениеЗаполнено на <> Неопределено Если Знач1 <> Неопределено Тогда Массив.Добавить(Знач1); КонецЕсли; Если Знач2 <> Неопределено Тогда Массив.Добавить(Знач2); КонецЕсли; Если Знач3 <> Неопределено Тогда Массив.Добавить(Знач3); КонецЕсли; Если Знач4 <> Неопределено Тогда Массив.Добавить(Знач4); КонецЕсли; Если Знач5 <> Неопределено Тогда Массив.Добавить(Знач5); КонецЕсли; Если Знач6 <> Неопределено Тогда Массив.Добавить(Знач6); КонецЕсли; Если Знач7 <> Неопределено Тогда Массив.Добавить(Знач7); КонецЕсли; Если Знач8 <> Неопределено Тогда Массив.Добавить(Знач8); КонецЕсли; Если Знач9 <> Неопределено Тогда Массив.Добавить(Знач9); КонецЕсли; Если Знач10 <> Неопределено Тогда Массив.Добавить(Знач10); КонецЕсли; Если Знач11 <> Неопределено Тогда Массив.Добавить(Знач11); КонецЕсли; Если Знач12 <> Неопределено Тогда Массив.Добавить(Знач12); КонецЕсли; Если Знач13 <> Неопределено Тогда Массив.Добавить(Знач13); КонецЕсли; Если Знач14 <> Неопределено Тогда Массив.Добавить(Знач14); КонецЕсли; Если Знач15 <> Неопределено Тогда Массив.Добавить(Знач15); КонецЕсли; Если Знач16 <> Неопределено Тогда Массив.Добавить(Знач16); КонецЕсли; Если Знач17 <> Неопределено Тогда Массив.Добавить(Знач17); КонецЕсли; Если Знач18 <> Неопределено Тогда Массив.Добавить(Знач18); КонецЕсли; Если Знач19 <> Неопределено Тогда Массив.Добавить(Знач19); КонецЕсли; Если Знач20 <> Неопределено Тогда Массив.Добавить(Знач20); КонецЕсли; Если Знач21 <> Неопределено Тогда Массив.Добавить(Знач21); КонецЕсли; Если Знач22 <> Неопределено Тогда Массив.Добавить(Знач22); КонецЕсли; Если Знач23 <> Неопределено Тогда Массив.Добавить(Знач23); КонецЕсли; Если Знач24 <> Неопределено Тогда Массив.Добавить(Знач24); КонецЕсли; Если Знач25 <> Неопределено Тогда Массив.Добавить(Знач25); КонецЕсли; Если Знач26 <> Неопределено Тогда Массив.Добавить(Знач26); КонецЕсли; Если Знач27 <> Неопределено Тогда Массив.Добавить(Знач27); КонецЕсли; Если Знач28 <> Неопределено Тогда Массив.Добавить(Знач28); КонецЕсли; Если Знач29 <> Неопределено Тогда Массив.Добавить(Знач29); КонецЕсли; Если Знач30 <> Неопределено Тогда Массив.Добавить(Знач30); КонецЕсли; Если Знач31 <> Неопределено Тогда Массив.Добавить(Знач31); КонецЕсли; Если Знач32 <> Неопределено Тогда Массив.Добавить(Знач32); КонецЕсли; Если Знач33 <> Неопределено Тогда Массив.Добавить(Знач33); КонецЕсли; Если Знач34 <> Неопределено Тогда Массив.Добавить(Знач34); КонецЕсли; Если Знач35 <> Неопределено Тогда Массив.Добавить(Знач35); КонецЕсли; Если Знач36 <> Неопределено Тогда Массив.Добавить(Знач36); КонецЕсли; Если Знач37 <> Неопределено Тогда Массив.Добавить(Знач37); КонецЕсли; Если Знач38 <> Неопределено Тогда Массив.Добавить(Знач38); КонецЕсли; Если Знач39 <> Неопределено Тогда Массив.Добавить(Знач39); КонецЕсли; Если Знач40 <> Неопределено Тогда Массив.Добавить(Знач40); КонецЕсли; Если ТолькоУникальные Тогда Массив = RemoveDuplicates(Массив); КонецЕсли; Возврат Массив; КонецФункции #Region Public_Methods // // Создает новый массив заданного размера, заполненный одинаковым значением. ✦ // Размер массива ➤ // Значение для заполнения всех элементов ➤ // Array — новый массив заполненный значениями ⬅ // // // // A1sAR.OfN(5, "test") -> ["test", "test", "test", "test", "test"] // // A1sAR.OfN(3, 0) -> [0, 0, 0] // // A1sAR.OfN(2, Новый Структура()) -> [Структура{}, Структура{}] // // Функция OfN(ArraySize, DefaultValueForAllElements) Экспорт //⚙ ib = "Создание массива размером " + Строка(ArraySize); //✍ Если ТипЗнч(ArraySize) <> Тип("Число") ИЛИ ArraySize < 0 Тогда //⚡ Возврат Новый Массив(); //↩ КонецЕсли; ResultArray = Новый Массив(); //✏ Для i = 0 По ArraySize - 1 Цикл //⟳ ResultArray.Добавить(DefaultValueForAllElements); //✏ КонецЦикла; Возврат ResultArray; //↩ КонецФункции // // Заполняет существующий массив одинаковым значением. ✦ // Существующий массив для заполнения ➤ // Значение для заполнения ➤ // Boolean — успешно ли выполнена операция ⬅ // // // // arr = Новый Массив(); // // arr.Добавить(1); arr.Добавить(2); arr.Добавить(3); // // A1sAR.Fill(arr, "new") -> arr станет ["new", "new", "new"] // // Функция Fill(ExistingArray, DefaultValueForAllElements) Экспорт //⚙ ib = "Заполнение существующего массива"; //✍ Если ТипЗнч(ExistingArray) <> Тип("Массив") Тогда //⚡ Возврат Ложь; //↩ КонецЕсли; ArraySize = ExistingArray.Количество(); //✏ Для i = 0 По ArraySize - 1 Цикл //⟳ ExistingArray[i] = DefaultValueForAllElements; //✏ КонецЦикла; Возврат Истина; //↩ КонецФункции #КонецОбласти #Region OfN_Tests_And_Examples // // Самотест модуля A1sAR с примерами использования. ✦ // Boolean — все тесты пройдены успешно ⬅ // // Функция OfN_SelfTest() Экспорт //⚙ ib = "Самотест A1sAR"; //✍ TestsPassed = 0; //✏ TestsTotal = 0; //✏ Сообщить("=== A1sAR.SelfTest() START ==="); // Тест 1: OfN с числовым значением TestsTotal = TestsTotal + 1; //✏ TestArray1 = OfN(5, 42); //✏ Если TestArray1.Количество() = 5 И TestArray1[0] = 42 И TestArray1[4] = 42 Тогда //⚡ TestsPassed = TestsPassed + 1; //✏ Сообщить("✓ Тест 1 (OfN числовое): ПРОЙДЕН"); Иначе Сообщить("✗ Тест 1 (OfN числовое): ПРОВАЛЕН"); КонецЕсли; // Тест 2: OfN со строковым значением TestsTotal = TestsTotal + 1; //✏ TestArray2 = OfN(3, "test"); //✏ Если TestArray2.Количество() = 3 И TestArray2[0] = "test" И TestArray2[2] = "test" Тогда //⚡ TestsPassed = TestsPassed + 1; //✏ Сообщить("✓ Тест 2 (OfN строковое): ПРОЙДЕН"); Иначе Сообщить("✗ Тест 2 (OfN строковое): ПРОВАЛЕН"); КонецЕсли; // Тест 3: OfN с нулевым размером TestsTotal = TestsTotal + 1; //✏ TestArray3 = OfN(0, "empty"); //✏ Если TestArray3.Количество() = 0 Тогда //⚡ TestsPassed = TestsPassed + 1; //✏ Сообщить("✓ Тест 3 (OfN пустой): ПРОЙДЕН"); Иначе Сообщить("✗ Тест 3 (OfN пустой): ПРОВАЛЕН"); КонецЕсли; // Тест 4: OfN с отрицательным размером TestsTotal = TestsTotal + 1; //✏ TestArray4 = OfN(-5, "negative"); //✏ Если TestArray4.Количество() = 0 Тогда //⚡ TestsPassed = TestsPassed + 1; //✏ Сообщить("✓ Тест 4 (OfN отрицательный): ПРОЙДЕН"); Иначе Сообщить("✗ Тест 4 (OfN отрицательный): ПРОВАЛЕН"); КонецЕсли; // Тест 5: Fill существующего массива TestsTotal = TestsTotal + 1; //✏ TestArray5 = Новый Массив(); //✏ TestArray5.Добавить(1); //✏ TestArray5.Добавить(2); //✏ TestArray5.Добавить(3); //✏ FillResult = Fill(TestArray5, "filled"); //✏ Если FillResult И TestArray5.Количество() = 3 И TestArray5[0] = "filled" И TestArray5[2] = "filled" Тогда //⚡ TestsPassed = TestsPassed + 1; //✏ Сообщить("✓ Тест 5 (Fill массива): ПРОЙДЕН"); Иначе Сообщить("✗ Тест 5 (Fill массива): ПРОВАЛЕН"); КонецЕсли; // Тест 6: Fill с неправильным параметром TestsTotal = TestsTotal + 1; //✏ FillResult2 = Fill("не массив", "error"); //✏ Если НЕ FillResult2 Тогда //⚡ TestsPassed = TestsPassed + 1; //✏ Сообщить("✓ Тест 6 (Fill ошибка): ПРОЙДЕН"); Иначе Сообщить("✗ Тест 6 (Fill ошибка): ПРОВАЛЕН"); КонецЕсли; // Итоги тестирования Если TestsPassed = TestsTotal Тогда //⚡ Сообщить("=== A1sAR.SelfTest() SUCCESS: " + Строка(TestsPassed) + "/" + Строка(TestsTotal) + " ==="); Возврат Истина; //↩ Иначе Сообщить("=== A1sAR.SelfTest() FAILED: " + Строка(TestsPassed) + "/" + Строка(TestsTotal) + " ==="); Возврат Ложь; //↩ КонецЕсли; КонецФункции #КонецОбласти #Region Examples_Advanced // // Расширенные примеры использования функций модуля A1sAR. ✦ // Процедура OfN_ExamplesAdvanced() Экспорт //⚙ ib = "Примеры A1sAR"; //✍ Сообщить("=== Примеры использования A1sAR ==="); // Пример 1: Создание массива с булевыми значениями BoolArray = OfN(4, Истина); //✏ Сообщить("Массив булевых (4 элемента): " + Строка(BoolArray.Количество()) + " элементов"); // Пример 2: Массив структур EmptyStruct = Новый Структура(); //✏ StructArray = OfN(2, EmptyStruct); //✏ Сообщить("Массив структур: " + Строка(StructArray.Количество()) + " элементов"); // Пример 3: Заполнение существующего массива датой DateArray = Новый Массив(); //✏ DateArray.Добавить('20240101'); //✏ DateArray.Добавить('20240201'); //✏ DateArray.Добавить('20240301'); //✏ CurrentDate = ТекущаяДата(); //✏ Fill(DateArray, CurrentDate); //✏ Сообщить("Массив дат заполнен текущей датой: " + Строка(DateArray.Количество()) + " элементов"); // Пример 4: Создание матрицы (массив массивов) MatrixRow = OfN(3, 0); //✏ Matrix = OfN(2, MatrixRow); //✏ Сообщить("Матрица 2x3 создана: " + Строка(Matrix.Количество()) + " строк"); Сообщить("=== Примеры завершены ==="); КонецПроцедуры #КонецОбласти // Добавляет значение в массив по условию. // // Параметры: // Массив - Массив - массив, в который нужно добавить значение. // ЗначениеЕслиИстина - Произвольный - значение для добавления при истинном условии. // Условие - Булево - условие добавления значения. // ЗначениеЕслиЛожь - Произвольный - значение для добавления при ложном условии. // // Возвращаемое значение: // Массив - переданный массив с добавленным значением или без изменений. // Функция AddIf(Массив, ЗначениеЕслиИстина, Условие = Истина, ЗначениеЕслиЛожь = Неопределено) Экспорт Если Условие Тогда Массив.Добавить(ЗначениеЕслиИстина); ИначеЕсли ЗначениеЕслиЛожь <> Неопределено Тогда Массив.Добавить(ЗначениеЕслиЛожь); КонецЕсли; Возврат Массив; КонецФункции /// Объединяет до 8 массивов в один /// Первый массив /// Второй массив /// Третий массив /// Четвертый массив /// Пятый массив /// Шестой массив /// Седьмой массив /// Восьмой массив /// Удалить дубликаты из результата /// Объединенный массив Функция Concatenate(Массив1, Массив2 = Неопределено, Массив3 = Неопределено, Массив4 = Неопределено, Массив5 = Неопределено, Массив6 = Неопределено, Массив7 = Неопределено, Массив8 = Неопределено, ТолькоУникальные = Ложь) Экспорт Результат = Новый Массив; // Создаем массив всех переданных массивов для итерации МассивыДляОбъединения = Новый Массив; Если Массив1 <> Неопределено Тогда МассивыДляОбъединения.Добавить(Массив1); КонецЕсли; Если Массив2 <> Неопределено Тогда МассивыДляОбъединения.Добавить(Массив2); КонецЕсли; Если Массив3 <> Неопределено Тогда МассивыДляОбъединения.Добавить(Массив3); КонецЕсли; Если Массив4 <> Неопределено Тогда МассивыДляОбъединения.Добавить(Массив4); КонецЕсли; Если Массив5 <> Неопределено Тогда МассивыДляОбъединения.Добавить(Массив5); КонецЕсли; Если Массив6 <> Неопределено Тогда МассивыДляОбъединения.Добавить(Массив6); КонецЕсли; Если Массив7 <> Неопределено Тогда МассивыДляОбъединения.Добавить(Массив7); КонецЕсли; Если Массив8 <> Неопределено Тогда МассивыДляОбъединения.Добавить(Массив8); КонецЕсли; // Объединяем все массивы Для Каждого ТекущийМассив Из МассивыДляОбъединения Цикл Для Каждого Элемент Из ТекущийМассив Цикл Результат.Добавить(Элемент); КонецЦикла; КонецЦикла; // При необходимости удаляем дубликаты Если ТолькоУникальные Тогда Результат = RemoveDuplicates(Результат); КонецЕсли; Возврат Результат; КонецФункции /// Объединение множеств до 8 массивов - всегда возвращает только уникальные значения Функция Union(Массив1, Массив2 = Неопределено, Массив3 = Неопределено, Массив4 = Неопределено, Массив5 = Неопределено, Массив6 = Неопределено, Массив7 = Неопределено, Массив8 = Неопределено) Экспорт Возврат Concatenate(Массив1, Массив2, Массив3, Массив4, Массив5, Массив6, Массив7, Массив8, Истина); КонецФункции /// Возвращает элементы, которые есть во всех переданных массивах (пересечение до 8 массивов) Функция Intersection(Массив1, Массив2 = Неопределено, Массив3 = Неопределено, Массив4 = Неопределено, Массив5 = Неопределено, Массив6 = Неопределено, Массив7 = Неопределено, Массив8 = Неопределено) Экспорт // Создаем массив всех переданных массивов ВсеМассивы = Новый Массив; Если Массив1 <> Неопределено Тогда ВсеМассивы.Добавить(Массив1); КонецЕсли; Если Массив2 <> Неопределено Тогда ВсеМассивы.Добавить(Массив2); КонецЕсли; Если Массив3 <> Неопределено Тогда ВсеМассивы.Добавить(Массив3); КонецЕсли; Если Массив4 <> Неопределено Тогда ВсеМассивы.Добавить(Массив4); КонецЕсли; Если Массив5 <> Неопределено Тогда ВсеМассивы.Добавить(Массив5); КонецЕсли; Если Массив6 <> Неопределено Тогда ВсеМассивы.Добавить(Массив6); КонецЕсли; Если Массив7 <> Неопределено Тогда ВсеМассивы.Добавить(Массив7); КонецЕсли; Если Массив8 <> Неопределено Тогда ВсеМассивы.Добавить(Массив8); КонецЕсли; Если ВсеМассивы.Количество() = 0 Тогда Возврат Новый Массив; КонецЕсли; Если ВсеМассивы.Количество() = 1 Тогда Возврат RemoveDuplicates(ВсеМассивы[0]); КонецЕсли; // Начинаем с первого массива Результат = RemoveDuplicates(ВсеМассивы[0]); // Последовательно пересекаем с каждым следующим массивом Для Индекс = 1 По ВсеМассивы.Количество() - 1 Цикл ТекущийМассив = ВсеМассивы[Индекс]; Элементы = Новый Соответствие; Для Каждого Элемент Из ТекущийМассив Цикл Элементы.Вставить(Элемент, Истина); КонецЦикла; НовыйРезультат = Новый Массив; Для Каждого Элемент Из Результат Цикл Если Элементы[Элемент] <> Неопределено Тогда НовыйРезультат.Добавить(Элемент); КонецЕсли; КонецЦикла; Результат = НовыйРезультат; КонецЦикла; Возврат Результат; КонецФункции /// Возвращает элементы из первого массива, которых нет в остальных массивах (разность до 8 массивов) Функция Difference(Массив1, Массив2 = Неопределено, Массив3 = Неопределено, Массив4 = Неопределено, Массив5 = Неопределено, Массив6 = Неопределено, Массив7 = Неопределено, Массив8 = Неопределено) Экспорт Если Массив1 = Неопределено Тогда Возврат Новый Массив; КонецЕсли; // Создаем массив массивов для исключения МассивыИсключения = Новый Массив; Если Массив2 <> Неопределено Тогда МассивыИсключения.Добавить(Массив2); КонецЕсли; Если Массив3 <> Неопределено Тогда МассивыИсключения.Добавить(Массив3); КонецЕсли; Если Массив4 <> Неопределено Тогда МассивыИсключения.Добавить(Массив4); КонецЕсли; Если Массив5 <> Неопределено Тогда МассивыИсключения.Добавить(Массив5); КонецЕсли; Если Массив6 <> Неопределено Тогда МассивыИсключения.Добавить(Массив6); КонецЕсли; Если Массив7 <> Неопределено Тогда МассивыИсключения.Добавить(Массив7); КонецЕсли; Если Массив8 <> Неопределено Тогда МассивыИсключения.Добавить(Массив8); КонецЕсли; // Создаем соответствие всех элементов для исключения ЭлементыИсключения = Новый Соответствие; Для Каждого МассивИсключения Из МассивыИсключения Цикл Для Каждого Элемент Из МассивИсключения Цикл ЭлементыИсключения.Вставить(Элемент, Истина); КонецЦикла; КонецЦикла; // Формируем результат Результат = Новый Массив; Для Каждого Элемент Из Массив1 Цикл Если ЭлементыИсключения[Элемент] = Неопределено Тогда Результат.Добавить(Элемент); КонецЕсли; КонецЦикла; Возврат Результат; КонецФункции /// Проверяет, содержит ли массив указанное значение Функция Contains(Массив, Значение) Экспорт Возврат Массив.Найти(Значение) <> Неопределено; КонецФункции /// Возвращает первый элемент массива или Неопределено Функция First(Массив) Экспорт Если Массив.Количество() > 0 Тогда Возврат Массив[0]; Иначе Возврат Неопределено; КонецЕсли; КонецФункции /// Возвращает последний элемент массива или Неопределено Функция Last(Массив) Экспорт Если Массив.Количество() > 0 Тогда Возврат Массив[Массив.Количество() - 1]; Иначе Возврат Неопределено; КонецЕсли; КонецФункции /// Создает копию массива с отсортированными по возрастанию элементами Функция Sort(Массив) Экспорт Список = Новый СписокЗначений; Для Каждого Элемент Из Массив Цикл Список.Добавить(Элемент); КонецЦикла; Список.Сортировать(); Результат = Новый Массив; Для Счет = 0 По Список.Количество() - 1 Цикл Результат.Добавить(Список.Получить(Счет)); КонецЦикла; Возврат Результат; КонецФункции /// Создает копию массива с элементами в обратном порядке Функция Reverse(Массив) Экспорт Результат = Новый Массив; Индекс = Массив.Количество() - 1; Пока Индекс >= 0 Цикл Результат.Добавить(Массив[Индекс]); Индекс = Индекс - 1; КонецЦикла; Возврат Результат; КонецФункции /// Создает новый массив, удаляя дубликаты из исходного массива /// Исходный массив /// Массив без дубликатов Функция RemoveDuplicates(Массив) Экспорт Результат = Новый Массив; // Оптимизация: используем Соответствие вместо Массив.Найти() УникальныеЗначения = Новый Соответствие; Для Каждого Элемент Из Массив Цикл Если УникальныеЗначения[Элемент] = Неопределено Тогда Результат.Добавить(Элемент); УникальныеЗначения.Вставить(Элемент, Истина); КонецЕсли; КонецЦикла; Возврат Результат; КонецФункции /// Объединяет элементы массива в строку с указанным разделителем Функция Join(Массив, Разделитель) Экспорт Если Массив.Количество() = 0 Тогда Возврат ""; КонецЕсли; Результат = ""; Для Счет = 0 По Массив.Количество() - 1 Цикл Результат = Результат + Формат(Массив[Счет]); Если Счет < Массив.Количество() - 1 Тогда Результат = Результат + Разделитель; КонецЕсли; КонецЦикла; Возврат Результат; КонецФункции /// Возвращает индекс первого вхождения элемента в массив, или -1 если не найден Функция IndexOf(Массив, Значение) Экспорт Для Счет = 0 По Массив.Количество() - 1 Цикл Если Массив[Счет] = Значение Тогда Возврат Счет; КонецЕсли; КонецЦикла; Возврат -1; КонецФункции /// Вставляет элемент в массив по указанному индексу Функция Insert(Массив, Индекс, Значение) Экспорт Результат = Новый Массив; Для Счет = 0 По Массив.Количество() - 1 Цикл Если Счет = Индекс Тогда Результат.Добавить(Значение); КонецЕсли; Результат.Добавить(Массив[Счет]); КонецЦикла; // Если индекс равен количеству элементов, добавляем в конец Если Индекс >= Массив.Количество() Тогда Результат.Добавить(Значение); КонецЕсли; Возврат Результат; КонецФункции /// Удаляет элемент из массива по указанному индексу Функция RemoveAt(Массив, Индекс) Экспорт Если Индекс < 0 Или Индекс >= Массив.Количество() Тогда Возврат Массив; // Без изменений, если индекс вне диапазона КонецЕсли; Результат = Новый Массив; Для Счет = 0 По Массив.Количество() - 1 Цикл Если Счет <> Индекс Тогда Результат.Добавить(Массив[Счет]); КонецЕсли; КонецЦикла; Возврат Результат; КонецФункции /// Проверяет, пуст ли массив (нет элементов) Функция IsEmpty(Массив) Экспорт Возврат Массив.Количество() = 0; КонецФункции