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