Как скрыть помеченные на удаление объекты номенклатуры из поиска и списка выбора?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При длительной эксплуатации учетной системы в справочнике Номенклатура накапливается множество неактуальных позиций. Если товар уже использовался в закрытых периодах, удалить его штатным механизмом невозможно из-за наличия ссылок в проведенных документах и регистрах. В результате помеченные на удаление элементы продолжают отображаться в выпадающих списках, участвовать в поиске по подстроке и замедлять работу пользователей. Разберем основные способы решения этой проблемы — от быстрых организационных приемов до программных методов фильтрации.

Способ 1. Добавление индексированного реквизита и установка отбора

В платформе 1С:Предприятие 7.7 стандартный метод УстановитьОтбор нельзя напрямую применить к системному признаку пометки удаления. Чтобы обойти это ограничение, создадим дополнительный реквизит, по которому будет работать штатный отбор платформы.

  1. В конфигураторе откроем справочник Номенклатура и добавим новый реквизит (например, Актуален с типом Число или Перечисление.ДаНет либо реквизит Показ).
  2. В свойствах реквизита обязательно установим флажок Отбор по реквизиту (чтобы поле стало индексированным).
  3. С помощью групповой обработки заполним данный реквизит: для действующих товаров установим признак 1 (или "Да"), а для помеченных на удаление — 0 (или "Нет").
  4. В модуле формы списка или выбора справочника в процедуре ПриОткрытии включим автоматический отбор:

Процедура ПриОткрытии()
    УстановитьОтбор("Актуален", Перечисление.ДаНет.Да);
    Сортировка("Наименование", 1);
КонецПроцедуры

Чтобы значение реквизита обновлялось автоматически при установке или снятии пометки удаления, добавим соответствующую логику в предопределенные события модуля формы элемента (ПриЗаписи) или глобального модуля (ПриУдаленииЭлемента).

Важный нюанс: при использовании стандартного отбора по одному реквизиту пользователь не сможет одновременно включить отбор по другому реквизиту стандартными средствами формы.

Способ 2. Исключение помеченных элементов в механизме поиска по подстроке

Если поиск в базе реализован через специализированную обработку подбора (например, поиск по фрагменту наименования), проанализируем текст встроенного запроса и добавим фильтрацию по системному полю ПометкаУдаления.

Рассмотрим пример корректировки процедуры формирования запроса в обработке быстрого поиска:


ТекстЗапроса = "
|ТекущийЭлемент = Справочник.Номенклатура.ТекущийЭлемент;
|" + РеквизитПоиска + " = Справочник.Номенклатура." + РеквизитПоиска + ";
|Группировка ТекущийЭлемент Без Упорядочивания Без Групп;
|Условие(Найти(ВРег(" + РеквизитПоиска + "), ВРег(ПодСтрокаПоиска)) > 0);
|Без итогов;";

Если ПустоеЗначение(ВключатьПомеченныеНаУдаление) = 1 Тогда
    ТекстЗапроса = ТекстЗапроса + "
    |Условие(ТекущийЭлемент.ПометкаУдаления = 0);";
КонецЕсли;

В результате помеченные товары перестанут попадать в список найденных позиций, что ускорит выбор и исключит случайный ввод устаревшей номенклатуры в документы.

Способ 3. Перенос в отдельную архивную группу и маркировка наименований

Если внесение изменений в конфигурацию нежелательно, применим административно-структурный подход:

  1. Создадим в корне справочника группу (папку) с названием _Архив (Удаленные) или Нерелевантные товары.
  2. С помощью внешней обработки перенесем все элементы с пометкой удаления в созданную папку.
  3. Для предотвращения автоподбора при наборе первых букв к коду или наименованию старых товаров программно добавим префикс (например, я_ или zzz_). В таком случае при алфавитной сортировке они окажутся в самом конце списка.

Способ 4. Реализация формы подбора через Таблицу Значений

Для высоконагруженных баз с большим количеством пользователей эффективным решением является замена стандартного диалога выбора на специализированную обработку подбора товаров. В такой форме список позиций загружается в объект ТаблицаЗначений:

  1. При открытии обработки формируется выборка только актуальных элементов (с остатками на складах и без пометки удаления).
  2. Таблица значений отображается на форме и позволяет мгновенно выполнять фильтрацию, поиск и просмотр остатков без постоянных обращений к базе данных.

Способ 5. Скрытие помеченных позиций в среде 1С 8.x

В современных конфигурациях на платформе 1С:Предприятие 8 задача решается штатными механизмами динамических списков и переопределением данных выбора:

  1. В модуле менеджера справочника: в процедуре ОбработкаПолученияДанныхВыбора добавляем условие в отбор:
    
    Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
        Параметры.Отбор.Вставить("ПометкаУдаления", Ложь);
    КонецПроцедуры
    
  2. В динамическом списке формы выбора: в свойствах списка настраиваем произвольный запрос или в событии ПриСозданииНаСервере накладываем постоянный фиксированный отбор ПометкаУдаления Равно Ложь.
← На главную