Назначение обработки: Найти документы с отрицательными движениями за период, подобрать из доступных в наличии остатков похожую по наименованию номенклатуру и выполнить замену в документах реализации.
Процент соответствия задается пользователем;
Количество для замены можно редактировать вручную;
Заменять можно на несколько из подобных;
При больших обьемах есть возможность предварительно заполнить все таблицы, быстренько проставить галочки и уйти на обед.
Поиск работает по очень простому принципу - разбивает наименование на массив строк, отсеивает незначительные кусочки (для ускорения) и передает в запрос параметром для ПОДОБНО.
При желании можно апгрейдить алгоритм составления массива поиска, текст запроса конструируется динамически.
Код поиска:
ИскомыеСлова = ПараметрыПоиска(ТекНоменклатура);
СписокСубконто = Новый СписокЗначений;
СписокСубконто.Добавить(ПредопределенноеЗначение("ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура"));
ТекстЗапроса = "";
ТекстЗапроса = ТекстЗапроса +
"ВЫБРАТЬ
| ХозрасчетныйОстатки.Субконто1 КАК Номенклатура,
| ХозрасчетныйОстатки.КоличествоОстаток
|ПОМЕСТИТЬ Остатки
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, Счет = &Счет, &ВидыСубконто, ) КАК ХозрасчетныйОстатки
|ГДЕ
| ХозрасчетныйОстатки.КоличествоОстаток > 0
|;
|////////////////////////////////////////////////////////////////////////////////
|";
Для Каждого Строка Из ИскомыеСлова Цикл
i = Строка.ПолучитьИдентификатор();
ТекстЗапроса = ТекстЗапроса +
"ВЫБРАТЬ
| Остатки.Номенклатура,
| Остатки.КоличествоОстаток,
| 1 КАК Совпадений
|";
Если i = 0 Тогда
ТекстЗапроса = ТекстЗапроса +
"ПОМЕСТИТЬ Найдено
|";
КонецЕсли;
ТекстЗапроса = ТекстЗапроса +
"ИЗ
| Остатки КАК Остатки
|ГДЕ
| Остатки.Номенклатура.Наименование ПОДОБНО &Наименование"+i+"
|";
Если ИскомыеСлова.Количество()>i+1 Тогда
ТекстЗапроса = ТекстЗапроса +
"ОБЪЕДИНИТЬ ВСЕ
|";
Иначе
ТекстЗапроса = ТекстЗапроса +
";
|";
КонецЕсли;
КонецЦикла;
ТекстЗапроса = ТекстЗапроса +
"ВЫБРАТЬ
| Найдено.Номенклатура КАК Номенклатура,
| Найдено.КоличествоОстаток КАК Остаток,
| СУММА(Найдено.Совпадений) КАК Совпадений
|ПОМЕСТИТЬ Итоговая
|ИЗ
| Найдено КАК Найдено
|
|СГРУППИРОВАТЬ ПО
| Найдено.Номенклатура,
| Найдено.КоличествоОстаток
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Итоговая.Номенклатура,
| Итоговая.Остаток КАК Остаток,
| Итоговая.Совпадений КАК Совпадений,
| 100 / &КлючевыхСлов * Итоговая.Совпадений КАК Процент
|ИЗ
| Итоговая КАК Итоговая
|ГДЕ
| 100 / &КлючевыхСлов * Итоговая.Совпадений >= &МинПроцент
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ВЫРАЗИТЬ(&Номенклатура КАК Справочник.Номенклатура),
| СУММА(0),
| СУММА(0),
| МАКСИМУМ(100)
|ИЗ
| Итоговая КАК Итоговая
|ГДЕ
| 100 / &КлючевыхСлов * Итоговая.Совпадений >= &МинПроцент
|
|УПОРЯДОЧИТЬ ПО
| Процент УБЫВ,
| Остаток";
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("Счет", ПланыСчетов.Хозрасчетный.ТоварыНаСкладах);
Запрос.УстановитьПараметр("ВидыСубконто", СписокСубконто);
Запрос.УстановитьПараметр("Дата", ДатаПервогоДвижения(ТекНоменклатура));
Запрос.УстановитьПараметр("КлючевыхСлов", ИскомыеСлова.Количество());
Запрос.УстановитьПараметр("МинПроцент", ПроцентСоответствия);
Запрос.УстановитьПараметр("Номенклатура", ТекНоменклатура);
Для Каждого Строка Из ИскомыеСлова Цикл
i = Строка.ПолучитьИдентификатор();
Запрос.УстановитьПараметр("Наименование"+i,"%"+Строка.Значение+"%");
КонецЦикла;