Как ограничить список сотрудников при вводе по строке в 1С:ЗУП 3.1

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

При работе в конфигурации 1С:Зарплата и управление персоналом 3.1 часто возникает необходимость не просто показать список сотрудников, а ограничить его по определенным критериям при вводе ФИО в строке документа. Например, нужно отобразить только работающих сотрудников конкретного подразделения или исключить договорников ГПХ. В данной статье мы подробно проанализируем механизмы платформы 8.3, которые позволяют управлять этим списком.

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

Одним из самых мощных инструментов для управления выпадающим списком является обработчик ОбработкаПолученияДанныхВыбора. Эта процедура располагается в модуле менеджера объекта (в нашем случае — справочника Сотрудники). Однако, поскольку ЗУП 3.1 — типовая конфигурация, мы крайне рекомендуем вносить изменения через механизм расширений, чтобы сохранить поддержку программы.

Разберем, как работает этот механизм. Когда пользователь начинает вводить текст в поле ввода, платформа обращается к серверу за данными. Процедура ОбработкаПолученияДанныхВыбора перехватывает этот запрос. Рассмотрим её параметры:

  1. ДанныеВыбора — именно сюда мы поместим наш отфильтрованный список.
  2. Параметры — содержит строку поиска и другие настройки отбора.
  3. СтандартнаяОбработка — если установить ее в Ложь, платформа не будет строить список сама, а покажет то, что мы подготовили.

Проанализируем пример кода для реализации в расширении:


&Вместо("ОбработкаПолученияДанныхВыбора")
Процедура Расш1_ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    
    // Если нам нужно ограничить выбор только в конкретном случае
    Если Параметры.Свойство("НуженОсобыйФильтр") Тогда
        СтандартнаяОбработка = Ложь;
        
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ РАЗРЕШЕННЫЕ
            |   Сотрудники.Ссылка КАК Ссылка,
            |   Сотрудники.Наименование КАК Наименование
            |ИЗ
            |   Справочник.Сотрудники КАК Сотрудники
            |ГДЕ
            |   Сотрудники.Наименование ПОДОБНО &ТекстПоиска
            |   И Сотрудники.ВАрхиве = ЛОЖЬ"; // Пример условия
            
        Запрос.УстановитьПараметр("ТекстПоиска", Параметры.СтрокаПоиска + "%");
        
        Список = Новый СписокЗначений;
        Выборка = Запрос.Выполнить().Выбрать();
        
        Пока Выборка.Следующий() Цикл
            Список.Добавить(Выборка.Ссылка, Выборка.Наименование);
        КонецЦикла;
        
        ДанныеВыбора = Список;
    КонецЕсли;
    
КонецПроцедуры

Важно помнить, что в 1С:ЗУП 3.1 логика выбора сотрудников часто вынесена в специализированный общий модуль СотрудникиРасширенный. Поэтому для корректной работы следует проанализировать вызовы именно в этом модуле.

Метод 2: Событие элемента формы АвтоПодбор

Если задача состоит в том, чтобы ограничить список только в одной конкретной форме одного документа, лучше всего использовать событие элемента формы АвтоПодбор. Это позволит не затрагивать глобальную логику справочника Сотрудники.

Рассмотрим порядок действий:

  1. Откроем форму документа в конфигураторе.
  2. Выберем поле ввода сотрудника и перейдем в его события.
  3. Создадим обработчик АвтоПодбор.

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


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

Метод 3: Свойства "Параметры выбора" и "Связи параметров выбора"

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

1. Параметры выбора (ChoiceParameters). Здесь мы можем задать статический фильтр. Например, если нам нужно, чтобы в списке появлялись только сотрудники, не являющиеся внешними совместителями. Мы добавляем новый элемент отбора: Отбор.ВидЗанятости(ВидЗанятости.ОсновноеМестоРаботы).

2. Связи параметров выбора (ChoiceParameterLinks). Это свойство незаменимо, когда список сотрудников должен зависеть от другого реквизита формы. Например, если в документе выбрана Организация, мы можем связать поле сотрудника с этим реквизитом. Платформа автоматически добавит условие ГДЕ Организация = &ОрганизацияИзФормы в запрос автоподбора.

Метод 4: Режим выбора из списка (ChoiceList)

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

Для этого в свойствах поля ввода установим РежимВыбораИзСписка в значение Истина. Проанализируем, как заполнить этот список. Лучше всего это сделать в процедуре ПриСозданииНаСервере:


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

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

Рекомендации по производительности

При реализации программного подбора (Методы 1 и 2) необходимо учитывать скорость работы системы. По умолчанию в платформе установлено свойство АвтоПодборОжидание, равное 0.75 секунды. Это означает, что запрос к базе данных отправляется почти после каждого нажатого символа.

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

Таким образом, выбор метода зависит от глобальности задачи. Если ограничение должно действовать во всей системе — используем модуль менеджера и ОбработкаПолученияДанныхВыбора. Если ограничение локальное для одной формы — используем свойства элемента или событие АвтоПодбор.

← На главную