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