Фильтр выгрузки товаров по наименованию

Один клиент попросил меня как-то исключить из выгрузки товары, содержащие в наименовании определенные слова.

Я сделал, слова перечислял в поле ввода, каждое с новой строки. Код получился таким:

МассивИсключитьТоварыИсходный = СтрРазделить(ИсключитьТовары, Символы.ПС, ложь);
МассивИсключитьТовары = Новый Массив();
Для Каждого ТекТовар Из МассивИсключитьТоварыИсходный Цикл
	ТекТовар = СокрЛП(ТекТовар);
	Если ТекТовар = "" Тогда Продолжить; КонецЕсли;
	МассивИсключитьТовары.Добавить(ВРЕГ(ТекТовар));
КонецЦикла;

Для Каждого Строка ИЗ МассивОстатков Цикл
	
	НаименованиеВР = ВРЕГ(Строка.name);
	Пропустить = ложь;
	Для Каждого ТекТовар Из МассивИсключитьТовары Цикл
		Если Найти(НаименованиеВР, ТекТовар) <> 0 Тогда 
			Пропустить = истина;
			Сообщить("Пропущен товар: " + Строка.name + " по условию: " + ТекТовар);
			Продолжить; 
		КонецЕсли;
	КонецЦикла;      
	
	Если Пропустить Тогда
		Продолжить;
	КонецЕсли;

	...
КонецЦикла;

Но вот через некоторое время клиент позвонил и попросил оставить только товары, содержащие определенное слово в наименовании.

Я подумал и решил использовать условие на языке 1С. Потому что желания клиента меняются, проще изменить выражение отбора, чем переписывать код.

В итоге у меня получился такой фильтр:

Параметры.ОК = Найти("$name$", "word1") <> 0 ИЛИ Найти("$name$", "word2") <> 0; 

А код по проверке условия еще проще:

Заметьте, это будет работать даже во Fresh, ведь используется безопасная версия Выполнить!

УсловиеИсключитьТовары = СокрЛП(ИсключитьТовары);


П = Новый Структура("ОК");


Для Каждого Строка ИЗ МассивОстатков Цикл
	
	ТекНаименование = Строка.name;
	ТекНаименованиеДляУсловия = СтрЗаменить(ТекНаименование, """", """""");

	П.ОК = истина; //Истина, если оставляем, ложь, если пропускаем
	
	ТекУсловиеИсключитьТовары = СтрЗаменить(УсловиеИсключитьТовары, "$name$", ТекНаименованиеДляУсловия);
	
	Попытка
		ОбщегоНазначения.ВыполнитьВБезопасномРежиме(ТекУсловиеИсключитьТовары, П); 
	Исключение                                                     
		Сообщить("Пропущен товар: " + ТекНаименование + " при вычисления условия: " + ТекУсловиеИсключитьТовары + " ошибка: " + ОписаниеОшибки());
		П.ОК = ложь; 
	КонецПопытки;
	
	Если П.ОК <> Истина Тогда
		Сообщить("Пропущен товар: " + ТекНаименование + " по условию: " + ТекУсловиеИсключитьТовары);
		Продолжить; 
	КонецЕсли;

	...
КонецЦикла;

Объем: 1 час.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *