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