Почему при выборе элемента, помеченного на удаление, не появляется предупреждение в 1С?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При работе в управляемых формах 1С пользователи часто сталкиваются с неодинаковым поведением полей ввода при автоподборе. Например, если скопировать и вставить в поле ввода наименование подразделения, помеченного на удаление, платформа выдаст предупреждение о том, что элемент удален. Однако при аналогичном вводе физического лица предупреждение не появляется, и элемент подставляется в реквизит напрямую. Разберем детально, почему так происходит, как платформенные механизмы обрабатывают выбор значений и как настроить корректное поведение программы.

Анализ механизма автоподбора и выпадающих списков

Поведение платформы при вводе текста в поле зависит от того, каким образом формируются данные выпадающего списка:

  1. Прямой поиск по коду или системным реквизитам: когда пользователь вводит точный код объекта, платформа выполняет прямое позиционирование. Объект считывается из базы напрямую, и платформа штатно показывает системное окно с предупреждением о наличии пометки на удаление.
  2. Поиск по текстовой подстроке (наименованию, ФИО): в этом сценарии платформа вызывает событие менеджера ОбработкаПолученияДанныхВыбора. Если в модуле менеджера справочника стандартная обработка отключается через СтандартнаяОбработка = Ложь, встроенная проверка признака пометки на удаление больше не выполняется платформой автоматически. Список подбора формируется программно разработчиком конфигурации.

В типовых конфигурациях (например, в справочнике ФизическиеЛица) переопределена процедура ОбработкаПолученияДанныхВыбора для расширенного поиска по ФИО, ИНН, СНИЛС или дате рождения. Если в коллекцию ДанныеВыбора добавляются простые ссылки, платформа воспринимает их как обычные доступные значения и не выдает диалог подтверждения при клике.

Структура данных для отображения предупреждения

Рассмотрим, как платформа 1С на уровне синтаксис-помощника управляет элементами списка выбора в управляемом интерфейсе. В выпадающий список ДанныеВыбора можно помещать не только простые значения (ссылки), но и специальную структуру со строгим составом свойств:

  1. Значение (Value): ссылка на элемент справочника (обязательное свойство структуры).
  2. ПометкаУдаления (DeletionMark): булево значение. Если установлено в Истина, платформа при выборе данного пункта из списка отобразит стандартное предупреждение о том, что элемент помечен на удаление.
  3. Предупреждение (Warning): строка, содержащая пользовательский текст предупреждения, который отобразится в диалоговом окне при выборе.

Если в программно сформированном списке свойство ПометкаУдаления не заполнено внутри структуры элемента, предупреждение показано не будет.

Способы решения и программной настройки

Разберем основные варианты настройки поведения системы при выборе физических лиц и других справочников.

Вариант 1. Переопределение процедуры автоподбора с выводом предупреждения

Для того чтобы платформа штатно предупреждала пользователя при выборе помеченного на удаление элемента из выпадающего меню быстрого ввода, перехватим процедуру ОбработкаПолученияДанныхВыбора в модуле менеджера справочника (например, через расширение конфигурации) и заполним ДанныеВыбора структурами:


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

При таком подходе при щелчке на элемент с пометкой удаления пользователь увидит системный диалог с подтверждением выбора.

Вариант 2. Полное исключение помеченных на удаление объектов из подбора

Если бизнес-логика требует полностью скрыть удаленные элементы из подсказок быстрого ввода, достаточно добавить фильтрацию в запрос формирования данных:


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

Вариант 3. Настройка параметров выбора в свойствах поля

В ряде случаев ограничение можно настроить без изменения программного кода. В свойствах реквизита объекта или поля формы найдем свойство ПараметрыВыбора и добавим отбор Отбор.ПометкаУдаления(Ложь). Следует учитывать, что данный метод сработает только тогда, когда алгоритм в процедуре ОбработкаПолученияДанныхВыбора учитывает структуру Параметры.Отбор.

Контроль целостности данных

Проанализируем важный нюанс: автоподбор и выбор из списка не защищают систему от выбора помеченного элемента через историю ввода или при программном заполнении реквизита. Если необходимо гарантировать запрет записи документов или объектов с помеченными на удаление элементами, рекомендуется использовать событие ОбработкаПроверкиЗаполнения:


Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    Если ЗначениеЗаполнено(ФизЛицо) И ФизЛицо.ПометкаУдаления Тогда
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
            "Выбранное физическое лицо помечено на удаление!",
            ,
            "ФизЛицо",
            ,
            Отказ);
    КонецЕсли;
КонецПроцедуры
← На главную