Каталог решений - Ещё немного функционального стиля в 1С или Как нам отфильтровать таблицу значений

Ещё немного функционального стиля в 1С или Как нам отфильтровать таблицу значений

Ещё немного функционального стиля в 1С или Как нам отфильтровать таблицу значений

В наличии

Потребовалось накладывать хитрые отборы на таблицу значений в сотни строк и десятки колонок, однако Скопировать со структурой отбора мне не подошло.
Пришлось немного покреативить, подсмотрев, как это делается в других языках — возможно, получилось несколько топорно, но тем не менее — работает.

Категория:

Описание

Возникла задача.
Есть таблица значений с колонкой Период типа Дата.

Как нам отфильтровать таблицу и выбрать только те строки, которые, например, укладываются в определенный диапазон?

Встроенная функция Скопировать(…)  с отбором строк по переданной структуре нам в данном случае не помощник — соответствие не точное.

Перебор — некрасиво и громоздко.

Загрузка ТЗ во временную таблицу запроса и отбор им — стрельба из пушки по воробьям.

Немного покумекал и придумал следующее:

ОтфильтрованнаяТЗ = ФильтрТЗ(ТЗ, "{ИмяКолонки1} + {ИмяКолонки2} <= {ИмяКолонки3} >> {ИмяКолонки2} <> 0");

Функция принимает в качестве аргумента таблицу значений и последовательно применяет к ней условия, разграниченные разделителем >> — получается что-то вроде конвейера.

Значение в фигурных скобках обозначает значение в соответствующей колонке. В итоге выражение должно давать в результате Истина или Ложь, в зависимости от этого строка ТЗ будет передана в обработку на следующий этап конвейера.

При проверке условия применяется Вычислить(…), так что при написании условий учитывайте имеющиеся ограничения.

Сама функция выглядит достаточно просто, но, возможно, её можно упростить и ещё:

Функция Фильтр(Знач ТЗ, ВыражениеФильтрации) Экспорт
	МассивВыражений = МассивВыражений(ВыражениеФильтрации);
	
	Для Каждого Выражение Из МассивВыражений Цикл
		ПромежуточнаяТЗ = ТЗ.СкопироватьКолонки();
		
		Для Каждого СтрТЗ Из ТЗ Цикл
			Если Вычислить(Выражение) Тогда
				ЗаполнитьЗначенияСвойств(ПромежуточнаяТЗ.Добавить(), СтрТЗ);
			КонецЕсли;
		КонецЦикла;
		
		ТЗ = ПромежуточнаяТЗ;
	КонецЦикла;
	
	Возврат ТЗ;
КонецФункции

Функция МассивВыражений(ВыражениеФильтрации)
	ВыражениеРазделенное = СтрРазделить(СтрЗаменить(ВыражениеФильтрации, ">>", "$"), "$", Ложь);
	МассивВыражений = Новый Массив;
	
        Для Каждого Выражение Из ВыражениеРазделенное Цикл
		ВыражениеОбработанное = СтрЗаменить(Выражение, "{", "СтрТЗ.");
		ВыражениеОбработанное = СтрЗаменить(ВыражениеОбработанное, "}", "");
		
		МассивВыражений.Добавить(ВыражениеОбработанное);
	КонецЦикла;
	
	Возврат МассивВыражений;
КонецФункции

 

has been added to your cart:
Оформление заказа