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