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

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

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

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

Ограничение видимости в форме выбора

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

Для реализации простейшего фильтра по пометке удаления в процедуре ПриОткрытии формы выбора следует прописать программную установку отбора. Рассмотрим пример кода:


Процедура ПриОткрытии()
    // Устанавливаем доступность и значение отбора по пометке на удаление
    ЭлементыФормы.СправочникСписок.НастройкаОтбора.ПометкаУдаления.Доступность = Истина;
    Отбор.ПометкаУдаления.Использование = Истина;
    Отбор.ПометкаУдаления.Значение = Ложь;
КонецПроцедуры

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

Решение проблемы ввода по строке (автоподбор)

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

Разберем, как это работает. В событии АвтоПодбор мы можем перехватить ввод пользователя и подсунуть системе свой список значений:


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

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

Скрытие неиспользуемых физических лиц

Вторая часть задачи — скрыть тех, кто «вообще ни в одних документах не участвовал». Выполнять поиск ссылок в реальном времени при открытии формы — крайне плохая идея, так как метод НайтиПоСсылкам работает медленно и может «повесить» систему на больших базах.

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

  1. Создадим новый РегистрСведений (например, ИспользуемыеФизЛица) или добавим реквизит типа Булево в справочник ФизическиеЛица.
  2. Создадим Подписку на событие ПередЗаписью для всех документов, где выбираются физические лица.
  3. В обработчике подписки будем проверять физлицо и устанавливать ему признак «Используется», если оно выбрано в документе.
  4. Для первоначального заполнения признака напишем разовую обработку, которая один раз просканирует базу.

После этого в запросе отбора (в форме выбора или автоподборе) мы просто добавим условие по этому признаку:


// В условии запроса
|ГДЕ ФизическиеЛица.ЭтоИспользуемыйОбъект = ИСТИНА

Радикальный метод: Ограничение на уровне записей (RLS)

Если нам нужно гарантированно скрыть данные во всей базе (в списках, отчетах, вводе по строке и глобальном поиске), самым правильным инструментом будет RLS (Record Level Security). Мы можем настроить ограничение прав доступа для ролей пользователей.

Выясним, как настроить RLS для этой задачи:

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

ГДЕ ПометкаУдаления = ЛОЖЬ

Важное предостережение: Использование RLS может существенно замедлить работу системы, если условия сложные. Однако для простого фильтра по булеву полю ПометкаУдаления влияние на производительность обычно минимально. Также помните, что если в старых документах были выбраны эти лица, пользователи увидят вместо фамилий надпись <Объект не найден>, так как права на чтение этих записей у них теперь нет.

Резюме

Подводя итог, выбор метода зависит от критичности задачи:

Рекомендуется начать с замены дублей через стандартную обработку «Поиск и замена дублей», так как часто проблема «лишних» людей в списке вызвана именно неаккуратным ведением базы, а не отсутствием фильтров.

← На главную