При работе в интерфейсе «Такси» на платформе 1С:Предприятие 8.3 пользователи часто сталкиваются с тем, что при начале ввода или активации поля ввода (например, «Контрагент» или «Номенклатура») система автоматически показывает выпадающий список ранее выбранных значений. В терминах платформы этот механизм называется историей выбора при вводе.
Хотя в большинстве случаев эта функция призвана ускорить рутинную работу, иногда она вызывает неудобства. Например, когда список засоряется устаревшими данными, содержит конфиденциальную информацию, мешает кастомной фильтрации или дублирует логику программных списков выбора. В этой статье мы подробно разберем, как полностью отключить появление этого списка, как управлять им программно и как при необходимости очистить накопленную историю.
Самый простой и быстрый способ убрать выпадающий список ранее выбранных элементов — настроить свойства конкретного поля ввода непосредственно в конфигураторе. Для этого выполним следующие шаги:
ChoiceHistoryOnInput).Рассмотрим подробнее три доступных режима этого свойства, так как они определяют поведение платформы:
Бывают ситуации, когда логика интерфейса должна быть динамической. Например, для обычных пользователей историю выбора нужно отключить, а для администраторов — оставить. В таком случае мы можем управлять свойством элемента формы программно.
Разберем по шагам, как это реализовать. Нам понадобится обратиться к свойству элемента формы в событии ПриСозданииНаСервере или ПриОткрытии:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Отключаем историю выбора для реквизита "Контрагент"
Элементы.Контрагент.ИсторияВыбораПриВводе = ИсторияВыбораПриВводе.Неиспользовать;
КонецПроцедуры
Этот способ хорош тем, что не требует жесткого изменения свойств в конфигураторе и позволяет гибко управлять поведением интерфейса в зависимости от ролей пользователей или других бизнес-условий.
Если мы хотим сохранить функционал истории выбора, но нам требуется периодически очищать накопленные пользователем данные (например, при смене организации или по кнопке «Очистить историю»), мы можем прибегнуть к работе с системным хранилищем настроек.
Платформа 1С хранит историю выбора индивидуально для каждого пользователя в специальной системной структуре. Ключ объекта в хранилище общих настроек имеет строго определенный формат: Общее/ИсторияВыбора/<ПутьКОбъектуМетаданных>.
Проанализируем пример кода, который позволяет очистить историю выбора для справочника «Контрагенты» у текущего пользователя:
&НаСервере
Процедура ОчиститьИсториюВыбораКонтрагентовНаСервере()
// Формируем системный ключ, под которым платформа сохраняет историю
КлючОбъекта = "Общее/ИсторияВыбора/Справочник.Контрагенты";
// Удаляем настройки истории для текущего пользователя
ХранилищеОбщихНастроек.Удалить(КлючОбъекта, "", ПараметрыСеанса.ТекущийПользователь);
КонецПроцедуры
Если же речь идет о кастомном поле ввода, которое не связано напрямую с объектом метаданных (например, текстовое поле поиска на форме), разработчики часто сохраняют его историю вручную под произвольным ключом. Посмотрим на пример очистки такого списка поиска:
&НаСервере
Процедура ОчиститьИсториюПоискаНаСервере()
// Очищаем локальный список выбора элемента на форме
Элементы.СтрокаПоискаНоменклатуры.СписокВыбора.Очистить();
// Сохраняем пустой список в хранилище под уникальным ключом
ХранилищеОбщихНастроек.Сохранить(
"ИсторияПоискаНоменклатуры",
"",
Элементы.СтрокаПоискаНоменклатуры.СписокВыбора
);
КонецПроцедуры
Часто начинающие разработчики путают два принципиально разных механизма: автогенерируемую платформой историю выбора и жестко задаваемый программистом список выбора (СписокВыбора).
Если вы хотите самостоятельно формировать выпадающий список (например, показывать только топ-10 популярных товаров), но при этом платформа продолжает подмешивать туда ранее выбранные пользователем элементы, вам необходимо настроить свойство «Режим обновления списка выбора».
Выясним причину такого поведения: по умолчанию платформа пытается автоматически дополнять ваш программный список историей поиска. Чтобы этого избежать, выполните следующие действия:
ИсторияВыбораПриВводе в значение Не использовать.РежимОбновленияСпискаВыбора.НеОбновлять). Это запретит платформе вмешиваться в ваш персонально сформированный список.Пример программного заполнения чистого списка выбора без примеси истории:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// 1. Отключаем авто-историю платформы
Элементы.ВариантДоставки.ИсторияВыбораПриВводе = ИсторияВыбораПриВводе.Неиспользовать;
// 2. Настраиваем режим обновления списка
Элементы.ВариантДоставки.РежимОбновленияСпискаВыбора = РежимОбновленияСпискаВыбора.НеОбновлять;
// 3. Заполняем список выбора вручную нужными значениями
Элементы.ВариантДоставки.СписокВыбора.Очистить();
Элементы.ВариантДоставки.СписокВыбора.Добавить("Самовывоз");
Элементы.ВариантДоставки.СписокВыбора.Добавить("Доставка курьером");
Элементы.ВариантДоставки.СписокВыбора.Добавить("Транспортная компания");
КонецПроцедуры
Бывают юзкейсы, когда история выбора в целом полезна, но в определенные моменты ее нужно принудительно обнулять «на лету» (например, при изменении реквизита «Организация» история по контрагентам должна сбрасываться, чтобы не предлагать партнеров другого юрлица). Для этого мы можем перехватить событие начала выбора:
&НаКлиенте
Процедура КонтрагентНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
// Очищаем текущий сформированный список прямо перед показом пользователю
Элемент.СписокВыбора.Очистить();
КонецПроцедуры
Если вы ведете разработку в типовой конфигурации (например, 1С:ERP, 1С:Управление торговлей или 1С:Бухгалтерия), в вашем распоряжении есть готовые программные модули БСП. Для точечной работы с историей выбора рекомендуется использовать программный интерфейс общего модуля СпискиВыбораКлиентСервер.
В частности, метод СпискиВыбораКлиентСервер.УдалитьИзИсторииВыбора позволяет без прямого обращения к низкоуровневому ХранилищуОбщихНастроек аккуратно стереть конкретный элемент из истории, чтобы он больше не докучал пользователю при вводе.
Подведем итоги: для полного и гарантированного избавления от истории ранее выбранных элементов в интерфейсе достаточно выставить свойство элемента формы «История выбора при вводе» в значение «Не использовать». Если же перед вами стоит задача тонкого управления интерфейсом — используйте возможности ХранилищаОбщихНастроек и события очистки списков выбора на клиенте.