Убрать номенклатуру в архив. Поиск в получении данных выбора. Очистка истории выбора.

Возникла тут вот такая задача: убрать старую номенклатуру “в архив”, оставить только нужную или загрузить новую. А старую скрыть во всех диалогах.

Фактически эта задача выполняется по таким шагам:

  1. Создается реквизит “Архив” у элемент и групп (в моем случае иерахия элементов, для групп не надо), добавляем его индексирование.
  2. В форму добавляется новый реквизит.
  3. В запрос динамических списков добавляется отбор “Архив =Ложь” или &ПоказыватьАрхивные 
  4. Параметр заполняется при открытии формы в ложи или в форму можно добавить реквизит “Показывать архивные”. 
  5. Можно добавить роль, для которой этот реквизит будет видим либо доступен.
  6. В модуле менеджера спраовчника “Номенклатура” создается обработчик ОбработкаПолученияДанныхВыбора прописывается свой поиск, скорее всего это будет меделенней системного, но пренебрегаем.
    Добавляем раскраску подстроки и ограничиваем список 200 элементами (считаю, что это максимум)
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    ДлинаПоиска = СтрДлина(Параметры.СтрокаПоиска);
    Если Параметры.СтрокаПоиска = Неопределено //или ДлинаПоиска
        //можно просто до 3 символов сделать стандратнаяобработка=Ложь, тогда не будет искать, это ускорит отбор и выборку
        Тогда
        Возврат;
    КонецЕсли;

    СтандартнаяОбработка = Ложь;
    Запрос = Новый Запрос;
    Запрос.Текст = “ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
    | Номенклатура.Ссылка,
    | Номенклатура.Наименование
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ГДЕ Номенклатура.Архив = Ложь
    | И Номенклатура.Наименование ПОДОБНО &СтрокаВвода
    | “;

    Запрос.УстановитьПараметр(“СтрокаВвода”,“%”+Параметры.СтрокаПоиска + “%” );

    Выборка = Запрос.Выполнить().Выбрать();

    ДанныеВыбора = Новый СписокЗначений();
    ШрифтЖирный = Новый Шрифт(,,Истина);
    Зеленый = Новый Цвет(50,185,50);
    Подстрока = Врег(Параметры.СтрокаПоиска);
    Счетчик = 0;
    Пока Выборка.Следующий() Цикл
        Счетчик = Счетчик+1;

        ВрегНаименование = ВРЕГ(Выборка.Наименование);

        ПозПоиска = Найти(ВрегНаименование,Подстрока);
        
        Если ПозПоиска>0 Тогда
            ФС = Новый Массив;
            Если ПозПоиска <> 1 Тогда
                ФС.Добавить(Лев(Выборка.Наименование,ПозПоиска1));
            КонецЕсли;
            ФС.Добавить(Новый ФорматированнаяСтрока(Параметры.СтрокаПоиска,ШрифтЖирный,Зеленый));
            ФС.Добавить(Сред(Выборка.Наименование,ПозПоиска+ДлинаПоиска));
            Представление = Новый ФорматированнаяСтрока(ФС);
            ДанныеВыбора.Добавить(Выборка.Ссылка, Представление);
        Иначе
            ДанныеВыбора.Добавить(Выборка.Ссылка, Выборка.Наименование);

        КонецЕсли;
        
        Если Счетчик>200 Тогда
            Прервать;
        КонецЕсли;

    КонецЦикла;

КонецПроцедуры

 

Последнее, что остается очистить историю выбора

Оказывается, история выбора хранится в системных настройках, немного экспериментов и получился вот такой код:

Выборка = ХранилищеСистемныхНастроек.Выбрать();
Пока Выборка.Следующий() Цикл
    Если Выборка.КлючОбъекта =“ИсторияВыбора” Тогда
        Массив2 = Новый Массив;
        флЕстьПравки =Ложь;
        Для каждого Эл из Выборка.Настройки Цикл
            Значение = Эл.Value;
            Если ТипЗнч(Значение) = Тип(“СправочникСсылка.Номенклатура”) Тогда
                Если Значение.Архив = Ложь Тогда //Проверка архивной записи
                    Массив2.Добавить(Эл);
                Иначе
                    флЕстьПравки = Истина;
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
        Если флЕстьПравки Тогда
            ХранилищеСистемныхНастроек.Сохранить(Выборка.КлючОбъекта,Выборка.КлючНастроек,Массив2,Выборка.Представление,Выборка.Пользователь);
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Его надо запускать под административныйми правами, что он делает:

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

Вот и всё: задача почти выполнена.

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

Эту задачу можно было бы решить через ограничения доступа к данным, но не всегда такое возможно: в моем случае это не совсем типовая конфигурация и так было проще и прозрачней, а также интересней в реализации.

Реклама – двигатель торговли, но тормоз просмотра фильмов по телевизору.

— Игорь Сиволоб