При разработке внешних отчетов, обработок или создании новых реквизитов в пользовательских формах на платформе 1С:Предприятие 8.3 программисты часто сталкиваются со странным поведением системы. Вы добавляете на форму стандартное поле выбора с типом СправочникСсылка.Сотрудники, но при попытке интерактивного выбора система жестко ограничивает список. Накладывается неявный отбор «Оформлен по трудовому договору: Да», из-за чего в списке невозможно увидеть кандидатов, уволенных работников, сотрудников на договорах ГПХ (гражданско-правового характера) или тех, кто еще только готовится к приему на работу.
В этой статье мы подробно разберем, почему платформа ведет себя подобным образом, почему этот отбор «исчезает» при ручном вводе ФИО и как решить эту проблему программными методами, а также за счет корректировки данных в базе.
В конфигурациях «1С:Зарплата и управление персоналом 3.1» (а также в «1С:ERP» и «1С:Комплексная автоматизация») справочник Сотрудники является ключевым элементом кадрового учета. Его стандартная форма выбора (Справочник.Сотрудники.ФормаВыбора) спроектирована разработчиками фирмы «1С» как сложный инструмент, завязанный на бизнес-логику.
Динамический список в этой форме построен не на простой таблице справочника. Он использует сложное левое соединение физической таблицы сотрудников с виртуальными таблицами и регистрами сведений, ключевыми из которых являются:
Текущие кадровые данные сотрудниковДанные для подбора сотрудниковКогда мы нажимаем кнопку выбора «...» в поле ввода, платформа открывает основную форму выбора справочника. При инициализации этой формы на сервере (в обработчике ПриСозданииНаСервере) система считывает входящие параметры. Если никаких параметров разработчиком передано не было, конфигурация автоматически применяет настройки по умолчанию для защиты пользователя от ошибок. По умолчанию включаются жесткие фильтры: показывать только работающих сотрудников по трудовому договору и скрывать всех остальных. Так как этот отбор формируется динамически в коде самой формы выбора, в стандартных интерактивных настройках списка на форме внешнего отчета отключить его невозможно.
Проанализируем интересную особенность, о которой часто упоминают разработчики: если начать вводить ФИО сотрудника руками прямо в текстовое поле, то отбор не применяется, и система позволяет выбрать любого сотрудника, даже не принятого на работу.
Этот феномен объясняется различием механизмов платформы:
Справочник.Сотрудники.ФормаВыбора), где срабатывает серверный код инициализации параметров по умолчанию.Сотрудники, вызывая обработчик ОбработкаПолученияДанныхВыбора. В этом обработчике выполняются оптимизированные легкие запросы для текстового поиска, в которых жесткие ограничения по кадровому состоянию по умолчанию отсутствуют, если они не привязаны разработчиком через механизм «Связи параметров выбора» на форме.Самый надежный и правильный способ убрать жесткий отбор в кастомной форме или во внешнем отчете — переопределить стандартное событие выбора для элемента формы. Мы можем принудительно вызвать форму выбора, передав в нее специальные параметры-инструкции, которые заставят серверный код ЗУП отключить дефолтные ограничения.
Выполним это по шагам:
Сотрудник.НачалоВыбора и создадим для него клиентский обработчик.Рассмотрим пример готового кода для обработчика события:
&НаКлиенте
Процедура СотрудникНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Отменяем стандартное открытие формы выбора платформой
СтандартнаяОбработка = Ложь;
// Создаем структуру параметров для управления поведением формы выбора ЗУП
ПараметрыФормы = Новый Структура;
// Разрешаем показ сотрудников, работающих по договорам ГПХ
ПараметрыФормы.Вставить("ПоказыватьДоговорников", Истина);
ПараметрыФормы.Вставить("ВыбиратьГПХ", Истина);
ПараметрыФормы.Вставить("ИсключатьДоговорников", Ложь);
// Разрешаем отображение кандидатов и еще не принятых сотрудников
ПараметрыФормы.Вставить("ПоказыватьНепринятых", Истина);
// Разрешаем отображение уже уволенных сотрудников (при необходимости)
ПараметрыФормы.Вставить("ПоказыватьУволенных", Истина);
// Открываем типовую форму выбора, передавая наш элемент-владелец и структуру параметров
ОткрытьФорму("Справочник.Сотрудники.ФормаВыбора", ПараметрыФормы, Элемент);
КонецПроцедуры
При таком подходе типовая форма принудительно перестроит свой динамический запрос на сервере и уберет наложенное условие ОформленПоТрудовомуДоговору = Истина, предоставив пользователю полный список физических лиц.
Бывают ситуации, когда отбор «Оформлен по трудовому договору: Да» мешает выбрать сотрудников, которые фактически давно приняты на работу и успешно выполняют свои обязанности. Чаще всего эта проблема проявляется после переноса данных (конвертации) из старых баз (например, «1С:ЗиК 7.7» или «1С:ЗУП 2.5»).
Выясним причину сбоя в базе данных. При некорректном переносе или ручном изменении документов движения по регистрам сведений могли записаться не полностью. В результате в регистре сведений Текущие кадровые данные сотрудников для конкретного человека отсутствует флаг Оформлен по трудовому договору (он равен Ложь или NULL), несмотря на то, что документ «Прием на работу» проведен и физически существует в системе.
Для исправления этой коллизии в пользовательском режиме выполним следующие действия:
Текущие кадровые данные сотрудников. Найдем запись по нужному сотруднику и проверим заполнение колонок «Организация», «Подразделение», «Должность» и флага «Оформлен по трудовому договору». Если поля пусты — восстановим их корректность или воспользуемся встроенными обработками группового изменения реквизитов.Комбинация программного управления параметрами формы и поддержание порядка в кадровых регистрах позволит гибко управлять видимостью сотрудников в любых внешних отчетах и обеспечит стабильную работу системы.