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