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