🔀 A1sDS: структуры без боли

Слияние, пересечение, разность — операции множеств над структурами в одну строку

⚠️ Проблема: объединение конфигураций — это боль

В 1С постоянно нужно мержить настройки из разных источников:

❌ Обычный подход (15+ строк)
БазаКонфиг = Новый Структура(
    "Сервер", "localhost",
    "Порт", 80
);

ПользовательКонфиг = Новый Структура(
    "Сервер", "prod.com",
    "SSL", Истина
);

ИтогКонфиг = Новый Структура();
Для Каждого Пара Из БазаКонфиг Цикл
    ИтогКонфиг.Вставить(Пара.Ключ, Пара.Значение);
КонецЦикла;

Для Каждого Пара Из ПользовательКонфиг Цикл
    ИтогКонфиг.Вставить(Пара.Ключ, Пара.Значение);
КонецЦикла;
✅ С A1sDS (1 строка)
ИтогКонфиг = A1sDS.Concatenate(
    БазаКонфиг,
    ПользовательКонфиг
);

// {Сервер: "prod.com", Порт: 80, SSL: Истина}

📊 Операции множеств над структурами

1. 🔗 Concatenate — объединение (последнее значение побеждает)

Стр1 = A1sDS.Of("a", 1, "b", 2);
Стр2 = A1sDS.Of("b", 3, "c", 4);

Результат = A1sDS.Concatenate(Стр1, Стр2);
// {a: 1, b: 3, c: 4}  ← "b" перезаписано значением из Стр2

До 8 структур одновременно:

Итог = A1sDS.Concatenate(база, пользователь, окружение, временные);

2. Intersection — пересечение (общие ключи)

Настр1 = A1sDS.Of("Язык", "ru", "Тема", "светлая", "Размер", 12);
Настр2 = A1sDS.Of("Язык", "en", "Тема", "темная", "Шрифт", "Arial");
Настр3 = A1sDS.Of("Язык", "de", "Размер", 14);

Общие = A1sDS.Intersection(Настр1, Настр2, Настр3);
// {Язык: "de"}  ← только ключи, присутствующие во ВСЕХ структурах
Use case: найти конфликтующие настройки, которые нужно согласовать.

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

Все = A1sDS.Of("ID", 1, "Имя", "Товар", "Цена", 100, "Количество", 5);
Базовые = A1sDS.Of("ID", 1, "Имя", "Товар");

Дополнительные = A1sDS.Difference(Все, Базовые);
// {Цена: 100, Количество: 5}  ← всё кроме базовых полей
Use case: отделить метаданные от данных, публичные поля от приватных.

💼 Реальный кейс: приоритетные конфигурации

// Базовая конфигурация приложения
База = A1sDS.Of(
    "АдресСервера", "localhost",
    "Порт", 80,
    "Таймаут", 30,
    "Отладка", Ложь
);

// Пользовательские настройки
Пользователь = A1sDS.Of(
    "АдресСервера", "prod.server.com",
    "Порт", 443,
    "Отладка", Истина
);

// Переменные окружения (наивысший приоритет)
Окружение = A1sDS.Of(
    "Порт", 8080,
    "SSL", Истина
);

// Итоговая конфигурация (приоритет: окружение > пользователь > база)
Конфиг = A1sDS.Concatenate(База, Пользователь, Окружение);
// {АдресСервера: "prod.server.com", Порт: 8080, Таймаут: 30, Отладка: Истина, SSL: Истина}

// Показать переопределённые настройки
Переопределённые = A1sDS.Intersection(База, Пользователь, Окружение);
// {Порт: 8080}  ← только "Порт" есть во всех трёх уровнях

// Уникальные настройки каждого уровня
УникальныеБазы = A1sDS.Difference(База, Пользователь, Окружение);
// {Таймаут: 30}  ← только в базовой конфигурации

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

⚡ Меньше токенов

// ИИ видит:
A1sDS.Concatenate(s1, s2, s3)

// Вместо:
Результат = Новый Структура();
Для Каждого Пара Из s1 Цикл...
Для Каждого Пара Из s2 Цикл...

🎯 Декларативность

ИИ мгновенно понимает намерение:

📚 Больше операций