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

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

При разработке интерфейсов в 1С часто возникает задача ограничить список доступных значений для выбора в поле ввода. Если для выбора элемента мы используем стандартную форму выбора, настроить отбор достаточно просто. Однако, когда пользователь начинает вводить текст в поле (используя механизм «Ввод по строке»), стандартные ограничения формы выбора перестают работать. Давайте разберем, как правильно реализовать такое ограничение и какие методы для этого существуют.

Метод 1: Использование параметров выбора (рекомендуемый способ)

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

Чтобы реализовать этот подход, выполним следующие шаги:

  1. Создадим на сервере массив или список доступных значений (в нашем случае — массив допустимых сотрудников).
  2. Создадим объект ПараметрВыбора, передав в него имя отбора (например, Отбор.Ссылка) и полученный массив.
  3. Установим полученные параметры в свойство ПараметрыВыбора элемента формы.

Рассмотрим пример реализации такой логики в модуле формы:


&НаСервере
Процедура ЗаполнитьПараметрыВыбора()
    // Получаем массив доступных сотрудников на сервере
    МассивСотрудников = ПолучитьМассивСотрудников();
    
    // Создаем параметр выбора для ограничения по ссылке
    ПараметрВыбора = Новый ПараметрВыбора("Отбор.Ссылка", МассивСотрудников);
    
    // Формируем фиксированный массив для установки параметров
    МассивПараметровВыбора = Новый Массив;
    МассивПараметровВыбора.Добавить(ПараметрВыбора);
    ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметровВыбора);
    
    // Применяем параметры к элементу формы
    Элементы.Сотрудник.ПараметрыВыбора = ПараметрыВыбора;
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ЗаполнитьПараметрыВыбора();
КонецПроцедуры

Этот метод предпочтителен, так как он не требует ручного вмешательства в процесс обработки ввода текста и работает стабильно во всех сценариях выбора данных.

Метод 2: Использование обработчика ОбработкаПолученияДанныхВыбора

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

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

  1. Производительность: Поскольку код выполняется при каждом нажатии клавиши, важно избегать тяжелых запросов. Обязательно кэшируйте результаты вычислений.
  2. Контекст: В обработчик передаются параметры, в которые можно программно добавлять необходимые отборы.

Пример использования обработчика:


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

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

Важные рекомендации по безопасности и производительности

При решении задач ограничения видимости данных необходимо помнить о следующем:

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

← На главную