Добрый день, есть расчетная ведомость за произвольный период, сотрудник кадровый перемещением раз в квартал перемещается по подразделениям, хотелось бы в отчете увидеть его з\п в каждом подразделении, как правильно это реализовать?
ТекстЗапроса =
"//{{ЗАПРОС(Т51)
|Период с НачалоПериода по КонецПериода;
|Сотрудник = ЖурналРасчетов.Зарплата.Объект;
|ФизЛицо = ЖурналРасчетов.Зарплата.Объект.ОсновнойЭлемент;
|Должность = ЖурналРасчетов.Зарплата.Объект.ОсновнойЭлемент.Должность;
|Подразделение = ЖурналРасчетов.Зарплата.Объект.ОсновнойЭлемент.Подразделение;
|Оклад = ЖурналРасчетов.Зарплата.Объект.ОсновнойЭлемент.Оклад;
|Расчет = ЖурналРасчетов.Зарплата.ВидРасч;
|Результат = ЖурналРасчетов.Зарплата.Результат;
|ДатаНачала = ЖурналРасчетов.Зарплата.ДатаНачала;
|ДниВЖурнале = ЖурналРасчетов.Зарплата.Дни;
|ЧасыВЖурнале = ЖурналРасчетов.Зарплата.Часы;
|Функция Дни = Сумма(ДниВЖурнале) когда ((Расчет.ВходитВГруппу(ГруппаРасчетов.ОсновныеНачисления)=1) и (ФизЛицо = Сотрудник));
|Функция ПраздничныеДни = Сумма(ДниВЖурнале) когда (Расчет=ВидРасчета.ОплатаПраздничных);
|Функция Часы = Сумма(ЧасыВЖурнале) когда ((Расчет.ВходитВГруппу(ГруппаРасчетов.ОсновныеНачисления)=1) и (ФизЛицо = Сотрудник));
|Функция ПраздничныеЧасы = Сумма(ЧасыВЖурнале) когда (Расчет=ВидРасчета.ОплатаПраздничных);
|Функция Повременно = Сумма(Результат) когда (Расчет.ВходитВГруппу(ГруппаРасчетов.ОсновныеНачисления)=1);
|Функция Сдельно = Сумма(Результат) когда ((Расчет=ВидРасчета.ОплатаПоНаряду)или(Расчет=ВидРасчета.СдельныйНаряд));
|Функция МатериальныеБлага = Сумма(Результат) когда (Расчет.ВходитВГруппу(ГруппаРасчетов.ДоходыВНатуральнойФорме)=1);
|Функция ВсегоНачислено = Сумма(Результат) когда (Расчет.ВходитВГруппу(ГруппаРасчетов.ВсеНачисления)=1);
|Функция НДФЛ = Сумма(Результат) когда (Расчет.ВходитВГруппу(ГруппаРасчетов.ВсеИсчисленныеНДФЛ)=1);
|Функция ВсегоУдержано = Сумма(Результат) когда (Расчет.ВходитВГруппу(ГруппаРасчетов.ВсеУдержания)=1);
|Функция Долг = Сумма(Результат) когда ((Расчет=ВидРасчета.Возврат)или(Расчет=ВидРасчета.НачальноеСальдоЗадолженность)или(Расчет=ВидРасчета.НачальноеСальдоОкругления)или(Расчет=ВидРасчета.НачальноеСальдоПереплатаНДФЛ));
|Функция ВыплаченоЗаПрошлые = Сумма(Результат) когда ((ДатаНачала < НачалоПериода) и (Расчет = ВидРасчета.ВыплатаЗарплаты));";
Если Группировать = 1 Тогда
ТекстЗапроса = ТекстЗапроса + "
|Группировка Подразделение без групп;";
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + "
|Группировка ФизЛицо без групп;
|Условие((Результат<>0)или(ДниВЖурнале<>0));"+
?(СпособВыборкиСотрудников=3,"
|Условие(Сотрудник в СписокФизЛиц);",
?(СпособВыборкиСотрудников=2,"
|Условие(Подразделение в ВыбранноеПодразделение);",""))+"
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
глСтатусСтрока(Контекст,"");
Возврат;
КонецЕсли;
Если Группировать = 1 Тогда
ВременнаяТаблица1=СоздатьОбъект("ТаблицаЗначений");
СписокПодразделений = СоздатьОбъект("СписокЗначений");
Запрос.Выгрузить(ВременнаяТаблица1, 2, 1);
ВременнаяТаблица1.Свернуть("Подразделение","");
ВременнаяТаблица1.Выгрузить(СписокПодразделений,,,"Подразделение");
КонецЕсли;
// описание расшифровки
Расшифровка = СоздатьОбъект("СписокЗначений");
Расшифровка.Установить("Отчет","РасшифровкаОтчетов");
ПараметрыКоманды = СоздатьОбъект("СписокЗначений");
ЖурналРасчетовЗарплата = СоздатьОбъект("ЖурналРасчетов.Зарплата");
ПараметрыКоманды.Установить("ИдентификаторЖурнала","Зарплата");
ПараметрыКоманды.Установить("ДатаНачала", ЖурналРасчетовЗарплата.НачалоПериодаПоДате(ДатаАктуальности));
ПараметрыКоманды.Установить("ДатаОкончания",ЖурналРасчетовЗарплата.КонецПериодаПоДате (ДатаАктуальности1));
// параметры отчета
ПараметрыОтчетов = глПрочитатьПараметрыОтчетов(4);
СтрокНаСтранице = ПараметрыОтчетов.Страница;
Раздел0Загл = ПараметрыОтчетов.Раздел0Загл;
Раздел1Загл = ПараметрыОтчетов.Раздел1Загл;
Раздел0Подв = ПараметрыОтчетов.Раздел0Подв;
Раздел1Подв = ПараметрыОтчетов.Раздел1Подв;
К сожалению, в семёрке, периодические реквизиты в запросе берутся на текущую дату. Для выяснения з/п придётся использовать историю, с выборкой документов.
Вообще странная логика ИБ. У меня подразделение - реквизит журнала расчетов и такой запрос делается на ура, но это наверное из-за того что люди очень часто перемещаются. В такой формулировке вообще невозможно определить сколько человек зарабатывал по подразделениям если он перемещается посреди месяца, так как все месячное начисление упадет на одно подразделение.
Очевидно, что в такой архитектуре для получения адекватных сведений о ЗП по подразделениям, нужно переходить строго в начале месяца. Так вот отсюда мысль - почему бы Вам не сгруппировать запрос по периодам, а потом перегружайте результаты запроса в ТЗ, добавив в нее колонку "Подразделение", которую и будете заполнять, получая периодическое подразделение объекта на начало периода.
Ну а свернуть ТЗ по подразделениям дело несложное. Разве что с долгом и выплаченными ранее суммами придется извратиться. Ну, например, получить их отдельным запросом и вывести в ПФ самостоятельно.
Функция НайтиНачДату(ОписательПериода)
г = Число(Лев(ОписательПериода,4));
м = Число(Сред(ОписательПериода,5,2));
Возврат Дата(г,м,1);
КонецФункции
//*******************************************
Процедура Сформировать()
Перем Запрос, ТекстЗапроса, Таб;
//Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с ВыбНачПериода по ВыбКонПериода;
|Сотрудник = ЖурналРасчетов.Зарплата.Объект;
|ВидРасч = ЖурналРасчетов.Зарплата.ВидРасч;
|Результат = ЖурналРасчетов.Зарплата.Результат;
|СменВсего = ЖурналРасчетов.Зарплата.СменВсего;
|ЧасовВсего = ЖурналРасчетов.Зарплата.ЧасовВсего;
|Функция РезультатСумма = Сумма(Результат);
|Функция СменВсегоСумма = Сумма(СменВсего);
|Функция ЧасовВсегоСумма = Сумма(ЧасовВсего);
|Группировка Сотрудник;
|Группировка ПериодЖурнала;
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
тРез = СоздатьОбъект("ТаблицаЗначений");
Запрос.Выгрузить(тРез,1,0);
тРез.НоваяКолонка("Подразделение");
тРез.ВыбратьСтроки();
Пока тРез.ПолучитьСтроку() = 1 Цикл
тРез.Подразделение = тРез.Сотрудник.Подразделение.Получить(НайтиНачДату(тРез.ПериодЖурнала));
КонецЦикла;
тРез.Свернуть("Сотрудник,Подразделение","РезультатСумма,СменВсегоСумма,ЧасовВсегоСумма");
Показать
Структуру запроса проверьте и допишите условия и прочее, что нужно.
После добавления в ТЗ подразделений и свертки по сотруднику и подразделению у Вас останутся итоговые суммы по подразделениям. И думайте как вывести уже из ТЗ на печать.