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