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

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