Фильтр выгрузки товаров по наименованию
Один клиент попросил меня как-то исключить из выгрузки товары, содержащие в наименовании определенные слова.
Я сделал, слова перечислял в поле ввода, каждое с новой строки. Код получился таким:
МассивИсключитьТоварыИсходный = СтрРазделить(ИсключитьТовары, Символы.ПС, ложь); МассивИсключитьТовары = Новый Массив(); Для Каждого ТекТовар Из МассивИсключитьТоварыИсходный Цикл ТекТовар = СокрЛП(ТекТовар); Если ТекТовар = "" Тогда Продолжить; КонецЕсли; МассивИсключитьТовары.Добавить(ВРЕГ(ТекТовар)); КонецЦикла; Для Каждого Строка ИЗ МассивОстатков Цикл НаименованиеВР = ВРЕГ(Строка.name); Пропустить = ложь; Для Каждого ТекТовар Из МассивИсключитьТовары Цикл Если Найти(НаименованиеВР, ТекТовар) <> 0 Тогда Пропустить = истина; Сообщить("Пропущен товар: " + Строка.name + " по условию: " + ТекТовар); Продолжить; КонецЕсли; КонецЦикла; Если Пропустить Тогда Продолжить; КонецЕсли; ... КонецЦикла;
Но вот через некоторое время клиент позвонил и попросил оставить только товары, содержащие определенное слово в наименовании.
Я подумал и решил использовать условие на языке 1С. Потому что желания клиента меняются, проще изменить выражение отбора, чем переписывать код.
В итоге у меня получился такой фильтр:
Параметры.ОК = Найти("$name$", "word1") <> 0 ИЛИ Найти("$name$", "word2") <> 0;
А код по проверке условия еще проще:
Заметьте, это будет работать даже во Fresh, ведь используется безопасная версия Выполнить!
УсловиеИсключитьТовары = СокрЛП(ИсключитьТовары); П = Новый Структура("ОК"); Для Каждого Строка ИЗ МассивОстатков Цикл ТекНаименование = Строка.name; ТекНаименованиеДляУсловия = СтрЗаменить(ТекНаименование, """", """"""); П.ОК = истина; //Истина, если оставляем, ложь, если пропускаем ТекУсловиеИсключитьТовары = СтрЗаменить(УсловиеИсключитьТовары, "$name$", ТекНаименованиеДляУсловия); Попытка ОбщегоНазначения.ВыполнитьВБезопасномРежиме(ТекУсловиеИсключитьТовары, П); Исключение Сообщить("Пропущен товар: " + ТекНаименование + " при вычисления условия: " + ТекУсловиеИсключитьТовары + " ошибка: " + ОписаниеОшибки()); П.ОК = ложь; КонецПопытки; Если П.ОК <> Истина Тогда Сообщить("Пропущен товар: " + ТекНаименование + " по условию: " + ТекУсловиеИсключитьТовары); Продолжить; КонецЕсли; ... КонецЦикла;
Объем: 1 час.
Свежие комментарии