Как отключить жесткий отбор «Оформлен по трудовому договору: Да» при выборе сотрудника в 1С:ЗУП 3.1?

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

При разработке внешних отчетов, обработок или создании новых реквизитов в пользовательских формах на платформе 1С:Предприятие 8.3 программисты часто сталкиваются со странным поведением системы. Вы добавляете на форму стандартное поле выбора с типом СправочникСсылка.Сотрудники, но при попытке интерактивного выбора система жестко ограничивает список. Накладывается неявный отбор «Оформлен по трудовому договору: Да», из-за чего в списке невозможно увидеть кандидатов, уволенных работников, сотрудников на договорах ГПХ (гражданско-правового характера) или тех, кто еще только готовится к приему на работу.

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

Выясняем причину: почему отбор накладывается «сам по себе»?

В конфигурациях «1С:Зарплата и управление персоналом 3.1» (а также в «1С:ERP» и «1С:Комплексная автоматизация») справочник Сотрудники является ключевым элементом кадрового учета. Его стандартная форма выбора (Справочник.Сотрудники.ФормаВыбора) спроектирована разработчиками фирмы «1С» как сложный инструмент, завязанный на бизнес-логику.

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

Когда мы нажимаем кнопку выбора «...» в поле ввода, платформа открывает основную форму выбора справочника. При инициализации этой формы на сервере (в обработчике ПриСозданииНаСервере) система считывает входящие параметры. Если никаких параметров разработчиком передано не было, конфигурация автоматически применяет настройки по умолчанию для защиты пользователя от ошибок. По умолчанию включаются жесткие фильтры: показывать только работающих сотрудников по трудовому договору и скрывать всех остальных. Так как этот отбор формируется динамически в коде самой формы выбора, в стандартных интерактивных настройках списка на форме внешнего отчета отключить его невозможно.

Разница между интерактивным выбором и автоподбором

Проанализируем интересную особенность, о которой часто упоминают разработчики: если начать вводить ФИО сотрудника руками прямо в текстовое поле, то отбор не применяется, и система позволяет выбрать любого сотрудника, даже не принятого на работу.

Этот феномен объясняется различием механизмов платформы:

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

Способ 1. Программное решение проблемы (для разработчиков)

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

Выполним это по шагам:

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

Рассмотрим пример готового кода для обработчика события:


&НаКлиенте
Процедура СотрудникНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    // Отменяем стандартное открытие формы выбора платформой
    СтандартнаяОбработка = Ложь; 
    
    // Создаем структуру параметров для управления поведением формы выбора ЗУП
    ПараметрыФормы = Новый Структура;
    
    // Разрешаем показ сотрудников, работающих по договорам ГПХ
    ПараметрыФормы.Вставить("ПоказыватьДоговорников", Истина); 
    ПараметрыФормы.Вставить("ВыбиратьГПХ", Истина);            
    ПараметрыФормы.Вставить("ИсключатьДоговорников", Ложь);     
    
    // Разрешаем отображение кандидатов и еще не принятых сотрудников
    ПараметрыФормы.Вставить("ПоказыватьНепринятых", Истина);   
    
    // Разрешаем отображение уже уволенных сотрудников (при необходимости)
    ПараметрыФормы.Вставить("ПоказыватьУволенных", Истина);     
    
    // Открываем типовую форму выбора, передавая наш элемент-владелец и структуру параметров
    ОткрытьФорму("Справочник.Сотрудники.ФормаВыбора", ПараметрыФормы, Элемент);
    
КонецПроцедуры

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

Способ 2. Исправление ошибок в данных (для администраторов)

Бывают ситуации, когда отбор «Оформлен по трудовому договору: Да» мешает выбрать сотрудников, которые фактически давно приняты на работу и успешно выполняют свои обязанности. Чаще всего эта проблема проявляется после переноса данных (конвертации) из старых баз (например, «1С:ЗиК 7.7» или «1С:ЗУП 2.5»).

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

Для исправления этой коллизии в пользовательском режиме выполним следующие действия:

  1. Перепроведение документов приема: Найдем документы «Прием на работу» или «Кадровый перевод» по проблемным сотрудникам. Выполним отмену проведения документов, а затем проведем их заново. Это заставит систему пересчитать кадровые срезы и заполнить недостающие флаги в регистрах сведений.
  2. Проверка через функции для технического специалиста: Если документов слишком много или перепроведение не помогает, перейдем в меню «Функции для технического специалиста» (в старых версиях — «Все функции»), найдем регистр сведений Текущие кадровые данные сотрудников. Найдем запись по нужному сотруднику и проверим заполнение колонок «Организация», «Подразделение», «Должность» и флага «Оформлен по трудовому договору». Если поля пусты — восстановим их корректность или воспользуемся встроенными обработками группового изменения реквизитов.

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

← На главную