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