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