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