Как в ЗУП 3.1 ограничить поиск сотрудников по организации при использовании Ctrl+F в документах?

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

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

Понимание механики работы поиска и выбора в управляемых формах

Для начала проанализируем ситуацию. Когда пользователь нажимает Ctrl+F в табличной части или начинает вводить фамилию в ячейке «Сотрудник», платформа инициирует процесс получения данных выбора. Основная проблема, с которой сталкиваются разработчики, заключается в том, что модуль менеджера справочника Сотрудники, где отрабатывает событие ОбработкаПолученияДанныхВыбора, работает в контексте сервера и «не знает», из какой формы или какого документа пришел запрос. Чтобы передать туда значение организации, необходимо использовать стандартные механизмы платформы 1С:Предприятие 8.3.

Решение 1. Использование механизма «Связи параметров выбора»

Это самый правильный и «чистый» способ с точки зрения архитектуры платформы. Он позволяет автоматически прокидывать значения из реквизитов шапки документа в параметры выбора реквизитов табличной части. Разберем по шагам, как это настроить:

  1. Откроем конфигуратор и найдем необходимый документ (например, Премия или МатериальнаяПомощь).
  2. Перейдем к табличной части и выберем реквизит Сотрудник.
  3. В свойствах реквизита найдем пункт Связи параметров выбора.
  4. Нажмем на кнопку выбора (три точки) и добавим новую связь:
    • Параметр выбора: выберем Отбор.ТекущаяОрганизация (или Отбор.Организация, в зависимости от того, как настроен прием параметров в справочнике).
    • Поле выбора: укажем путь к реквизиту шапки документа, например, Объект.Организация.

Почему это работает? Когда установлена связь, платформа при вызове поиска сама добавляет в структуру Параметры элемент Отбор, содержащий выбранную организацию. Теперь в модуле менеджера справочника Сотрудники в процедуре ОбработкаПолученияДанныхВыбора этот отбор будет доступен автоматически.

Решение 2. Программная установка параметров выбора в форме

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

Для этого в модуле формы документа найдем (или создадим) обработчик события ПриИзменении для реквизита Организация. Нам нужно обновить свойства колонки табличной части:


&НаКлиенте
Процедура ОрганизацияПриИзменении(Элемент)
    УстановитьФильтрСотрудников();
КонецПроцедуры

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

Теперь при любом взаимодействии с колонкой «Сотрудник», будь то выпадающий список или Ctrl+F, в модуль менеджера уйдет жестко заданный фильтр по организации из шапки.

Решение 3. Обработка данных в модуле менеджера (Extension)

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


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

КонецПроцедуры

Нюансы поиска через Ctrl+F в табличных частях

Важно проанализировать различие между автоподбором (ввод текста в ячейку) и поиском в списке (Ctrl+F). В случае с Ctrl+F, если платформа открывает стандартное окно поиска по колонке, она пытается сопоставить введенный текст со значениями в базе. Если у колонки на форме не настроены Связи параметров выбора, то поиск будет производиться по всему справочнику без учета контекста документа. Именно поэтому настройка свойств элемента формы (как в Решении 1 и 2) является критически важной.

Специфика ЗУП 3.1: Сотрудники и Физические лица

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

Если поиск все равно выдает лишние результаты, проанализируйте, не включена ли в параметрах поиска опция «Искать везде». Также в ЗУП часто используется механизм Сотрудники.ДанныеВыбора, который учитывает увольнения и актуальность кадровых данных. Рекомендуется не писать свои запросы с нуля, а встраиваться в существующую структуру параметров, передавая Организация в стандартный отбор.

Резюме

Для решения задачи ограничения поиска по организации в ЗУП 3.1:

  1. Приоритетный вариант: Настройте Связи параметров выбора для реквизита табличной части в конфигураторе, связав Отбор.ТекущаяОрганизация с Объект.Организация.
  2. Если форма динамическая: Используйте программную установку ПараметрыВыбора в событии ПриСозданииНаСервере или ПриИзменении организации.
  3. Для глубокой кастомизации: Используйте расширение для модуля менеджера справочника Сотрудники, чтобы обрабатывать входящую структуру Параметры.Отбор в процедуре ОбработкаПолученияДанныхВыбора.

Эти действия позволят сделать поиск предсказуемым для пользователя и избавят от необходимости ручного пролистывания огромных списков Ивановых из разных филиалов предприятия.

← На главную