Как скрыть помеченные на удаление объекты при поиске по строке в 1С:Бухгалтерия предприятия 2.0?

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

При работе в конфигурации 1С:Бухгалтерия предприятия 2.0 (БП 2.0) пользователи часто сталкиваются с неудобством: при поиске сотрудника или физического лица по первым буквам фамилии в выпадающем списке отображаются все объекты, включая те, что помечены на удаление. Это замедляет работу и приводит к ошибкам выбора неактуальных данных. Рассмотрим подробно, как решить эту задачу, учитывая архитектурные особенности БП 2.0, которая базируется на обычных формах.

Анализ проблемы и выбор метода решения

Прежде всего, проанализируем ситуацию. В 1С существует несколько механизмов поиска по строке. В современных конфигурациях на управляемых формах (УФ) эта задача решается одной строчкой кода в модуле менеджера. Однако в БП 2.0 ситуация сложнее, так как стандартные свойства элементов управления в обычных формах не всегда позволяют гибко управлять списком быстрого выбора. Нам необходимо добиться того, чтобы при вводе текста в поле «Физлицо» система автоматически отсекала записи с установленным флагом ПометкаУдаления.

Разберем по шагам несколько вариантов решения: от простой настройки свойств до программного перехвата событий.

Решение 1. Использование свойства «Параметры выбора» в конфигураторе

Это самый быстрый и предпочтительный метод, если платформа и версия конфигурации поддерживают его корректную отработку для конкретного реквизита. Выясним, как настроить этот отбор без написания сложного кода.

  1. Откроем Конфигуратор и найдем нужный документ (или справочник), в котором необходимо ограничить выбор физических лиц.
  2. Перейдем на закладку «Данные» и найдем реквизит ФизЛицо (или аналогичный).
  3. В окне свойств реквизита найдем пункт Параметры выбора.
  4. Нажмем на кнопку выбора (три точки) и добавим новый элемент отбора: ПометкаУдаления со значением Ложь.

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

Решение 2. Программный перехват события «АвтоПодбор» (Обычные формы)

Проанализируем ситуацию, когда стандартные свойства не справляются. В обычных формах у элемента управления «Поле ввода» есть мощное событие АвтоПодбор. Оно срабатывает в тот момент, когда пользователь начинает набирать текст. Мы можем вмешаться в этот процесс, подменить стандартный поиск своим запросом и выдать пользователю только «чистые» данные.

Рассмотрим пример кода, который нужно разместить в модуле формы документа:


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

Разберем подробнее, что мы сделали. Мы установили СтандартнаяОбработка = Ложь, чтобы система не выполняла поиск сама. Затем с помощью ПОДОБНО нашли всех физлиц, чьи имена начинаются с введенного текста, добавив критически важное условие И НЕ ФизЛица.ПометкаУдаления. Сформированный СписокЗначений мы передали в параметр ДанныеВыбора, который платформа использует для отрисовки выпадающего списка под полем ввода.

Решение 3. Метод модуля менеджера «ОбработкаПолученияДанныхВыбора»

Если вы используете версию БП 2.0 на современной платформе (8.3.x) и хотите внедрить решение, которое будет работать глобально во всей программе, посмотрим на метод модуля менеджера. Несмотря на то, что БП 2.0 использует обычные формы, платформа при определенных условиях вызывает этот обработчик даже для них.

Рассмотрим, как реализовать это в модуле менеджера справочника ФизическиеЛица:

  1. Найдем справочник ФизическиеЛица в дереве метаданных.
  2. Нажмем правой кнопкой мыши — «Открыть модуль менеджера».
  3. Добавим следующий код:

Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    
    // Если в параметрах уже есть отбор, добавим в него условие
    // Если отбора нет, создадим структуру и вставим условие
    Если Параметры.Свойство("Отбор") Тогда
        Если ТипЗнч(Параметры.Отбор) = Тип("Структура") Тогда
            Параметры.Отбор.Вставить("ПометкаУдаления", Ложь);
        КонецЕсли;
    КонецЕсли;
    
    // Мы не отключаем стандартную обработку, а просто модифицируем 
    // параметры, с которыми платформа будет выполнять поиск.
    
КонецПроцедуры

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

Решение 4. Использование RLS (Ограничение прав доступа)

Выясним, существует ли радикальный способ решить задачу без программирования каждой формы. Да, это использование RLS (Record Level Security). Если в организации настроены профили доступа, можно создать роль, которая запрещает чтение объектов с установленной пометкой удаления.

Важные последствия применения RLS:

Этот метод подходит только для тех случаев, когда удаленные объекты действительно больше никогда не должны фигурировать в учете.

Решение 5. Свойство «Быстрый выбор» в метаданных

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

Итоги и рекомендации

Подводя итог, можно сказать, что для 1С:Бухгалтерии 2.0 наиболее надежным и точечным методом является использование события АвтоПодбор в формах, где это критично. Однако, если вы хотите решить задачу системно, попробуйте реализовать ОбработкаПолученияДанныхВыбора в модуле менеджера — это сэкономит массу времени в будущем при обновлении конфигурации или добавлении новых документов.

Не забывайте, что при поиске по строке платформа также учитывает индексацию полей. Убедитесь, что у справочника ФизическиеЛица включен полнотекстовый поиск, если вы планируете искать не только по началу строки, но и по вхождению слов.

← На главную