📚 A1sAR: массивы как в JavaScript

Union, Intersection, Difference — функциональные операции над массивами

⚠️ Проблема: объединение массивов с дубликатами

Стандартный подход требует циклы, соответствия и проверки на каждом шагу.

❌ Обычный подход (15+ строк)
Массив1 = Новый Массив();
Массив1.Добавить("товар1");
Массив1.Добавить("товар2");

Массив2 = Новый Массив();
Массив2.Добавить("товар2"); // дубликат
Массив2.Добавить("товар3");

Результат = Новый Массив();
УникальныеЗначения = Новый Соответствие();

Для Каждого Элемент Из Массив1 Цикл
    Если УникальныеЗначения[Элемент] = Неопределено Тогда
        Результат.Добавить(Элемент);
        УникальныеЗначения.Вставить(Элемент, Истина);
    КонецЕсли;
КонецЦикла;
// ... то же для Массив2
✅ С A1sAR (1 строка)
Результат = A1sAR.Union(Массив1, Массив2);

// ["товар1", "товар2", "товар3"] — только уникальные

🔀 Операции множеств

1. 🔗 Union — объединение (только уникальные)

Товары1 = A1sAR.Of("товар1", "товар2");
Товары2 = A1sAR.Of("товар2", "товар3"); // товар2 повторяется

Все = A1sAR.Union(Товары1, Товары2);
// ["товар1", "товар2", "товар3"]

До 8 массивов одновременно:

Итог = A1sAR.Union(Массив1, Массив2, Массив3, Массив4);

2. Intersection — пересечение (общие элементы)

Категории1 = A1sAR.Of("Электроника", "Одежда", "Книги");
Категории2 = A1sAR.Of("Одежда", "Книги", "Игрушки");
Категории3 = A1sAR.Of("Книги", "Спорт");

Общие = A1sAR.Intersection(Категории1, Категории2, Категории3);
// ["Книги"] — только элементы, присутствующие во ВСЕХ массивах
Use case: найти общие интересы пользователей, пересечение прав доступа.

3. Difference — разность (уникальные первого)

ВсеТовары = A1sAR.Of("товар1", "товар2", "товар3", "товар4");
Проданные = A1sAR.Of("товар2", "товар4");

Остаток = A1sAR.Difference(ВсеТовары, Проданные);
// ["товар1", "товар3"] — всё из первого массива, чего нет в остальных
Use case: вычислить остатки, найти недостающие элементы, выявить изменения.

🏗️ Создание массивов

Of() — из значений

Товары = A1sAR.Of("товар1", "товар2", "товар3");
// ["товар1", "товар2", "товар3"]

До 40 элементов одновременно!

OfN() — фиксированный размер Полезно

// Массив из 10 нулей
Счётчики = A1sAR.OfN(10, 0);
// [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

// Массив из 5 пустых структур
Элементы = A1sAR.OfN(5, Новый Структура());
Use case: инициализация буферов, создание матриц.

⚙️ Функциональные операции

Contains

Проверка вхождения элемента

First / Last

Первый/последний элемент

Sort

Сортировка по возрастанию

Reverse

Разворот массива

RemoveDuplicates

Удаление дубликатов

Join

Объединение в строку

Примеры использования:

// Contains — проверка вхождения
Роли = A1sAR.Of("admin", "user", "moderator");
ЕстьАдмин = A1sAR.Contains(Роли, "admin");
// Истина

// First / Last — первый/последний
Товары = A1sAR.Of("яблоко", "банан", "апельсин");
Первый = A1sAR.First(Товары);
// "яблоко"
Последний = A1sAR.Last(Товары);
// "апельсин"

// Sort / Reverse
Числа = A1sAR.Of(3, 1, 4, 1, 5, 9);
Отсортированные = A1sAR.Sort(Числа);
// [1, 1, 3, 4, 5, 9]
Обратные = A1sAR.Reverse(Числа);
// [9, 5, 1, 4, 1, 3]

// RemoveDuplicates
Теги = A1sAR.Of("новость", "важное", "новость", "акция");
Уникальные = A1sAR.RemoveDuplicates(Теги);
// ["новость", "важное", "акция"]

🔄 Преобразования

Join — объединение в строку

Товары = A1sAR.Of("товар1", "товар2", "товар3");
Строка = A1sAR.Join(Товары, ", ");
// "товар1, товар2, товар3"

IndexOf — поиск индекса

Товары = A1sAR.Of("яблоко", "банан", "апельсин");

Индекс = A1sAR.IndexOf(Товары, "банан");
// 1 (нумерация с 0)

Индекс = A1sAR.IndexOf(Товары, "груша");
// -1 (не найдено)

💼 Практический пример: фильтрация прав

// Права пользователя
ПраваПользователя = A1sAR.Of("read", "write", "delete", "admin");

// Требуемые права для операции
ТребуетсяПрава = A1sAR.Of("write", "delete");

// Проверка: есть ли ВСЕ требуемые права?
ЕстьПрава = (
    A1sAR.Intersection(ПраваПользователя, ТребуетсяПрава).Количество()
    = ТребуетсяПрава.Количество()
);

// Альтернативный вариант
НедостающиеПрава = A1sAR.Difference(ТребуетсяПрава, ПраваПользователя);
ЕстьВсеПрава = A1sAR.IsEmpty(НедостающиеПрава);

🤖 Почему ИИ любит A1sAR

⚡ Лаконичность

// ИИ видит:
A1sAR.Union(arr1, arr2, arr3)

// Вместо:
МассивРезультата = Новый Массив();
УникальныеЗначения = Новый Соответствие();
Для Каждого Элемент Из arr1 Цикл...

🎯 Функциональный стиль

// Читается как предложение на английском:
Остаток = A1sAR.Difference(Все, Проданные);