При длительной эксплуатации учетной системы в справочнике Номенклатура накапливается множество неактуальных позиций. Если товар уже использовался в закрытых периодах, удалить его штатным механизмом невозможно из-за наличия ссылок в проведенных документах и регистрах. В результате помеченные на удаление элементы продолжают отображаться в выпадающих списках, участвовать в поиске по подстроке и замедлять работу пользователей. Разберем основные способы решения этой проблемы — от быстрых организационных приемов до программных методов фильтрации.
В платформе 1С:Предприятие 7.7 стандартный метод УстановитьОтбор нельзя напрямую применить к системному признаку пометки удаления. Чтобы обойти это ограничение, создадим дополнительный реквизит, по которому будет работать штатный отбор платформы.
Номенклатура и добавим новый реквизит (например, Актуален с типом Число или Перечисление.ДаНет либо реквизит Показ).ПриОткрытии включим автоматический отбор:
Процедура ПриОткрытии()
УстановитьОтбор("Актуален", Перечисление.ДаНет.Да);
Сортировка("Наименование", 1);
КонецПроцедуры
Чтобы значение реквизита обновлялось автоматически при установке или снятии пометки удаления, добавим соответствующую логику в предопределенные события модуля формы элемента (ПриЗаписи) или глобального модуля (ПриУдаленииЭлемента).
Важный нюанс: при использовании стандартного отбора по одному реквизиту пользователь не сможет одновременно включить отбор по другому реквизиту стандартными средствами формы.
Если поиск в базе реализован через специализированную обработку подбора (например, поиск по фрагменту наименования), проанализируем текст встроенного запроса и добавим фильтрацию по системному полю ПометкаУдаления.
Рассмотрим пример корректировки процедуры формирования запроса в обработке быстрого поиска:
ТекстЗапроса = "
|ТекущийЭлемент = Справочник.Номенклатура.ТекущийЭлемент;
|" + РеквизитПоиска + " = Справочник.Номенклатура." + РеквизитПоиска + ";
|Группировка ТекущийЭлемент Без Упорядочивания Без Групп;
|Условие(Найти(ВРег(" + РеквизитПоиска + "), ВРег(ПодСтрокаПоиска)) > 0);
|Без итогов;";
Если ПустоеЗначение(ВключатьПомеченныеНаУдаление) = 1 Тогда
ТекстЗапроса = ТекстЗапроса + "
|Условие(ТекущийЭлемент.ПометкаУдаления = 0);";
КонецЕсли;
В результате помеченные товары перестанут попадать в список найденных позиций, что ускорит выбор и исключит случайный ввод устаревшей номенклатуры в документы.
Если внесение изменений в конфигурацию нежелательно, применим административно-структурный подход:
_Архив (Удаленные) или Нерелевантные товары.я_ или zzz_). В таком случае при алфавитной сортировке они окажутся в самом конце списка.Для высоконагруженных баз с большим количеством пользователей эффективным решением является замена стандартного диалога выбора на специализированную обработку подбора товаров. В такой форме список позиций загружается в объект ТаблицаЗначений:
В современных конфигурациях на платформе 1С:Предприятие 8 задача решается штатными механизмами динамических списков и переопределением данных выбора:
ОбработкаПолученияДанныхВыбора добавляем условие в отбор:
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
Параметры.Отбор.Вставить("ПометкаУдаления", Ложь);
КонецПроцедуры
ПриСозданииНаСервере накладываем постоянный фиксированный отбор ПометкаУдаления Равно Ложь.