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