Сравнение значений с использованием СКД

Постановка задачи: нужна функция, которая будет сравнивать произвольные значения и выдавать результат истина/ложь. Сравнение должно быть максимально гибким с возможностью визуальной настройки в интерфейсе.

Для решения лучше всего подойдёт тип ВидСравненияКомпоновкиДанных. Элемент этого типа может отображаться на форме и предопределённых видов сравнения достаточно много. Но как написать функцию, которая на вход получит 2 значения, способ сравнения и вернёт результат? Поиск и AI предлагают решения незамысловатые — сесть и написать длинную простыню Если ТипЗнч() = Тип() Тогда… Это долго и есть риск не учесть какой-нибудь вариант. Нужно использовать СКД и уже написанные там способы сравнения.

В результате получилась такая функция:

&НаСервереБезКонтекста
Функция Сравнить(ЛевоеЗначение, ВидСравнения, ПравоеЗначение)
    
    СКД = Новый СхемаКомпоновкиДанных;
    
    ИсточникДанных = СКД.ИсточникиДанных.Добавить();
    ИсточникДанных.Имя = "ИсточникДанных1";
    ИсточникДанных.ТипИсточникаДанных = "Local";
    
    НаборДанных = СКД.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
    НаборДанных.Имя = "НаборДанных1";
    НаборДанных.ИмяОбъекта = "ТаблицаДанных";
    НаборДанных.ИсточникДанных = "ИсточникДанных1";
    
    ПолеНабораДанных = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
    ПолеНабораДанных.Поле = "ЛевоеЗначение";
    ПолеНабораДанных.ПутьКДанным = "ЛевоеЗначение";
    
    ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СКД);
    КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
    КомпоновщикНастроек.Инициализировать(ИсточникНастроек);
    НастройкиКомпоновки = КомпоновщикНастроек.Настройки;
    
    Группировка = НастройкиКомпоновки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
    Группировка.Использование = Истина;
    ПолеГруппировки = Группировка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
    ПолеГруппировки.Использование = Истина;
    ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("ЛевоеЗначение");
    АвтоВыбранноеПоле = Группировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
    АвтоВыбранноеПоле.Использование = Истина;
    
    ЭлементОтбора = НастройкиКомпоновки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.Использование = Истина;
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ЛевоеЗначение");
    ЭлементОтбора.ВидСравнения = ВидСравнения;
    ЭлементОтбора.ПравоеЗначение = ПравоеЗначение;
    
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД, НастройкиКомпоновки,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
    
    Типы = Новый Массив;
    Типы.Добавить(ТипЗнч(ЛевоеЗначение));
    
    ЛеваяТаблица = Новый ТаблицаЗначений;
    ЛеваяТаблица.Колонки.Добавить("ЛевоеЗначение", Новый ОписаниеТипов(Типы));
    СтрокаЛевойТаблицы = ЛеваяТаблица.Добавить();
    СтрокаЛевойТаблицы.ЛевоеЗначение = ЛевоеЗначение;
    
    ВнешниеНаборы = Новый Структура("ТаблицаДанных", ЛеваяТаблица);
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборы);
    
    Результат = Новый ТаблицаЗначений;
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    ПроцессорВывода.УстановитьОбъект(Результат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
    Возврат Результат.Количество() > 0;
    
КонецФункции

Этот же код можно использовать как пример полностью программной работы с СКД без макетов.

Разумеется, использовать эту функцию в таком виде для сравнения нескольких тысяч значений будет не эффективно и не правильно. А вот для разовых вызовов из пользовательского интерфейса самое оно.

Публикация на Infostart, где можно скачать пример обработки.


Опубликовано

в

от