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