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