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