Как установить отбор во всех формах списка и выбора для скрытия помеченных на удаление элементов?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке и сопровождении крупных систем на базе 1С часто возникает задача: ограничить видимость элементов, которые были помечены на удаление, во всех возможных формах выбора и подбора. Это необходимо, чтобы пользователи случайно не выбирали неактуальные данные в новые документы. Хотя механизм RLS (Ограничение доступа на уровне записей) является самым надежным («железным») способом, он может создавать избыточную нагрузку на производительность. Рассмотрим альтернативные программные и архитектурные подходы, которые позволяют решить задачу на уровне интерфейса.

Метод 1. Использование расширений для глобального перехвата форм

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

Для реализации этого подхода нам потребуется создать расширение и добавить в него общий модуль с программным кодом, который будет вызываться при создании форм. Основная идея заключается в перехвате события ПриСозданииНаСервере для всех форм или для форм конкретных типов.

Разберем алгоритм действий по шагам:

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

Рассмотрим пример кода, который программно добавляет фиксированный отбор в динамический список при открытии формы:


&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверим, есть ли в форме основной реквизит типа ДинамическийСписок
    // и относится ли он к нашему справочнику
    Для Каждого Реквизит Из ЭтаФорма.Метаданные().Реквизиты Цикл
        Если Реквизит.Тип.СодержитТип(Тип("ДинамическийСписок")) Тогда
            СписокОбъекта = ЭтаФорма[Реквизит.Имя];
            
            // Убеждаемся, что список отображает нужный нам справочник
            Если СписокОбъекта.ОсновнаяТаблица = "Справочник.Номенклатура" Тогда
                
                // Находим или добавляем элемент отбора
                ЭлементОтбора = СписокОбъекта.КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
                ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПометкаУдаления");
                ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
                ЭлементОтбора.ПравоеЗначение = Ложь;
                ЭлементОтбора.Использование = Истина;
                ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
                
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Такой подход позволяет охватить сразу все формы списка, выбора и подбора, так как большинство из них используют ДинамическийСписок в качестве основного источника данных.

Метод 2. Управление выбором через Модуль менеджера

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

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


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

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

Метод 3. Настройка параметров выбора в метаданных

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

Для каждого реквизита (например, реквизит Товар в табличной части Товары документа РеализацияТоваровУслуг) можно установить свойство Параметры выбора. В этом поле можно жестко задать условие: Отбор.ПометкаУдаления(Ложь).

Плюсы этого метода:

Минусы:

Если справочник используется в сотнях мест, устанавливать параметры выбора вручную долго. В таком случае лучше использовать «Связи параметров выбора», если условие фильтрации зависит от других реквизитов формы.

Метод 4. Использование механизмов БСП (Библиотеки стандартных подсистем)

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

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

Ограничения программных методов

Разберем важные нюансы, которые необходимо учитывать при отказе от RLS в пользу программных отборов:

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

← На главную