//////////////////////////////////////////////////////////////////////////////// // Обработка: A1sDP_DS // Назначение: Fluent Interface для работы со структурами (Обертка над A1sDS) // Версия: 2.3.0 // Автор: A1sCode Team // Сайт: https://a1scode.ru // Лицензия: MIT // Совместимость: 1С:Предприятие 8.3.18+ //////////////////////////////////////////////////////////////////////////////// // // ПАТТЕРН: Processing Object + Fluent Interface // // Все методы-трансформаторы возвращают ЭтотОбъект для цепочки вызовов. // Методы-терминаторы возвращают конечное значение. // // ИСПОЛЬЗОВАНИЕ: // Результат = A1sDS.On() // .Set("Имя", "Иван") // .SetIf("Возраст", 30, Возраст > 0) // .Merge(Дополнительные) // .Omit("Пароль") // .Map("Значение * 1.2") // Новое: Map всех значений // .Value(); // //////////////////////////////////////////////////////////////////////////////// #Область ОписаниеПеременных Перем мСтруктура; // Структура — рабочая структура #КонецОбласти #Область ПрограммныйИнтерфейс #Область Инициализация /// ✦ Init — Инициализация обработки с исходной структурой /// ➤ ИсходнаяСтруктура (Структура, Неопределено) — Начальная структура или пусто /// ⬅ A1sDP_DS — ЭтотОбъект для цепочки вызовов /// Функция Init(Знач ИсходнаяСтруктура = Неопределено) Экспорт Если ИсходнаяСтруктура = Неопределено Тогда мСтруктура = Новый Структура; ИначеЕсли ТипЗнч(ИсходнаяСтруктура) = Тип("Структура") Тогда // Используем A1sDS.Copy вместо внутренней реализации мСтруктура = A1sDS.Copy(ИсходнаяСтруктура); ИначеЕсли ТипЗнч(ИсходнаяСтруктура) = Тип("ФиксированнаяСтруктура") Тогда мСтруктура = A1sDS.Copy(ИсходнаяСтруктура); Иначе мСтруктура = Новый Структура; КонецЕсли; Возврат ЭтотОбъект; КонецФункции #КонецОбласти #Область МетодыТрансформаторы #Область БазовыеОперации /// ✦ Set — Установить значение по ключу Функция Set(Знач Ключ, Знач Значение) Экспорт мСтруктура.Вставить(Ключ, Значение); Возврат ЭтотОбъект; КонецФункции /// ✦ SetIf — Установить значение по ключу при выполнении условия Функция SetIf(Знач Ключ, Знач Значение, Знач Условие) Экспорт Если Условие Тогда мСтруктура.Вставить(Ключ, Значение); КонецЕсли; Возврат ЭтотОбъект; КонецФункции /// ✦ SetMany — Установить несколько значений из структуры Функция SetMany(Знач Источник) Экспорт Если ТипЗнч(Источник) = Тип("Структура") ИЛИ ТипЗнч(Источник) = Тип("ФиксированнаяСтруктура") Тогда Для Каждого Пара Из Источник Цикл мСтруктура.Вставить(Пара.Ключ, Пара.Значение); КонецЦикла; КонецЕсли; Возврат ЭтотОбъект; КонецФункции /// ✦ AddIf — Добавить свойство по условию (делегирование в A1sDS) Функция AddIf(Знач Ключ, Знач ЗначениеЕслиИстина, Знач Условие = Истина, Знач ЗначениеЕслиЛожь = Неопределено) Экспорт A1sDS.AddIf(мСтруктура, Ключ, ЗначениеЕслиИстина, Условие, ЗначениеЕслиЛожь); Возврат ЭтотОбъект; КонецФункции /// ✦ Remove — Удалить ключ из структуры Функция Remove(Знач Ключ) Экспорт Если мСтруктура.Свойство(Ключ) Тогда мСтруктура.Удалить(Ключ); КонецЕсли; Возврат ЭтотОбъект; КонецФункции /// ✦ Clear — Очистить структуру Функция Clear() Экспорт мСтруктура = Новый Структура; Возврат ЭтотОбъект; КонецФункции #КонецОбласти #Область ФабрикиВнутри /// ✦ OfKeys — Создать новую структуру из ключей с одним значением Функция OfKeys(Знач Keys, Знач DefaultValue) Экспорт мСтруктура = A1sDS.OfKeys(Keys, DefaultValue); Возврат ЭтотОбъект; КонецФункции // // // Делегирует заполнение структуры в A1sDS. // Мутирует исходную структуру и возвращает текущий объект (A1sDP_DS) для цепочки. // // Значение для заполнения ➤ // A1sDP_DS — текущий объект (для цепочки вызовов) ⬅ // // A1sDS.On(Струк).Fill(0).Insert("Сумма", 100); // // Функция Fill(Знач Value) Экспорт //⚙ // ✅ DELEGATION: Передаем управление статическому модулю. // Структура меняется "по ссылке" внутри A1sDS.Fill. A1sDS.Fill(мСтруктура, Value); //⚡ // ✅ FLUENT: Возвращаем обертку, а не структуру. Возврат ЭтотОбъект; //↩ КонецФункции #КонецОбласти #Область Парсинг /// ✦ Zip — Создать структуру (полная замена содержимого) Функция Zip(Знач Ключи, Знач Значения) Экспорт мСтруктура = A1sDS.Zip(Ключи, Значения); Возврат ЭтотОбъект; КонецФункции /// ✦ Patch — Обновить структуру (применить изменения к существующему) Функция Patch(Знач Ключи, Знач Значения) Экспорт мСтруктура = A1sDS.Patch(мСтруктура, Ключи, Значения); Возврат ЭтотОбъект; КонецФункции /// ✦ OfQueryString — Создать структуру из QueryString (замена содержимого) Функция OfQueryString(Знач QueryString) Экспорт мСтруктура = A1sDS.OfQueryString(QueryString); Возврат ЭтотОбъект; КонецФункции #КонецОбласти #Область СелекцияИТрансформация /// ✦ Pick — Оставить только указанные ключи Функция Pick(Знач КлючиСтрока) Экспорт мСтруктура = A1sDS.Pick(мСтруктура, КлючиСтрока); Возврат ЭтотОбъект; КонецФункции /// ✦ Omit — Исключить указанные ключи Функция Omit(Знач КлючиСтрока) Экспорт мСтруктура = A1sDS.Omit(мСтруктура, КлючиСтрока); Возврат ЭтотОбъект; КонецФункции /// ✦ Rename — Переименовать ключи Функция Rename(Знач КартаПереименования) Экспорт мСтруктура = A1sDS.Rename(мСтруктура, КартаПереименования); Возврат ЭтотОбъект; КонецФункции /// ✦ Map — Преобразовать ВСЕ значения по выражению (переменная "Значение") Функция Map(Знач Выражение) Экспорт мСтруктура = A1sDS.Map(мСтруктура, Выражение); Возврат ЭтотОбъект; КонецФункции /// ✦ Transform — Преобразовать ОДНО значение по ключу через выражение (переменная "v") Функция Transform(Знач Ключ, Знач Выражение) Экспорт Если мСтруктура.Свойство(Ключ) Тогда v = мСтруктура[Ключ]; мСтруктура.Вставить(Ключ, Вычислить(Выражение)); КонецЕсли; Возврат ЭтотОбъект; КонецФункции /// ✦ Filter — Оставить только пары, удовлетворяющие условию (переменная "Значение") Функция Filter(Знач Условие) Экспорт мСтруктура = A1sDS.Filter(мСтруктура, Условие); Возврат ЭтотОбъект; КонецФункции #КонецОбласти #Область СлияниеИМодификация /// ✦ Merge — Слить с другой структурой (значения из Источника перезаписывают) Функция Merge(Знач Источник) Экспорт мСтруктура = A1sDS.Merge(мСтруктура, Источник); Возврат ЭтотОбъект; КонецФункции /// ✦ MergeFixed — Слить с другой структурой и вернуть фиксированную структуру Функция MergeFixed(Знач Источник) Экспорт мСтруктура = A1sDS.MergeFixed(мСтруктура, Источник); Возврат ЭтотОбъект; КонецФункции /// ✦ Defaults — Применить значения по умолчанию (не перезаписывает существующие) Функция Defaults(Знач Умолчания) Экспорт мСтруктура = A1sDS.Defaults(мСтруктура, Умолчания); Возврат ЭтотОбъект; КонецФункции /// ✦ Concatenate — Объединить несколько структур (до 8 шт) Функция Concatenate(Знач Структура2 = Неопределено, Знач Структура3 = Неопределено, Знач Структура4 = Неопределено, Знач Структура5 = Неопределено, Знач Структура6 = Неопределено, Знач Структура7 = Неопределено, Знач Структура8 = Неопределено) Экспорт мСтруктура = A1sDS.Concatenate(мСтруктура, Структура2, Структура3, Структура4, Структура5, Структура6, Структура7, Структура8); Возврат ЭтотОбъект; КонецФункции #КонецОбласти #Область ОперацииМножеств /// ✦ Intersection — Пересечение текущей структуры с другими (остаются только общие ключи) Функция Intersection(Знач Структура2, Знач Структура3 = Неопределено, Знач Структура4 = Неопределено, Знач Структура5 = Неопределено, Знач Структура6 = Неопределено, Знач Структура7 = Неопределено, Знач Структура8 = Неопределено) Экспорт мСтруктура = A1sDS.Intersection(мСтруктура, Структура2, Структура3, Структура4, Структура5, Структура6, Структура7, Структура8); Возврат ЭтотОбъект; КонецФункции /// ✦ Difference — Разность (ключи текущей, которых нет в остальных) Функция Difference(Знач Структура2, Знач Структура3 = Неопределено, Знач Структура4 = Неопределено, Знач Структура5 = Неопределено, Знач Структура6 = Неопределено, Знач Структура7 = Неопределено, Знач Структура8 = Неопределено) Экспорт мСтруктура = A1sDS.Difference(мСтруктура, Структура2, Структура3, Структура4, Структура5, Структура6, Структура7, Структура8); Возврат ЭтотОбъект; КонецФункции #КонецОбласти #Область ГлубокиеОперации /// ✦ DeepCopy — Глубокое копирование (рекурсивно) Функция DeepCopy() Экспорт мСтруктура = A1sDS.DeepCopy(мСтруктура); Возврат ЭтотОбъект; КонецФункции /// ✦ FlattenKeys — Превратить вложенную структуру в плоскую Функция FlattenKeys(Знач Разделитель = "_") Экспорт мСтруктура = A1sDS.FlattenKeys(мСтруктура, Разделитель); Возврат ЭтотОбъект; КонецФункции /// ✦ NestKeys — Собрать плоскую структуру во вложенную Функция NestKeys(Знач Разделитель = "_") Экспорт мСтруктура = A1sDS.NestKeys(мСтруктура, Разделитель); Возврат ЭтотОбъект; КонецФункции /// ✦ ResetDeep — Глубокий сброс значений структуры к умолчаниям Функция ResetDeep() Экспорт мСтруктура = A1sDS.ResetDeep(мСтруктура); Возврат ЭтотОбъект; КонецФункции #КонецОбласти #КонецОбласти #Область МетодыТерминаторы #Область ПолучениеЗначений /// ✦ Value — Получить результирующую структуру Функция Value() Экспорт Возврат мСтруктура; КонецФункции /// ✦ ToFixed — Получить фиксированную структуру Функция ToFixed() Экспорт Возврат Новый ФиксированнаяСтруктура(мСтруктура); КонецФункции /// ✦ Get — Получить значение по ключу с умолчанием Функция Get(Знач Ключ, Знач Умолчание = Неопределено) Экспорт Если мСтруктура.Свойство(Ключ) Тогда Возврат мСтруктура[Ключ]; Иначе Возврат Умолчание; КонецЕсли; КонецФункции /// ✦ GetOrInsert — Вернуть значение или вставить умолчание Функция GetOrInsert(Знач Ключ, Знач DefaultValue) Экспорт Возврат A1sDS.GetOrInsert(мСтруктура, Ключ, DefaultValue); КонецФункции /// ✦ GetOrInsertEval — Вернуть значение или вычислить и вставить Функция GetOrInsertEval(Знач Ключ, Знач ValueExpr) Экспорт Возврат A1sDS.GetOrInsertEval(мСтруктура, Ключ, ValueExpr); КонецФункции /// ✦ GetOrInsertPath — Вернуть значение по пути или создать структуру пути Функция GetOrInsertPath(Знач Path, Знач DefaultValue, Знач Sep = ".") Экспорт Возврат A1sDS.GetOrInsertPath(мСтруктура, Path, DefaultValue, Sep); КонецФункции /// ✦ ToString — Преобразовать в строку для отладки Функция ToString() Экспорт Результат = ""; Для Каждого Пара Из мСтруктура Цикл Результат = Результат + Пара.Ключ + " = " + Строка(Пара.Значение) + Символы.ПС; КонецЦикла; Возврат Результат; КонецФункции /// ✦ Sanitize — Очистить структуру (Требует Серверного вызова!) &AtServer Функция Sanitize() Экспорт мСтруктура = A1sDS.Sanitize(мСтруктура); Возврат ЭтотОбъект; КонецФункции /// ✦ ToJSON — Преобразовать в JSON-строку (Безопасный режим) &AtServer Функция ToJSON() Экспорт // ✅ FIXED: Обновляем состояние, используя мощный Sanitize из ядра A1sDS. // Это гарантирует, что даже если пользователь забыл .Sanitize(), // таблицы, деревья и ссылки обработаются корректно. мСтруктура = A1sDS.Sanitize(мСтруктура); // ✅ FIXED: Делегируем сериализацию ядру. // A1sDS.ToJSON может иметь настройки форматирования (красивые отступы), которые мы получим бесплатно. Возврат A1sDS.ToJSON(мСтруктура); КонецФункции #КонецОбласти #Область АнализИСвойства /// ✦ Keys — Получить массив ключей Функция Keys() Экспорт Возврат A1sDS.GetKeys(мСтруктура); КонецФункции /// ✦ Values — Получить массив значений Функция Values() Экспорт Возврат A1sDS.GetValues(мСтруктура); КонецФункции /// ✦ HasKey — Проверить наличие ключа Функция HasKey(Знач Ключ) Экспорт Возврат A1sDS.HasKey(мСтруктура, Ключ); КонецФункции /// ✦ HasKeys — Проверить наличие всех перечисленных ключей Функция HasKeys(Знач КлючиСтрока) Экспорт Возврат A1sDS.HasKeys(мСтруктура, КлючиСтрока); КонецФункции /// ✦ IsEmpty — Проверить пустоту структуры Функция IsEmpty() Экспорт Возврат A1sDS.IsEmpty(мСтруктура); КонецФункции /// ✦ Count — Получить количество ключей Функция Count() Экспорт Возврат мСтруктура.Количество(); КонецФункции /// ✦ Equals — Сравнить текущую структуру с другой Функция Equals(Знач ДругаяСтруктура) Экспорт Возврат A1sDS.Equals(мСтруктура, ДругаяСтруктура); КонецФункции #КонецОбласти #КонецОбласти #Область SelfTest /// ✦ SelfTest — Самотестирование обработки A1sDP_DS Функция SelfTest() Экспорт Успешно = Истина; ВсегоТестов = 0; ПройденоТестов = 0; // ТЕСТ 1: Init + Set + Value ВсегоТестов = ВсегоТестов + 1; Попытка Результат = ЭтотОбъект.Init().Set("Имя", "Иван").Set("Возраст", 30).Value(); Если Результат.Имя = "Иван" И Результат.Возраст = 30 Тогда ПройденоТестов = ПройденоТестов + 1; Иначе Успешно = Ложь; КонецЕсли; Исключение Успешно = Ложь; КонецПопытки; // ТЕСТ 2: Map (новый функционал) ВсегоТестов = ВсегоТестов + 1; Попытка Результат = ЭтотОбъект.Init().Set("A", 1).Set("B", 2).Map("Значение * 10").Value(); Если Результат.A = 10 И Результат.B = 20 Тогда ПройденоТестов = ПройденоТестов + 1; Иначе Успешно = Ложь; КонецЕсли; Исключение Успешно = Ложь; КонецПопытки; // ТЕСТ 3: Filter (новый функционал) ВсегоТестов = ВсегоТестов + 1; Попытка Результат = ЭтотОбъект.Init().Set("A", 1).Set("B", -5).Set("C", 10).Filter("Значение > 0").Value(); Если Результат.Свойство("A") И Результат.Свойство("C") И НЕ Результат.Свойство("B") Тогда ПройденоТестов = ПройденоТестов + 1; Иначе Успешно = Ложь; КонецЕсли; Исключение Успешно = Ложь; КонецПопытки; // ТЕСТ 4: Intersection ВсегоТестов = ВсегоТестов + 1; Попытка База = A1sDS.Of("A", 1, "B", 2); Результат = ЭтотОбъект.Init(База).Intersection(A1sDS.Of("B", 3, "C", 4)).Value(); Если Результат.Свойство("B") И НЕ Результат.Свойство("A") Тогда ПройденоТестов = ПройденоТестов + 1; Иначе Успешно = Ложь; КонецЕсли; Исключение Успешно = Ложь; КонецПопытки; // ТЕСТ 5: Zip ВсегоТестов = ВсегоТестов + 1; Попытка Значения = Новый Массив; Значения.Добавить(10); Значения.Добавить(20); Результат = ЭтотОбъект.Init().Zip("x,y", Значения).Value(); Если Результат.x = 10 И Результат.y = 20 Тогда ПройденоТестов = ПройденоТестов + 1; Иначе Успешно = Ложь; КонецЕсли; Исключение Успешно = Ложь; КонецПопытки; // ТЕСТ 6: GetOrInsertPath ВсегоТестов = ВсегоТестов + 1; Попытка Значение = ЭтотОбъект.Init().GetOrInsertPath("ui.theme.dark", Истина); Если Значение = Истина И ЭтотОбъект.HasKey("ui") Тогда ПройденоТестов = ПройденоТестов + 1; Иначе Успешно = Ложь; КонецЕсли; Исключение Успешно = Ложь; КонецПопытки; // ИТОГИ Если Успешно Тогда Сообщить("✓ A1sDP_DS.SelfTest: Пройдено " + Строка(ПройденоТестов) + " из " + Строка(ВсегоТестов) + " тестов"); Иначе Сообщить("✗ A1sDP_DS.SelfTest: ОШИБКА! Пройдено " + Строка(ПройденоТестов) + " из " + Строка(ВсегоТестов) + " тестов"); КонецЕсли; Возврат Успешно; КонецФункции #КонецОбласти #КонецОбласти