При работе в управляемом приложении 1С пользователи часто сталкиваются с необходимостью видеть статус элементов в выпадающих списках элементов (ввод по строке и быстрый выбор). По умолчанию выпадающий список может либо скрывать помеченные на удаление элементы, либо выводить их без visual-индикаторов, что приводит к ошибкам при выборе контрагентов, договоров или номенклатуры.
Разберем подробно несколько способ реализации этой задачи: от стандартных настроек параметров выбора до полного переопределения логики выпадающего списка с помощью программного кода.
Если задача заключается в том, чтобы полностью скрыть элементы с пометкой на удаление из выпадающего списка быстрого выбора, проанализируем модуль менеджера соответствующего справочника (например, Справочник.Контрагенты). В этом модуле применяется специальный обработчик события ОбработкаПолученияДанныхВыбора.
Рассмотрим пошаговый алгоритм отключения стандартной обработки и формирования собственного списка:
ОбработкаПолученияДанныхВыбора.СтандартнаяОбработка в значение Ложь, чтобы платформенное формирование списка отменилось.ДанныеВыбора.Посмотрим на пример кода в модуле менеджера справочника:
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
НовыйСписок = Новый СписокЗначений;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| НЕ Контрагенты.ПометкаУдаления";
Выборка = Запрос.Выполнить().Выгрузить();
МассивСсылок = Выборка.ВыгрузитьКолонку("Ссылка");
НовыйСписок.ЗагрузитьЗначения(МассивСсылок);
ДанныеВыбора = НовыйСписок;
КонецПроцедуры
Если необходимо, чтобы элементы с пометкой на удаление не скрывались, а выводились в выпадающем списке со специальной перечеркнутой иконкой, рассмотрим заполнение `ДанныеВыбора` элементами со структурой специальных признаков.
Платформа 1С распознает специальные ключи структуры, переданные в качестве дополнительных данных элементов списка выбора:
Истина или Ложь). При передаче Истина платформа автоматически отрисует системную иконку пометки на удаление рядом с наименованием.Разберем пример, в котором используется стандартный метод ПолучитьДанныеВыбора() для сохранения привычной логики поиска по строке с добавлением визуальных признаков:
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Получаем стандартно сформированный список по введенному пользователем тексту
СтандартныйСписок = Справочники.Контрагенты.ПолучитьДанныеВыбора(Параметры);
ДанныеВыбора = Новый СписокЗначений;
Для Каждого ЭлементИзСписка Из СтандартныйСписок Цикл
СсылкаНаОбъект = ЭлементИзСписка.Значение;
// Формируем структуру параметров визуализации
ДопПараметры = Новый Структура;
ДопПараметры.Вставить("Значение", СсылкаНаОбъект);
ДопПараметры.Вставить("ПометкаУдаления", СсылкаНаОбъект.ПометкаУдаления);
Если СсылкаНаОбъект.ПометкаУдаления Тогда
ДопПараметры.Вставить("Предупреждение", "Выбран контрагент, помеченный на удаление!");
КонецЕсли;
ДанныеВыбора.Добавить(СсылкаНаОбъект, ЭлементИзСписка.Представление, , ДопПараметры);
КонецЦикла;
КонецПроцедуры
Выясним причину, по которой элементы с пометкой на удаление могут скрываться или отображаться некорректно в конкретном поле формы. Зачастую это связано со свойствами элемента формы или реквизита.
Посмотрим на последовательность настройки через свойства реквизита или элемента формы:
ПометкаУдаления.Ложь, если требуется на уровне формы жестко запретить выбор удаленных объектов.Проанализируем ключевые особенности поведения платформы 1С при работе с выпадающими списками ввода по строке:
ПометкаУдаления.ОбработкаПолученияДанныхВыбора вызывается при вводе каждого символа пользователем. Запросы внутри этого обработчика должны быть максимально простыми и использовать индексированные поля, чтобы избежать задержек в интерфейсе.