Возникла задача.
Есть таблица значений с колонкой Период типа Дата.
Как нам отфильтровать таблицу и выбрать только те строки, которые, например, укладываются в определенный диапазон?
Встроенная функция Скопировать(...) с отбором строк по переданной структуре нам в данном случае не помощник - соответствие не точное.
Перебор - некрасиво и громоздко.
Загрузка ТЗ во временную таблицу запроса и отбор им - стрельба из пушки по воробьям.
Немного покумекал и придумал следующее:
ОтфильтрованнаяТЗ = ФильтрТЗ(ТЗ, "{ИмяКолонки1} + {ИмяКолонки2} <= {ИмяКолонки3} >> {ИмяКолонки2} <> 0");
Функция принимает в качестве аргумента таблицу значений и последовательно применяет к ней условия, разграниченные разделителем >> - получается что-то вроде конвейера.
Значение в фигурных скобках обозначает значение в соответствующей колонке. В итоге выражение должно давать в результате Истина или Ложь, в зависимости от этого строка ТЗ будет передана в обработку на следующий этап конвейера.
При проверке условия применяется Вычислить(...), так что при написании условий учитывайте имеющиеся ограничения.
Сама функция выглядит достаточно просто, но, возможно, её можно упростить и ещё:
Функция Фильтр(Знач ТЗ, ВыражениеФильтрации) Экспорт
МассивВыражений = МассивВыражений(ВыражениеФильтрации);
Для Каждого Выражение Из МассивВыражений Цикл
ПромежуточнаяТЗ = ТЗ.СкопироватьКолонки();
Для Каждого СтрТЗ Из ТЗ Цикл
Если Вычислить(Выражение) Тогда
ЗаполнитьЗначенияСвойств(ПромежуточнаяТЗ.Добавить(), СтрТЗ);
КонецЕсли;
КонецЦикла;
ТЗ = ПромежуточнаяТЗ;
КонецЦикла;
Возврат ТЗ;
КонецФункции
Функция МассивВыражений(ВыражениеФильтрации)
ВыражениеРазделенное = СтрРазделить(СтрЗаменить(ВыражениеФильтрации, ">>", "$"), "$", Ложь);
МассивВыражений = Новый Массив;
Для Каждого Выражение Из ВыражениеРазделенное Цикл
ВыражениеОбработанное = СтрЗаменить(Выражение, "{", "СтрТЗ.");
ВыражениеОбработанное = СтрЗаменить(ВыражениеОбработанное, "}", "");
МассивВыражений.Добавить(ВыражениеОбработанное);
КонецЦикла;
Возврат МассивВыражений;
КонецФункции