Возникла тут вот такая задача: убрать старую номенклатуру «в архив», оставить только нужную или загрузить новую. А старую скрыть во всех диалогах.
Фактически эта задача выполняется по таким шагам:
- Создается реквизит «Архив» у элемент и групп (в моем случае иерахия элементов, для групп не надо), добавляем его индексирование.
- В форму добавляется новый реквизит.
- В запрос динамических списков добавляется отбор «Архив =Ложь» или &ПоказыватьАрхивные
- Параметр заполняется при открытии формы в ложи или в форму можно добавить реквизит «Показывать архивные».
- Можно добавить роль, для которой этот реквизит будет видим либо доступен.
- В модуле менеджера спраовчника «Номенклатура» создается обработчик ОбработкаПолученияДанныхВыбора прописывается свой поиск, скорее всего это будет меделенней системного, но пренебрегаем.
Добавляем раскраску подстроки и ограничиваем список 200 элементами (считаю, что это максимум)
ДлинаПоиска = СтрДлина(Параметры.СтрокаПоиска);
Если Параметры.СтрокаПоиска = Неопределено //или ДлинаПоиска
//можно просто до 3 символов сделать стандратнаяобработка=Ложь, тогда не будет искать, это ускорит отбор и выборку
Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст = «ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
| Номенклатура.Ссылка,
| Номенклатура.Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ Номенклатура.Архив = Ложь
| И Номенклатура.Наименование ПОДОБНО &СтрокаВвода
| «;
Запрос.УстановитьПараметр(«СтрокаВвода»,«%»+Параметры.СтрокаПоиска + «%» );
Выборка = Запрос.Выполнить().Выбрать();
ДанныеВыбора = Новый СписокЗначений();
ШрифтЖирный = Новый Шрифт(,,Истина);
Зеленый = Новый Цвет(50,185,50);
Подстрока = Врег(Параметры.СтрокаПоиска);
Счетчик = 0;
Пока Выборка.Следующий() Цикл
Счетчик = Счетчик+1;
ВрегНаименование = ВРЕГ(Выборка.Наименование);
ПозПоиска = Найти(ВрегНаименование,Подстрока);
Если ПозПоиска>0 Тогда
ФС = Новый Массив;
Если ПозПоиска <> 1 Тогда
ФС.Добавить(Лев(Выборка.Наименование,ПозПоиска—1));
КонецЕсли;
ФС.Добавить(Новый ФорматированнаяСтрока(Параметры.СтрокаПоиска,ШрифтЖирный,Зеленый));
ФС.Добавить(Сред(Выборка.Наименование,ПозПоиска+ДлинаПоиска));
Представление = Новый ФорматированнаяСтрока(ФС);
ДанныеВыбора.Добавить(Выборка.Ссылка, Представление);
Иначе
ДанныеВыбора.Добавить(Выборка.Ссылка, Выборка.Наименование);
КонецЕсли;
Если Счетчик>200 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Последнее, что остается очистить историю выбора
Оказывается, история выбора хранится в системных настройках, немного экспериментов и получился вот такой код:
Пока Выборка.Следующий() Цикл
Если Выборка.КлючОбъекта =«ИсторияВыбора» Тогда
Массив2 = Новый Массив;
флЕстьПравки =Ложь;
Для каждого Эл из Выборка.Настройки Цикл
Значение = Эл.Value;
Если ТипЗнч(Значение) = Тип(«СправочникСсылка.Номенклатура») Тогда
Если Значение.Архив = Ложь Тогда //Проверка архивной записи
Массив2.Добавить(Эл);
Иначе
флЕстьПравки = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если флЕстьПравки Тогда
ХранилищеСистемныхНастроек.Сохранить(Выборка.КлючОбъекта,Выборка.КлючНастроек,Массив2,Выборка.Представление,Выборка.Пользователь);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Его надо запускать под административныйми правами, что он делает:
- Перебирает все настройки и если это история выбора, которая хранится в массиве: перебирираются все элементы, и лишние просто не копируются в новый массив.
- В параметре выбрать, можно сдлеать отбор, но в моем случае это не настолько медленно работает, чтобы имело смысл заморачиваться для однократной процедуры.
Вот и всё: задача почти выполнена.
Остается групповой обработкой поменить ненужные, через обработку загрузки из табличного документа или другим способом загрузить новую номенклатур.
Эту задачу можно было бы решить через ограничения доступа к данным, но не всегда такое возможно: в моем случае это не совсем типовая конфигурация и так было проще и прозрачней, а также интересней в реализации.
Если бы рекламодатели тратили на улучшение своей продукции те деньги, которые они тратят на рекламу, их продукция не нуждалась бы в рекламе.