При работе в конфигурации 1С:Зарплата и управление персоналом 3.1 часто возникает необходимость не просто показать список сотрудников, а ограничить его по определенным критериям при вводе ФИО в строке документа. Например, нужно отобразить только работающих сотрудников конкретного подразделения или исключить договорников ГПХ. В данной статье мы подробно проанализируем механизмы платформы 8.3, которые позволяют управлять этим списком.
Одним из самых мощных инструментов для управления выпадающим списком является обработчик ОбработкаПолученияДанныхВыбора. Эта процедура располагается в модуле менеджера объекта (в нашем случае — справочника Сотрудники). Однако, поскольку ЗУП 3.1 — типовая конфигурация, мы крайне рекомендуем вносить изменения через механизм расширений, чтобы сохранить поддержку программы.
Разберем, как работает этот механизм. Когда пользователь начинает вводить текст в поле ввода, платформа обращается к серверу за данными. Процедура ОбработкаПолученияДанныхВыбора перехватывает этот запрос. Рассмотрим её параметры:
ДанныеВыбора — именно сюда мы поместим наш отфильтрованный список.Параметры — содержит строку поиска и другие настройки отбора.СтандартнаяОбработка — если установить ее в Ложь, платформа не будет строить список сама, а покажет то, что мы подготовили.Проанализируем пример кода для реализации в расширении:
&Вместо("ОбработкаПолученияДанныхВыбора")
Процедура Расш1_ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
// Если нам нужно ограничить выбор только в конкретном случае
Если Параметры.Свойство("НуженОсобыйФильтр") Тогда
СтандартнаяОбработка = Ложь;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Сотрудники.Ссылка КАК Ссылка,
| Сотрудники.Наименование КАК Наименование
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|ГДЕ
| Сотрудники.Наименование ПОДОБНО &ТекстПоиска
| И Сотрудники.ВАрхиве = ЛОЖЬ"; // Пример условия
Запрос.УстановитьПараметр("ТекстПоиска", Параметры.СтрокаПоиска + "%");
Список = Новый СписокЗначений;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Список.Добавить(Выборка.Ссылка, Выборка.Наименование);
КонецЦикла;
ДанныеВыбора = Список;
КонецЕсли;
КонецПроцедуры
Важно помнить, что в 1С:ЗУП 3.1 логика выбора сотрудников часто вынесена в специализированный общий модуль СотрудникиРасширенный. Поэтому для корректной работы следует проанализировать вызовы именно в этом модуле.
Если задача состоит в том, чтобы ограничить список только в одной конкретной форме одного документа, лучше всего использовать событие элемента формы АвтоПодбор. Это позволит не затрагивать глобальную логику справочника Сотрудники.
Рассмотрим порядок действий:
АвтоПодбор.В этом обработчике мы можем программно сформировать ДанныеВыбора. Выясним причину выбора этого метода: он работает на стороне клиента/сервера конкретной формы и позволяет гибко использовать данные самого документа (например, дату документа или выбранную организацию), которые еще не записаны в базу.
Процедура СотрудникАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Формируем структуру параметров для получения данных
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("СтрокаПоиска", Текст);
// Вызываем серверную функцию для получения списка сотрудников
ДанныеВыбора = ПолучитьСписокСотрудниковНаСервере(ПараметрыЗапроса);
КонецПроцедуры
Зачастую программирование вообще не требуется. Платформа 1С предоставляет мощные визуальные средства настройки в окне свойств элемента формы. Посмотрим на два ключевых свойства:
1. Параметры выбора (ChoiceParameters). Здесь мы можем задать статический фильтр. Например, если нам нужно, чтобы в списке появлялись только сотрудники, не являющиеся внешними совместителями. Мы добавляем новый элемент отбора: Отбор.ВидЗанятости(ВидЗанятости.ОсновноеМестоРаботы).
2. Связи параметров выбора (ChoiceParameterLinks). Это свойство незаменимо, когда список сотрудников должен зависеть от другого реквизита формы. Например, если в документе выбрана Организация, мы можем связать поле сотрудника с этим реквизитом. Платформа автоматически добавит условие ГДЕ Организация = &ОрганизацияИзФормы в запрос автоподбора.
В некоторых случаях список сотрудников может быть настолько мал и специфичен (например, только ответственные лица), что полноценный поиск по справочнику излишен. Тогда мы можем использовать выбор из списка.
Для этого в свойствах поля ввода установим РежимВыбораИзСписка в значение Истина. Проанализируем, как заполнить этот список. Лучше всего это сделать в процедуре ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Заполняем фиксированный список выбора
Элементы.Сотрудник.СписокВыбора.Очистить();
СписокСотрудников = ПолучитьСписокНужныхСотрудников(); // Ваша функция получения данных
Для Каждого ТекСотрудник Из СписокСотрудников Цикл
Элементы.Сотрудник.СписокВыбора.Добавить(ТекСотрудник.Ссылка, ТекСотрудник.ФИО);
КонецЦикла;
КонецПроцедуры
При таком подходе пользователь при нажатии на кнопку выбора или начале ввода увидит только те значения, которые мы явно добавили в список. Это максимально ограничивает действия пользователя и предотвращает ошибки ввода.
При реализации программного подбора (Методы 1 и 2) необходимо учитывать скорость работы системы. По умолчанию в платформе установлено свойство АвтоПодборОжидание, равное 0.75 секунды. Это означает, что запрос к базе данных отправляется почти после каждого нажатого символа.
Если алгоритм формирования списка сложный (включает расчет остатков отпусков или проверку графиков работы), это может привести к задержкам интерфейса. В таких ситуациях мы рекомендуем:
Наименование, Код).ВЫБРАТЬ ПЕРВЫЕ 50, так как пользователь все равно не увидит более длинный список в выпадающем окне.Таким образом, выбор метода зависит от глобальности задачи. Если ограничение должно действовать во всей системе — используем модуль менеджера и ОбработкаПолученияДанныхВыбора. Если ограничение локальное для одной формы — используем свойства элемента или событие АвтоПодбор.