Например, нужно получить список месяцев за определенный период с 01.01.2021 - 31.12.2021
Запрос.Текст = "ВЫБРАТЬ
| ДАТАВРЕМЯ(1, 1, 1) КАК Период
|ПОМЕСТИТЬ Представления_Периоды
|ГДЕ
| ""НачалоИнтервала"" = &НачалоПериода
| И ""ОкончаниеИнтервала"" = &КонецПериода
| И ""Периодичность"" = ""МЕСЯЦ""
| И ""ИспользоватьКонецПериода"" = Ложь
|";
Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
Запрос.УстановитьПараметр("КонецПериода", КонецПериода);
ЗарплатаКадрыОбщиеНаборыДанных.ЗаменитьЗапросыКПредставлениямВиртуальныхТаблиц(Запрос.Текст,Запрос);
Запрос.Выполнить();
В итоге получается таблица:
01.01.2021 00:00:00
01.02.2021 00:00:00
01.03.2021 00:00:00
...и т.д. до 01.12.2021 00:00:00
Если установить параметр ИспользоватьКонецПериода = Истина, тогда в списке будет конец месяца
31.01.2021 23:59:59
28.02.2021 23:59:59
...и т.д. до 31.12.2021 23:59:59
Несколько способов:
- Через программный интерфейс (общий модуль КадровыйУчет.КадровыеДанныеСотрудников), например:
КадровыеДанные = ("Должность, ДатаПриема, ДатаУвольнения"); //весь список возможных полей можно посмотреть в общем модуле КадровыйУчетВнутренний.ЗапросВТКадровыеДанныеСотрудников
КадровыеДанныеСотрудника = КадровыйУчет.КадровыеДанныеСотрудников(Истина, Сотрудник, КадровыеДанные, ТекущаяДата());
Важно: Дата приема в регистрах имеет смещение на 20 сек., а через функцию вернется на начало дня, нужно это учитывать если будут какие-то условия.
- Через механизм представлений:
Список полей, которые можно получить через механизм представлений, можно посмотреть на примере типового отчета СостоянияСотрудников.
Список сотрудников можно передавать в любом виде, можно выбрать весь справочник Сотрудники, зависит от задачи.
Чтобы посмотреть содержимое временной таблицы, необходимо установить менеджер временных таблиц Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
далее необходимо выгрузить вт в таблицу значений с помощью следующей строки: Запрос.МенеджерВременныхТаблиц.Таблицы[0].ПолучитьДанные().Выгрузить();
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| тз.Сотрудник КАК Сотрудник,
| &Период КАК Период
|ПОМЕСТИТЬ ВТИзмеренияДатыДляСрезаПоследних
|ИЗ
| &ТЗСотрудники КАК тз
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка) КАК Организация,
| ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник,
| ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка) КАК Подразделение,
| ЗНАЧЕНИЕ(Справочник.Должности.ПустаяСсылка) КАК Должность,
| ЗНАЧЕНИЕ(Справочник.ШтатноеРасписание.ПустаяСсылка) КАК ДолжностьПоШтатномуРасписанию
|ПОМЕСТИТЬ Представления_СрезПоследних_КадроваяИсторияСотрудников
|ИЗ
| ВТИзмеренияДатыДляСрезаПоследних КАК ИзмеренияДатыДляСрезаПоследних
|ГДЕ
| ""ТолькоРазрешенные"" = ИСТИНА
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Представления_СрезПоследних_КадроваяИсторияСотрудников.Организация КАК Организация,
| Представления_СрезПоследних_КадроваяИсторияСотрудников.Сотрудник КАК Сотрудник,
| Представления_СрезПоследних_КадроваяИсторияСотрудников.Подразделение КАК Подразделение,
| Представления_СрезПоследних_КадроваяИсторияСотрудников.Должность КАК Должность,
| Представления_СрезПоследних_КадроваяИсторияСотрудников.ДолжностьПоШтатномуРасписанию КАК ДолжностьПоШтатномуРасписанию
|ИЗ
| Представления_СрезПоследних_КадроваяИсторияСотрудников КАК Представления_СрезПоследних_КадроваяИсторияСотрудников";
Запрос.УстановитьПараметр("Период", Период);
Запрос.УстановитьПараметр("ТЗСотрудники", ТЗСотрудников);
ЗарплатаКадрыОбщиеНаборыДанных.ЗаменитьЗапросыКПредставлениямВиртуальныхТаблиц(Запрос.Текст);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Вставить обработку выборки ВыборкаДетальныеЗаписи
КонецЦикла;
- Выгруженный запрос, который формируется через механизм Представлений, это таблица Представления_СрезПоследних_КадроваяИсторияСотрудников, только в другом виде:
Запрос можно проверить через консоль запросов.
Обязательно нужно создать временную таблицу ВТИзмеренияДатыДляНабораЗаписей, это основа для работы с таблицей среза кадровой истории. В примере анализируется полный справочник сотрудников, можно собрать таблицу основываясь на своей задаче.
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| Сотрудники.Ссылка КАК Сотрудник,
| &Период КАК Период
|ПОМЕСТИТЬ ВТИзмеренияДатыДляНабораЗаписей
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|ГДЕ
| НЕ Сотрудники.ВАрхиве
| И НЕ Сотрудники.ПометкаУдаления
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ВЫБОР
| КОГДА РегистрСведений.ПериодЗаписи = РегистрСведений.ДатаНачала
| ТОГДА ЛОЖЬ
| ИНАЧЕ ИСТИНА
| КОНЕЦ КАК ЭтоВозвратноеСобытие,
| РегистрСведений.ДатаОкончания КАК ДатаОкончания,
| РегистрСведений.ДатаНачала КАК ДатаНачала,
| РегистрСведений.Год КАК Год,
| РегистрСведений.ПериодПредыдущейЗаписи КАК ПериодПредыдущейЗаписи,
| РегистрСведений.Сотрудник КАК Сотрудник,
| РегистрСведений.ГоловнаяОрганизация КАК ГоловнаяОрганизация,
| РегистрСведений.ФизическоеЛицо КАК ФизическоеЛицо,
| ИзмеренияДаты.Период КАК Период,
| РегистрСведений.ДействуетДо КАК ПериодВозвратногоСобытия,
| РегистрСведений.РегистраторСобытия КАК Регистратор,
| РегистрСведений.РегистраторСобытия КАК РегистраторСобытия,
| РегистрСведений.РегистраторЗаписи КАК РегистраторЗаписи,
| РегистрСведений.ПериодЗаписи КАК ПериодЗаписи,
| РегистрСведений.ПустойИнтервал КАК ПустойИнтервал,
| РегистрСведений.Организация КАК Организация,
| РегистрСведений.Подразделение КАК Подразделение,
| РегистрСведений.Должность КАК Должность,
| РегистрСведений.ДолжностьПоШтатномуРасписанию КАК ДолжностьПоШтатномуРасписанию,
| РегистрСведений.ВидСобытия КАК ВидСобытия,
| РегистрСведений.ГоловнойСотрудник КАК ГоловнойСотрудник,
| РегистрСведений.ВидДоговора КАК ВидДоговора,
| РегистрСведений.ЭтоГоловнойСотрудник КАК ЭтоГоловнойСотрудник,
| РегистрСведений.КоличествоСтавок КАК КоличествоСтавок
|{ВЫБРАТЬ
| Сотрудник,
| ГоловнаяОрганизация,
| ФизическоеЛицо,
| Период,
| ПериодВозвратногоСобытия,
| Регистратор,
| РегистраторСобытия,
| РегистраторЗаписи,
| ПериодЗаписи,
| ПустойИнтервал,
| Организация,
| Подразделение,
| Должность,
| ДолжностьПоШтатномуРасписанию,
| ВидСобытия,
| ГоловнойСотрудник,
| ВидДоговора,
| ЭтоГоловнойСотрудник,
| КоличествоСтавок}
|ИЗ
| ВТИзмеренияДатыДляНабораЗаписей КАК ИзмеренияДаты
| Внутреннее СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудниковИнтервальный КАК РегистрСведений
| ПО ((РегистрСведений.ДатаНачала <=
|ВЫБОР
| КОГДА ИзмеренияДаты.Период = ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА ДАТАВРЕМЯ(3999, 12, 31, 23, 59, 59)
| ИНАЧЕ КОНЕЦПЕРИОДА(ИзмеренияДаты.Период,ДЕНЬ)
|КОНЕЦ)
| И (РегистрСведений.ДатаОкончания >=
|ВЫБОР
| КОГДА ИзмеренияДаты.Период = ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА ДАТАВРЕМЯ(3999, 12, 31, 23, 59, 59)
| ИНАЧЕ КОНЕЦПЕРИОДА(ИзмеренияДаты.Период,ДЕНЬ)
|КОНЕЦ))
| И (РегистрСведений.Сотрудник = ИзмеренияДаты.Сотрудник)
| И (ЭтоГоловнойСотрудник = ИСТИНА )
|";
Запрос.УстановитьПараметр("Период", Период);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Вставить обработку выборки ВыборкаДетальныеЗаписи
КонецЦикла;
Можно указать организацию и подразделение, а можно отключить отборы, тогда будут выбраны все работающие сотрудники. Период тоже можно убрать из параметров.
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц = КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц();
ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц.НачалоПериода = НачалоПериода;
ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц.ОкончаниеПериода = КонецПериода;
ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц.Организация = Организация;
ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц.Подразделение = Подразделение;
ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц.КадровыеДанные = "Организация, Подразделение, Должность, ДолжностьПоШтатномуРасписанию, ДатаПриема, ДатаУвольнения"; //Любое поле через запятую из КадровыйУчетВнутренний.ЗапросВТКадровыеДанныеСотрудников
КадровыйУчет.СоздатьВТСотрудникиОрганизации(Запрос.МенеджерВременныхТаблиц , Истина, ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц);
Запрос.Текст = "ВЫБРАТЬ
| ВТСотрудникиОрганизации.Сотрудник КАК Сотрудник,
| ВТСотрудникиОрганизации.ФизическоеЛицо КАК ФизическоеЛицо,
| ВТСотрудникиОрганизации.Организация КАК Организация,
| ВТСотрудникиОрганизации.Подразделение КАК Подразделение,
| ВТСотрудникиОрганизации.ДатаПриема КАК ДатаПриема,
| ВТСотрудникиОрганизации.ДатаУвольнения КАК ДатаУвольнения,
| ВТСотрудникиОрганизации.Должность КАК Должность,
| ВТСотрудникиОрганизации.ДолжностьПоШтатномуРасписанию КАК ДолжностьПоШтатномуРасписанию
|ПОМЕСТИТЬ втДанные
|ИЗ
| ВТСотрудникиОрганизации КАК ВТСотрудникиОрганизации
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| втДанные.Сотрудник КАК Сотрудник,
| втДанные.ФизическоеЛицо КАК ФизическоеЛицо,
| втДанные.Организация КАК Организация,
| втДанные.Подразделение КАК Подразделение,
| втДанные.ДатаПриема КАК ДатаПриема,
| втДанные.ДатаУвольнения КАК ДатаУвольнения,
| втДанные.Должность КАК Должность,
| втДанные.ДолжностьПоШтатномуРасписанию КАК ДолжностьПоШтатномуРасписанию
|ИЗ
| втДанные КАК втДанные
|ГДЕ
| втДанные.ДатаУвольнения = ДатаВремя(0001, 01, 01)
| И (втДанные.Подразделение В(&Подразделение)
| ИЛИ &ОтборПоПодразделению)
| И втДанные.Организация = &Организация";
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("Подразделение", Подразделение);
Запрос.УстановитьПараметр("ОтборПоПодразделению", ?(НЕ ЗначениеЗаполнено(Подразделение),Истина,Ложь));
Результат = Запрос.Выполнить().Выгрузить();
Можно узнать кто за указанный период отсутствует, не работает.
1. Создаем таблицу втСотрудники (заполнить таблицу можно через таблицу значений, либо другим способом, зависит от задачи).
//* ВТСотрудники (имя временной таблицы определяется в параметре ПараметрыПолученияДанныхОВремени) - временная
// таблица - обязательно содержит поля.
// ** Сотрудник - СправочникСсылка.Сотрудники - сотрудник, по которому нужно получить данные.
// ** Месяц - Дата - месяц, за который нужно получить данные.
// ** ДатаАктуальности - Дата - Будут учитываться только те данные о времени,
// которые зарегистрированы не позже переданного значения.
// ** ДатаНачала - Дата - ограничивает период получения данных внутри месяца.
// ** ДатаОкончания - Дата - ограничивает период получения данных внутри месяца.
Процедура СоздатьВТСотрудники(МенеджерВременныхТаблиц, ТаблицаСотрудников)
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("ТаблицаСотрудников", ТаблицаСотрудников);
Запрос.Текст =
"ВЫБРАТЬ
| ТаблицаСотрудников.Сотрудник,
| ТаблицаСотрудников.Месяц,
| ТаблицаСотрудников.ДатаАктуальности,
| ТаблицаСотрудников.ДатаНачала,
| ТаблицаСотрудников.ДатаОкончания
|ПОМЕСТИТЬ ВТСотрудники
|ИЗ
| &ТаблицаСотрудников КАК ТаблицаСотрудников";
Запрос.Выполнить();
КонецПроцедуры
2. Заполняем параметры для ВТДанныеУчетаВремениИСостоянийСотрудников:
ПараметрыПолученияДанных = УчетРабочегоВремениРасширенный.ПараметрыДляЗапросВТДанныеУчетаВремениИСостоянийСотрудников();
ПараметрыПолученияДанных.ДатаНачала = НачалоПериода;
ПараметрыПолученияДанных.ДатаОкончания = КонецПериода;
ПараметрыПолученияДанных.МесяцДатаНачала = НачалоМесяца(НачалоПериода);
ПараметрыПолученияДанных.МесяцДатаОкончания = КонецМесяца(КонецПериода);
ПараметрыПолученияДанных.ДатаАктуальности = КонецПериода;
//ПараметрыПолученияДанных.Организация = Организация;
//ПараметрыПолученияДанных.Подразделение = Подразделение;
3. Выполняем запрос:
УчетРабочегоВремениРасширенный.СоздатьВТДанныеУчетаВремениИСостоянийСотрудников(МенеджерВременныхТаблиц, Истина, ПараметрыПолученияДанных);
ТаблицаОтклонений = МенеджерВременныхТаблиц.Таблицы.Найти("ВТСостоянияСотрудников").ПолучитьДанные().Выгрузить();
1. В модуле объекта необходимо прописать следующую процедуру:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеИсточникиДанныхОтчета(ЭтотОбъект);
КонецПроцедуры
2. В окне текста запроса разместить нужный запрос, который строится через механизм Представлений, например, текст из типового отчета "СправкаПоОтпускам":
ВЫБРАТЬ РАЗРЕШЕННЫЕ
Сотрудники.Ссылка КАК Сотрудник,
&ДатаОстатков КАК Период
ПОМЕСТИТЬ ВТСотрудники
ИЗ
Справочник.Сотрудники КАК Сотрудники
ГДЕ
НЕ Сотрудники.ВАрхиве
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник,
ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка) КАК Организация
ПОМЕСТИТЬ Представления_КадровыеДанныеСотрудников
ИЗ
ВТСотрудники КАК Сотрудники
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Представления_КадровыеДанныеСотрудников.Сотрудник КАК Сотрудник,
Представления_КадровыеДанныеСотрудников.Организация КАК Организация
ИЗ
Представления_КадровыеДанныеСотрудников КАК Представления_КадровыеДанныеСотрудников
Была задача - в обработке выводить рабочую дату за 2 недели до даты отпуска сотрудника, чтобы кадровик успел отправить сотруднику необходимые документы, вот пример:
Функция ПолучитьДатуУведомленияЗаДвеНедели(ДатаНачала, пПроизводственныйКалендарь)
//Необходимо заполнить параметры:
// Параметры:
// ПроизводственныйКалендарь - СправочникСсылка.ПроизводственныеКалендари
//- календарь, используемый для расчета, берется из графика сотрудника,
//в примере п.календарь передан в параметрах пПроизводственныйКалендарь
// НачальныеДаты - Массив из Дата - даты, относительно которых будет выполнен поиск ближайших.
НачальнаяДата = ДатаНачала - (14*86400); //сначала вычитаем от нашей даты 14 календарных дней (зависит от условий задачи)
НачальныеДаты = Новый Массив;
НачальныеДаты.Добавить(НачальнаяДата);
// ПараметрыПолучения - см. КалендарныеГрафики.ПараметрыПолученияБлижайшихРабочихДат.
//Структура:
// * ПолучатьПредшествующие - Булево - способ получения ближайшей даты:
// если Истина - определяются рабочие даты, предшествующие переданным в параметре НачальныеДаты,
// если Ложь - получаются ближайшие рабочие даты, следующие за начальными датами.
// Значение по умолчанию - Ложь:
// * УчитыватьНерабочиеПериоды - Булево - определяет отношение к датам, выпадающим на периоды нерабочих дней календаря,
// если Истина, даты, выпадающие на период нерабочих дней будут считаться нерабочими,
// если Ложь, периоды нерабочих дней будут игнорироваться.
// Значение по умолчанию - Истина:
// * НерабочиеПериоды - Неопределено - уточняет периоды нерабочих дней, которые нужно учитывать,
// можно установить Массив номеров периодов или описаний, полученных методом ПериодыНерабочихДней,
// если Неопределено, будут учтены все периоды,
// если заполнен параметр ПроизводственныйКалендарь, то все периоды этого календаря будут заполнены в НерабочиеПериоды.
// Значение по умолчанию - Неопределено:
// это нерабочие дни в связи с короновирусом
// * ВызыватьИсключение - Булево - вызов исключения в случае не заполненного графика
// если Истина, вызвать исключение, если график не заполнен.
// если Ложь - даты, по которым не удалось определить ближайшую дату, будут просто пропущены.
// Значение по умолчанию - Истина.
ПараметрыПолучения = Новый Структура(
"ПолучатьПредшествующие,
|УчитыватьНерабочиеПериоды,
|НерабочиеПериоды,
|ВызыватьИсключение");
ПараметрыПолучения.ПолучатьПредшествующие = Истина;
ПараметрыПолучения.УчитыватьНерабочиеПериоды = Истина;
ПараметрыПолучения.НерабочиеПериоды = КалендарныеГрафики.ПериодыНерабочихДней(пПроизводственныйКалендарь, Новый СтандартныйПериод());
ПараметрыПолучения.ВызыватьИсключение = Истина;
/////Получим рабочие даты///////////////
СоответствиеДатаЗаДвеНедели = КалендарныеГрафики.БлижайшиеРабочиеДаты(пПроизводственныйКалендарь, НачальныеДаты, ПараметрыПолучения);
// Возвращаемое значение:
// Соответствие из КлючИЗначение:
// * Ключ - Дата - начальная дата,
// * Значение - Дата - ближайшая к ней рабочая дата (если передана рабочая дата, то она же и возвращается).
//
ДатаЗаДвеНедели = СоответствиеДатаЗаДвеНедели.Получить(НачальнаяДата);
Возврат ДатаЗаДвеНедели;
КонецФункции
// Параметры:
// ГрафикРаботы - СправочникСсылка.ГрафикиРаботыСотрудников
// ТекущаяДата - дата, относительно которой нужно вычислять предыдущий отработанный день.
//
// Возвращаемое значение
// Дата, на которую запланировано рабочее время по графику.
ПредыдущаяРабочаяДата = УчетРабочегоВремениРасширенный.ПредыдущийРабочийДеньПоГрафику(ГрафикРаботы, ТекущаяДата);
//В программе есть типовая функция КадровыйУчетРасширенный.ТаблицаДвиженийВидовЗанятостиВнутреннихСовместителей,
//но по-моему она не работает из-за неверного условия (отбор по внешним совместителям), поэтому предлагаю свой вариант функции
// КоллекцияСотрудников, параметры:
// * Сотрудник - основной сотрудник
// * ВидЗанятости - должно быть Перечисления.ВидыЗанятости.ОсновноеМестоРаботы
// * ДатаСобытия
Функция ТаблицаДвиженийВидовЗанятостиВнутреннихСовместителей(КоллекцияСотрудников, Организация, ИсключаемыеРегистраторы = Неопределено) Экспорт
ТаблицаДвижений = Новый ТаблицаЗначений;
ТаблицаДвижений.Колонки.Добавить("Период", Новый ОписаниеТипов("Дата"));
ТаблицаДвижений.Колонки.Добавить("Сотрудник", Новый ОписаниеТипов("СправочникСсылка.Сотрудники"));
ТаблицаДвижений.Колонки.Добавить("ГоловнаяОрганизация", Новый ОписаниеТипов("СправочникСсылка.Организации"));
ТаблицаДвижений.Колонки.Добавить("ФизическоеЛицо", Новый ОписаниеТипов("СправочникСсылка.ФизическиеЛица"));
ТаблицаДвижений.Колонки.Добавить("ВидЗанятости", Новый ОписаниеТипов("ПеречислениеСсылка.ВидыЗанятости"));
ВсеСотрудникиКоллекции = Новый Массив;
ОсновныеСотрудники = Новый ТаблицаЗначений;
ОсновныеСотрудники.Колонки.Добавить("Сотрудник", Новый ОписаниеТипов("СправочникСсылка.Сотрудники"));
ОсновныеСотрудники.Колонки.Добавить("Период", Новый ОписаниеТипов("Дата"));
Для Каждого ЭлементКоллекции Из КоллекцияСотрудников Цикл
ВсеСотрудникиКоллекции.Добавить(ЭлементКоллекции.Сотрудник);
Если ЭлементКоллекции.ВидЗанятости = Перечисления.ВидыЗанятости.ОсновноеМестоРаботы Тогда
СтрокаСотрудника = ОсновныеСотрудники.Добавить();
СтрокаСотрудника.Сотрудник = ЭлементКоллекции.Сотрудник;
СтрокаСотрудника.Период = ЭлементКоллекции.ДатаСобытия;
КонецЕсли;
КонецЦикла;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("ОсновныеСотрудники", ОсновныеСотрудники);
Запрос.УстановитьПараметр("ВсеСотрудникиКоллекции", ВсеСотрудникиКоллекции);
Запрос.Текст =
"ВЫБРАТЬ
| ОсновныеСотрудники.Период КАК Период,
| ОсновныеСотрудники.Сотрудник КАК Сотрудник
|ПОМЕСТИТЬ ВТОсновныеСотрудники
|ИЗ
| &ОсновныеСотрудники КАК ОсновныеСотрудники
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ОсновныеСотрудники.Период КАК Период,
| Сотрудники.ФизическоеЛицо КАК ФизическоеЛицо
|ПОМЕСТИТЬ ВТФизическиеЛицаПериоды
|ИЗ
| ВТОсновныеСотрудники КАК ОсновныеСотрудники
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники
| ПО (ВЫРАЗИТЬ(ОсновныеСотрудники.Сотрудник КАК Справочник.Сотрудники).ФизическоеЛицо = Сотрудники.ФизическоеЛицо)
|ГДЕ
| НЕ Сотрудники.Ссылка В (&ВсеСотрудникиКоллекции)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 1
| ФизическиеЛицаПериоды.ФизическоеЛицо КАК ФизическоеЛицо
|ИЗ
| ВТФизическиеЛицаПериоды КАК ФизическиеЛицаПериоды";
УстановитьПривилегированныйРежим(Истина);
РезультатЗапроса = Запрос.Выполнить();
УстановитьПривилегированныйРежим(Ложь);
Если Не РезультатЗапроса.Пустой() Тогда
ПараметрыПостроения = ЗарплатаКадрыОбщиеНаборыДанных.ПараметрыПостроенияДляСоздатьВТИмяРегистраСрез();
ЗарплатаКадрыОбщиеНаборыДанных.ДобавитьВКоллекциюОтбор(
ПараметрыПостроения.Отборы, "Сотрудник", "НЕ В", ВсеСотрудникиКоллекции);
ЗарплатаКадрыОбщиеНаборыДанных.ДобавитьВКоллекциюОтбор(
ПараметрыПостроения.Отборы, "ГоловнаяОрганизация", "=", ЗарплатаКадры.ГоловнаяОрганизация(Организация));
Если ЗначениеЗаполнено(ИсключаемыеРегистраторы) Тогда
ЗарплатаКадрыОбщиеНаборыДанных.ДобавитьВКоллекциюОтбор(
ПараметрыПостроения.Отборы, "Регистратор", "НЕ В", ИсключаемыеРегистраторы);
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
ЗарплатаКадрыОбщиеНаборыДанных.СоздатьВТИмяРегистраСрезПоследних(
"ВидыЗанятостиСотрудников",
Запрос.МенеджерВременныхТаблиц,
Ложь,
ЗарплатаКадрыОбщиеНаборыДанных.ОписаниеФильтраДляСоздатьВТИмяРегистра("ВТФизическиеЛицаПериоды", "ФизическоеЛицо"),
ПараметрыПостроения);
ЗарплатаКадрыОбщиеНаборыДанных.СоздатьВТИмяРегистраСрезПоследних(
"КадроваяИсторияСотрудников",
Запрос.МенеджерВременныхТаблиц,
Ложь,
ЗарплатаКадрыОбщиеНаборыДанных.ОписаниеФильтраДляСоздатьВТИмяРегистра("ВТФизическиеЛицаПериоды", "ФизическоеЛицо"),
ПараметрыПостроения);
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВидыЗанятостиСотрудников.Период КАК Период,
| ВидыЗанятостиСотрудников.Сотрудник КАК Сотрудник,
| ВидыЗанятостиСотрудников.ГоловнаяОрганизация КАК ГоловнаяОрганизация,
| ВидыЗанятостиСотрудников.ФизическоеЛицо КАК ФизическоеЛицо,
| ЗНАЧЕНИЕ(Перечисление.ВидыЗанятости.ВнутреннееСовместительство) КАК ВидЗанятости
|ИЗ
| ВТВидыЗанятостиСотрудниковСрезПоследних КАК ВидыЗанятостиСотрудников
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТКадроваяИсторияСотрудниковСрезПоследних КАК КадроваяИсторияСотрудников
| ПО ВидыЗанятостиСотрудников.Период = КадроваяИсторияСотрудников.Период
| И ВидыЗанятостиСотрудников.Сотрудник = КадроваяИсторияСотрудников.Сотрудник
|ГДЕ
| КадроваяИсторияСотрудников.ВидСобытия <> ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Увольнение)
| И ВидыЗанятостиСотрудников.ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятости.ВнутреннееСовместительство)
//в типовом варианте условие по внешним совместителям
//| И ВидыЗанятостиСотрудников.ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятости.Совместительство)
| И КадроваяИсторияСотрудников.ПериодЗаписи < ВидыЗанятостиСотрудников.Период";
РезультатЗапроса = Запрос.Выполнить();
УстановитьПривилегированныйРежим(Ложь);
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ЗаполнитьЗначенияСвойств(ТаблицаДвижений.Добавить(), Выборка);
КонецЦикла;
КонецЕсли;
КонецЕсли;
Возврат ТаблицаДвижений;
КонецФункции
//Вытащить город из Юр.адреса организации
ТаблицаКИАдрес = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов(Организация,Перечисления.ТипыКонтактнойИнформации,Справочники.ВидыКонтактнойИнформации,Дата);
Город = "";
Если ТаблицаКИАдрес.Количество()>0 Тогда
Город = РаботаСАдресами.ГородАдресаКонтактнойИнформации(ТаблицаКИАдрес[0].ЗначенияПолей);
//по необходимости уберем "г"
Город = СтрЗаменить(Город, " г", "");
Город = СтрЗаменить(Город, " г.", "");
Город = СтрЗаменить(Город, "г ", "");
Город = СтрЗаменить(Город, "г. ", "");
КонецЕсли;
АдресаОрганизаций = УправлениеКонтактнойИнформациейЗарплатаКадры.АдресаОрганизаций(МассивОрганизаций);
ОписаниеЮридическогоАдреса = УправлениеКонтактнойИнформациейЗарплатаКадры.АдресОрганизации(
АдресаОрганизаций,
ОрганизацияСсылка,
Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации);
ЮрАдрес = ОписаниеЮридическогоАдреса.Представление;
Сведения = Новый СписокЗначений;
Сведения.Добавить("", "КППЮЛ");
Сведения.Добавить("", "ТелОрганизации");
Сведения.Добавить("", "ФаксОрганизации");
//список всех сведений можно посмотреть в модуле ЗарплатаКадрыБазовый.ПолучитьСведенияОбОрганизации
ОргСведения = РегламентированнаяОтчетностьВызовСервера.ПолучитьСведенияОбОрганизации(ОрганизацияСсылка, ТекущаяДатаСеанса(), Сведения);
Если ОргСведения.Свойство("КППЮЛ") Тогда
КПП = ОргСведения.КППЮЛ;
КонецЕсли;
Если ОргСведения.Свойство("ТелОрганизации") Тогда
Телефон = ОргСведения.ТелОрганизации;
КонецЕсли;
Если ОргСведения.Свойство("ФаксОрганизации") Тогда
Факс = ОргСведения.ФаксОрганизации;
КонецЕсли;
ТекстЗапросаВТСотрудникиПериоды =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Сотрудники.Сотрудник КАК Сотрудник,
| &ДатаНачала КАК ДатаНачала,
| &ДатаОкончания КАК ДатаОкончания
|ПОМЕСТИТЬ ВТСотрудникиПериоды
|ИЗ
| ВТСотрудникиПоКритериямПоиска КАК Сотрудники";
ЗарплатаКадрыОбщиеНаборыДанных.ОбъединитьТекстыЗапросов(Запрос.Текст, ТекстЗапросаВТСотрудникиПериоды);
// Параметры:
// ТекстЗапроса - Строка
// ИмяВременнойТаблицы - Строка, например ВТСотрудникиПериоды
ЗарплатаКадрыОбщиеНаборыДанных.ДобавитьЗапросУничтоженияВременнойТаблицы(ТекстЗапроса, ИмяВременнойТаблицы);
//Для нескольких таблиц:
//ИменаВременныхТаблицКУничтожению - Массив
ЗарплатаКадрыОбщиеНаборыДанных.ДобавитьЗапросыУничтоженияВременныхТаблиц(ТекстЗапроса, ИменаВременныхТаблицКУничтожению)