Как ограничить выбор графика работы в соответствии с режимом работы штатного расписания в 1С:ЗУП КОРП

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

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

В этой статье мы подробно разберем, почему типовой механизм контроля штатного расписания в 1С:ЗУП КОРП не блокирует такие операции, как работает механизм Режимы работы сотрудников и как реализовать жесткое ограничение выбора графиков работы с помощью расширения конфигурации.

Почему типовой контроль в 1С:ЗУП "пропускает" несоответствия?

Для начала проанализируем поведение типовой конфигурации. В настройках кадрового учета 1С:ЗУП предусмотрена опция "Автоматическая проверка кадровых документов на соответствие штатному расписанию". Однако эта проверка по умолчанию является "мягкой".

При проведении документа программа сверяет параметры (включая графики работы и ФОТ) с позицией штатного расписания. Если обнаруживается несовпадение, система выдает предупреждение в шапке документа, но не блокирует его проведение. Разработчики фирмы 1С сознательно пошли на такой шаг:

  1. В реальной практике часто возникают ситуации временного отклонения от штатного расписания (например, временное замещение сотрудника в декрете, работа на полставки и т.д.).
  2. Для одной позиции штатного расписания (например, "Охранник") в версии ПРОФ можно задать только один график. Но посменно на ней могут работать несколько человек с разными графиками (Смена 1, Смена 2). Жесткий запрет вынудил бы кадровиков искусственно раздувать штатное расписание, создавая дублирующие позиции под каждый график.

Как работают "Режимы работы" в версии КОРП

В версии 1С:ЗУП КОРП для решения проблемы посменной работы реализован справочник Режимы работы сотрудников. Этот инструмент позволяет:

Тем не менее, у типового функционала КОРП есть существенное ограничение. Если кадровик решает вручную изменить автоматически подставленный график в документе Прием на работу и нажимает на кнопку выбора, программа открывает весь справочник графиков организации без каких-либо фильтров. Пользователь может выбрать любой неподходящий график, и система не заблокирует проведение документа.

Выясним, как решить эту проблему с помощью программной доработки, не снимая конфигурацию с поддержки.

Решение проблемы: программное ограничение выбора графиков через расширение

Чтобы гарантировать корректность ввода данных кадровиками, мы можем применить два подхода: интерфейсный контроль (пользователь физически видит только разрешенные графики при выборе) и блокирующий контроль (запрет проведения документа при несоответствии). Наиболее удобным для пользователей является интерфейсный контроль на форме кадрового документа.

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

Шаг 1. Перехват события начала выбора графика работы

Создадим расширение конфигурации и добавим в него форму документа ПриемНаРаботу. Нам необходимо перехватить событие НачалоВыбора для поля ГрафикРаботы. Напишем обработчик, который будет программно накладывать отбор на открывающуюся форму выбора справочника ГрафикиРаботыСотрудников.

Ниже представлен пример кода для модуля формы документа:


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

Шаг 2. Получение списка графиков по режиму работы на сервере

Теперь реализуем серверную функцию, которая по выбранной позиции штатного расписания определяет закрепленный за ней режим работы и выбирает все подчиненные ему графики. Проанализируем структуру хранения данных: графики, привязанные к режиму работы, хранятся в табличной части ГрафикиРаботы справочника РежимыРаботыСотрудников.

Добавим в модуль формы или в общий модуль расширения следующий код:


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

Важное примечание: Если в штатном расписании КОРП вместо "Режима работы" указан конкретный "График работы" (для позиций с классическим пятидневным графиком), то серверная функция должна возвращать массив, содержащий этот единственный график. Для этого можно доработать код функции, добавив проверку реквизита ГрафикРаботы у позиции штатного расписания.

Вариант Б: Жесткий контроль при проведении документа

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


&После("ОбработкаПроведения")
Процедура Расш1_ОбработкаПроведения(Отказ, РежимПроведения)
	
	Если Отказ Тогда
		Возврат;
	КонецЕсли;
	
	// Выполняем проверку только если заполнена позиция ШР
	Если ЗначениеЗаполнено(ЭтотОбъект.ДолжностьПоШтатномуРасписанию) Тогда
		
		ДопустимыеГрафики = ПолучитьСписокГрафиковПозицииШР(ЭтотОбъект.ДолжностьПоШтатномуРасписанию);
		
		// Если для позиции определены рамки режима работы, проверяем текущий график документа
		Если ДопустимыеГрафики.Количество() > 0 И ДопустимыеГрафики.Найти(ЭтотОбъект.ГрафикРаботы) = Неопределено Тогда
			Отказ = Истина;
			Сообщение = Новый СообщениеПользователю;
			Сообщение.Текст = "Выбранный график работы не соответствует установленной позиции штатного расписания!";
			Сообщение.Поле = "ГрафикРаботы";
			Сообщение.Сообщить();
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

Подведем итоги

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

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

← На главную