При работе с 1С:ЗУП КОРП часто возникает задача получения детального расписания смен для каждого сотрудника. Эта информация необходима для различных отчетов, анализа рабочего времени или интеграции с внешними системами. Однако, структура хранения данных о расписаниях в версии КОРП имеет свои особенности, которые могут вызвать затруднения. В частности, мы можем столкнуться с тем, что расписание смен не привязано напрямую к графику работы, а является частью более сложной архитектуры, где владелец — это режим работы, который, в свою очередь, может включать несколько графиков с разным расписанием. Давайте подробно рассмотрим, как правильно извлечь нужную информацию и построить таблицу вида |Сотрудник|График|Дата|ВремяНачала|ВремяОкончания|.
Первое, что нам необходимо сделать, это разобраться в логике построения и хранения расписаний работы в 1С:ЗУП КОРП. В отличие от версии ПРОФ, где многие процессы упрощены, в КОРП реализована более гибкая и многоуровневая система. Мы выясним, какие ключевые объекты используются и как они взаимодействуют.
Смены работы сотрудниковНа самом нижнем уровне находятся Смены работы сотрудников. Это базовые элементы, которые описывают конкретный временной интервал работы и виды рабочего времени. Например, мы можем определить «Дневную смену с 7:00 до 15:00» или «Ночную смену с 23:00 до 7:00». В каждой такой смене указываются виды времени (Явка, Ночные часы) и их продолжительность. Это фундамент для построения любого рабочего расписания.
Режимы работы сотрудниковДалее, отдельные смены объединяются в Режимы работы сотрудников. Режим работы определяет последовательность чередования смен и выходных дней с помощью так называемого «Шаблона заполнения». Например, шаблон может выглядеть как «смена 1 - смена 2 - 2 выходных». Важно понимать, что именно Режим работы сотрудников является "владельцем" для графиков работы, которые по нему строятся. Один и тот же режим работы может быть использован для создания множества графиков.
Графики работы сотрудниковНепосредственно Графики работы сотрудников создаются уже на основе Режимов работы. Несколько графиков могут быть основаны на одном режиме, но отличаться, например, датой начала отсчета цикла. Например, если у нас есть режим «смена 1 - смена 2 - 2 выходных», то один график может начинаться смены 1 с понедельника, а другой — смены 2 со среды, при этом оба графика будут использовать один и тот же режим. Это позволяет более гибко управлять расписаниями без дублирования описания самого цикла смен.
Штатное расписаниеВ 1С:ЗУП КОРП для позиции штатного расписания мы можем указать не конкретный График работы, а Режим работы сотрудников. Это еще один уровень абстракции, позволяющий гибко назначать графики сотрудникам, работающим на одной штатной позиции. Например, для одной и той же должности могут быть предусмотрены разные смены, но все они будут соответствовать одному режиму работы.
Таким образом, мы видим, что путь от Сотрудника к детальному расписанию Дата | ВремяНачала | ВремяОкончания не является прямым. Нам необходимо пройти через несколько уровней абстракции, чтобы получить нужные данные.
КалендарныеГрафики.РасписанияРаботыНаПериод и ее использованиеМы выясним, что в 1С:ЗУП КОРП действительно существует функция КалендарныеГрафики.РасписанияРаботыНаПериод. Эта функция предназначена для составления расписаний работы по датам, включенным в указанные графики, за определенный период. Она возвращает данные, включающие дату графика, время начала и время окончания работы.
Основная проблема, с которой мы столкнулись, заключается в том, что эта функция ожидает в качестве параметра ссылку на конкретный объект СправочникСсылка.Календари (то есть на конкретный График работы сотрудников), а не на Режим работы сотрудников. Поэтому, если мы пытаемся передать функции Режим работы, мы либо получим ошибку, либо некорректные данные, либо функция просто не сработает в полной мере.
Для корректной работы функции КалендарныеГрафики.РасписанияРаботыНаПериод нам требуется наличие подсистемы "ГрафикиРаботы", которая, разумеется, присутствует в 1С:ЗУП КОРП. Теперь, когда мы понимаем архитектуру и роль функции, мы можем перейти к пошаговому алгоритму получения нужного расписания.
Чтобы получить требуемую таблицу |Сотрудник|График|Дата|ВремяНачала|ВремяОкончания|, мы должны выполнить следующие шаги:
Прежде всего, нам нужно четко задать, для какого сотрудника (или списка сотрудников) и за какой период (дата начала, дата окончания) мы хотим получить расписание. Это будет отправной точкой для нашего запроса.
Это самый критически важный шаг. Нам необходимо сначала определить конкретный График работы сотрудников, который был назначен сотруднику на интересующий нас период. Мы не можем использовать Режим работы напрямую, поскольку он является лишь шаблоном для построения графиков.
Мы можем получить информацию о назначенном графике следующими способами:
ПриемНаРаботу) или кадровом переводе (КадровыйПеревод) сотруднику указывается конкретный График работы. Нам нужно будет обратиться к этим документам или к регистрам сведений, которые хранят эту информацию (например, РегистрСведений.ГрафикиРаботыСотрудников или РегистрСведений.КадроваяИсторияСотрудников, в зависимости от версии и настроек).Режим работы сотрудников, то фактически используемый График работы для конкретного сотрудника определяется на основе этого режима и даты его приема на работу или перевода. В этом случае, система сама генерирует или выбирает соответствующий График из набора графиков, построенных по данному режиму. Нам придется либо воспроизвести эту логику, либо найти регистр, где хранится уже определенный для сотрудника график.Допустим, в результате мы получили ссылку на объект СправочникСсылка.ГрафикиРаботыСотрудников, который относится к нашему сотруднику на заданный период. Сохраним ее в переменной ГрафикРаботыСотрудника.
КалендарныеГрафики.РасписанияРаботыНаПериодПосле того как у нас есть конкретная ссылка на График работы сотрудника, мы можем безопасно использовать функцию КалендарныеГрафики.РасписанияРаботыНаПериод. Функция ожидает список графиков в качестве первого параметра, поэтому мы передадим ей список из одного элемента.
Пример кода для вызова функции:
// Допустим, мы уже получили ссылку на конкретный объект "График работы сотрудников"
// и сохранили ее в переменной ГрафикРаботыСотрудника
// А также определили ДатаНачалаПериода и ДатаОкончанияПериода
// Создаем список значений, так как функция ожидает список графиков
СписокГрафиковДляОбработки = Новый СписокЗначений;
СписокГрафиковДляОбработки.Добавить(ГрафикРаботыСотрудника);
// Вызываем функцию для получения расписания
РезультатРасписания = КалендарныеГрафики.РасписанияРаботыНаПериод(
СписокГрафиковДляОбработки,
ДатаНачалаПериода,
ДатаОкончанияПериода
);
Функция КалендарныеГрафики.РасписанияРаботыНаПериод возвращает таблицу значений с подробным расписанием. Мы проанализируем структуру этой таблицы.
Результатом работы функции РезультатРасписания будет таблица значений, которая содержит примерно следующие колонки:
График: Ссылка на график, по которому составлено расписание.ДатаГрафика: Дата дня в графике.НачалоРаботы: Время начала работы для данного дня.ОкончаниеРаботы: Время окончания работы для данного дня.ВидВремени: Вид рабочего времени (например, Явка, Выходной, Ночные часы).Нам останется только итерировать по этой таблице и выбрать нужные данные, чтобы сформировать конечную таблицу в желаемом формате |Сотрудник|График|Дата|ВремяНачала|ВремяОкончания|.
Пример кода для обработки результата:
ТаблицаРасписания = Новый ТаблицаЗначений;
ТаблицаРасписания.Колонки.Добавить("Сотрудник");
ТаблицаРасписания.Колонки.Добавить("График");
ТаблицаРасписания.Колонки.Добавить("Дата");
ТаблицаРасписания.Колонки.Добавить("ВремяНачала");
ТаблицаРасписания.Колонки.Добавить("ВремяОкончания");
// Предполагаем, что переменная Сотрудник содержит ссылку на текущего сотрудника
// для которого мы получаем расписание
Для Каждого СтрокаРасписания Из РезультатРасписания Цикл
// Отбираем только рабочие дни (Явка), игнорируя выходные или другие виды времени
Если СтрокаРасписания.ВидВремени = ПредопределенноеЗначение("Перечисление.ВидыВремени.Явка") Тогда
НоваяСтрока = ТаблицаРасписания.Добавить();
НоваяСтрока.Сотрудник = Сотрудник; // Заполняем поле Сотрудник
НоваяСтрока.График = СтрокаРасписания.График;
НоваяСтрока.Дата = СтрокаРасписания.ДатаГрафика;
НоваяСтрова.ВремяНачала = СтрокаРасписания.НачалоРаботы;
НоваяСтрока.ВремяОкончания = СтрокаРасписания.ОкончаниеРаботы;
КонецЕсли;
КонецЦикла;
// Теперь переменная ТаблицаРасписания содержит данные в нужном нам формате
Важно отметить, что функционал 1С:ЗУП КОРП также позволяет вести учет рабочего времени в разрезе рабочих смен и планировать их в индивидуальных графиках работы с помощью документа Индивидуальный график сменности. Если для сотрудника введен такой документ, то именно его расписание будет приоритетным. В этом случае, перед вызовом функции КалендарныеГрафики.РасписанияРаботыНаПериод, мы должны убедиться, что используем правильный источник данных для определения графика сотрудника — либо базовый график, либо индивидуальный график сменности, если он введен на соответствующий период. Для автоматического заполнения таких документов можно использовать обработку для загрузки индивидуальных графиков сменности из Excel.
Информация о сменах также может указываться непосредственно при вводе табеля учета рабочего времени, что позволяет точечно корректировать фактическое расписание, но для получения планового расписания нам нужны именно графики.
Мы видим, что проблема получения детального расписания смен в 1С:ЗУП КОРП не так проста, как может показаться на первый взгляд, но вполне решаема. Ключ к успеху лежит в глубоком понимании архитектуры сменного учета в ЗУП КОРП и правильном использовании системных функций. Нам необходимо всегда помнить о цепочке: Смены работы сотрудников -> Режимы работы сотрудников -> Графики работы сотрудников. Только получив ссылку на конкретный График работы сотрудников, мы сможем корректно использовать функцию КалендарныеГрафики.РасписанияРаботыНаПериод и получить желаемое детальное расписание.
Эта методика позволит нам сформировать точную и полную информацию о рабочем времени каждого сотрудника, что является фундаментом для эффективного управления персоналом и расчета заработной платы. Для готового анализа плановых и фактических показателей подойдет отчет по отработанному времени сотрудников.