В процессе длительной эксплуатации учетной системы в справочниках накапливается большое количество устаревших или ошибочно созданных записей (номенклатура, бизнес-регионы, контрагенты, партнеры). Удалить их напрямую нельзя, так как на них ссылаются проведенные документы прошлых периодов. Распространенное решение — перенести весь неактуальный массив данных в специальную архивную папку. Однако сразу возникает задача: запретить пользователям выбирать элементы из этой папки в новых документах и формах ввода.
Проанализируем различные способы решения этой задачи в конфигурациях на платформе 1С:Предприятие 8.3 (управляемые формы) — от простых платформенных настроек без программирования до переопределения обработчиков в модуле менеджера и настройки прав доступа (RLS).
Если требуется централизованно запретить быстрый ввод и автоподбор элементов из архивной группы во всех документах конфигурации, наиболее правильным решением является использование событий модуля менеджера справочника. Разберем по шагам, как это реализовать.
В модуле менеджера справочника (например, Справочник.БизнесРегионы или Справочник.Номенклатура) переопределим процедуру ОбработкаПолученияДанныхВыбора. Это событие отвечает за генерацию выпадающего списка при вводе по строке и быстром подборе.
Посмотрим на пример реализации:
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, ПараметрыВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Получаем ссылку на архивную папку (можно хранить в предопределенных или константе)
АрхивнаяПапка = Справочники.БизнесРегионы.НайтиПоНаименованию("Архив");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 50
| Спр.Ссылка КАК Ссылка,
| Спр.Наименование КАК Представление
|ИЗ
| Справочник.БизнесРегионы КАК Спр
|ГДЕ
| Спр.Наименование ПОДОБНО &СтрокаПоиска + ""%""
| И НЕ Спр.Ссылка В ИЕРАРХИИ (&АрхивнаяПапка)
| И НЕ Спр.ПометкаУдаления
| И НЕ Спр.ЭтоГруппа";
Запрос.УстановитьПараметр("СтрокаПоиска", ПараметрыВыбора.СтрокаПоиска);
Запрос.УстановитьПараметр("АрхивнаяПапка", АрхивнаяПапка);
ДанныеВыбора = Новый СписокЗначений;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДанныеВыбора.Добавить(Выборка.Ссылка, Выборка.Представление);
КонецЦикла;
КонецПроцедуры
Такой подход гарантирует, что при наборе текста в поле ввода пользователю никогда не будут предложены элементы, находящиеся в архиве.
Если запрет требуется внедрить точечно в конкретных документах или реквизитах без редактирования модуля объекта, используем штатный механизм платформы — Параметры выбора (ChoiceParameters).
Отбор.Ссылка (или Отбор.Родитель);Не в иерархии;Элементы.Платформа 1С автоматически передаст этот отбор как в форму выбора при нажатии кнопки с многоточием, так и в алгоритм автоподбора при вводе текста.
Когда у справочника есть выделенная форма выбора или общая форма списка, используемая для подбора, настроим динамический список формы. Выясним причину: если пользователь открывает полноценное окно справочника, необходимо принудительно скрыть архивную папку из общего дерева и списка.
В модуле формы выбора в событии ПриСозданииНаСервере пропишем установку фиксированного отбора:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
АрхивнаяПапка = Справочники.БизнесРегионы.НайтиПоНаименованию("Архив");
Если ЗначениеЗаполнено(АрхивнаяПапка) Тогда
ЭлементОтбора = Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВИерархии;
ЭлементОтбора.ПравоеЗначение = АрхивнаяПапка;
ЭлементОтбора.Использование = Истина;
КонецЕсли;
КонецПроцедуры
Использование ФиксированныеНастройки.Отбор гарантирует, что пользователь не сможет вручную отключить данный фильтр через стандартное меню настроек списка.
В типовых конфигурациях (например, «1С:Управление торговлей 11», «1С:ERP») существует возможность разграничения прав по группам доступа номенклатуры или партнеров с использованием RLS.
Рассмотрим, как настроить данный механизм:
Важное предостережение: использование RLS полностью скрывает записи из базы данных для пользователей с ограниченными правами. Это означает, что в исторических проведенных документах и аналитических отчетах на месте архивных элементов пользователи увидят надпись <Объект не найден>. Если требуется сохранить читаемость истории, RLS использовать нельзя.
Для комплексного решения задачи очистки справочников рекомендуется учесть следующие нюансы:
ИсторияВыбора.Очистить() или пользовательское меню.[АРХИВ] или zzz_ перемещает элементы в конец списка при алфавитной сортировке и наглядно предупреждает пользователей.Недействителен. При его включении система автоматически скрывает позицию из списков подбора без необходимости переноса по иерархии папок.