Капитально об программе 1С 8.0-8.3-8.4, 7.7

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

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

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

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

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

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

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

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

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

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

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

    КонецЦикла;

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

 

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

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

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

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

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

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

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