В процессе сопровождения старых конфигураций на базе обычных форм (таких как 1С:Бухгалтерия предприятия 2.0) часто возникает задача «наведения порядка» в справочниках. Одной из типичных просьб пользователей является скрытие лишних записей в справочнике ФизическиеЛица, чтобы они не мешали при выборе в документах. Особенно это актуально для баз с большим количеством дублей или уволенных сотрудников.
В данной статье мы разберем комплексное решение задачи: как скрыть элементы, помеченные на удаление, и тех лиц, которые не участвуют в документообороте, а также решим проблему их появления в подсказках при вводе по строке.
Первым делом проанализируем, как ограничить список в стандартной форме выбора справочника. Поскольку мы работаем с обычными формами, механизм ОбработкаПолученияДанныхВыбора нам недоступен (он появился только в управляемом приложении). Нам необходимо внести изменения непосредственно в форму выбора справочника ФизическиеЛица.
Для реализации простейшего фильтра по пометке удаления в процедуре ПриОткрытии формы выбора следует прописать программную установку отбора. Рассмотрим пример кода:
Процедура ПриОткрытии()
// Устанавливаем доступность и значение отбора по пометке на удаление
ЭлементыФормы.СправочникСписок.НастройкаОтбора.ПометкаУдаления.Доступность = Истина;
Отбор.ПометкаУдаления.Использование = Истина;
Отбор.ПометкаУдаления.Значение = Ложь;
КонецПроцедуры
Важный нюанс: Этот метод скроет помеченные элементы только при непосредственном открытии формы выбора. Однако пользователи часто используют «ввод по строке» прямо в поле документа, и здесь этот отбор не сработает.
Когда пользователь начинает набирать фамилию в поле ввода, система предлагает список подходящих вариантов. В обычных формах этот список игнорирует настройки отбора формы выбора. Чтобы исключить помеченные на удаление записи из этих подсказок, мы можем использовать событие АвтоПодбор у соответствующего элемента формы в документе.
Разберем, как это работает. В событии АвтоПодбор мы можем перехватить ввод пользователя и подсунуть системе свой список значений:
Процедура ФизическоеЛицоАвтоПодбор(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отключаем стандартный поиск
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 10
| ФизическиеЛица.Ссылка КАК Ссылка
|ИЗ
| Справочник.ФизическиеЛица КАК ФизическиеЛица
|ГДЕ
| ФизическиеЛица.Наименование ПОДОБНО &Текст + ""%""
| И ФизическиеЛица.ПометкаУдаления = ЛОЖЬ";
Запрос.УстановитьПараметр("Текст", Текст);
Результат = Запрос.Выполнить();
СписокВыбора = Новый СписокЗначений;
СписокВыбора.ЗагрузитьЗначения(Результат.Выгрузить().ВыгрузитьКолонку("Ссылка"));
ДанныеВыбора = СписокВыбора;
КонецПроцедуры
Этот способ эффективен, но требует внесения изменений в каждое поле выбора физического лица во всех документах, что может быть трудозатратно.
Вторая часть задачи — скрыть тех, кто «вообще ни в одних документах не участвовал». Выполнять поиск ссылок в реальном времени при открытии формы — крайне плохая идея, так как метод НайтиПоСсылкам работает медленно и может «повесить» систему на больших базах.
Проанализируем более оптимальный подход — использование вспомогательного признака. Рассмотрим алгоритм реализации:
РегистрСведений (например, ИспользуемыеФизЛица) или добавим реквизит типа Булево в справочник ФизическиеЛица.ПередЗаписью для всех документов, где выбираются физические лица.После этого в запросе отбора (в форме выбора или автоподборе) мы просто добавим условие по этому признаку:
// В условии запроса
|ГДЕ ФизическиеЛица.ЭтоИспользуемыйОбъект = ИСТИНА
Если нам нужно гарантированно скрыть данные во всей базе (в списках, отчетах, вводе по строке и глобальном поиске), самым правильным инструментом будет RLS (Record Level Security). Мы можем настроить ограничение прав доступа для ролей пользователей.
Выясним, как настроить RLS для этой задачи:
ФизическиеЛица и право «Чтение».
ГДЕ ПометкаУдаления = ЛОЖЬ
Важное предостережение: Использование RLS может существенно замедлить работу системы, если условия сложные. Однако для простого фильтра по булеву полю ПометкаУдаления влияние на производительность обычно минимально. Также помните, что если в старых документах были выбраны эти лица, пользователи увидят вместо фамилий надпись <Объект не найден>, так как права на чтение этих записей у них теперь нет.
Подводя итог, выбор метода зависит от критичности задачи:
ПриОткрытии.АвтоПодбор.RLS.Рекомендуется начать с замены дублей через стандартную обработку «Поиск и замена дублей», так как часто проблема «лишних» людей в списке вызвана именно неаккуратным ведением базы, а не отсутствием фильтров.