Как с группировать по периодическому реквизиту

1. ded20ded 25.04.13 21:41 Сейчас в теме
Добрый день, есть расчетная ведомость за произвольный период, сотрудник кадровый перемещением раз в квартал перемещается по подразделениям, хотелось бы в отчете увидеть его з\п в каждом подразделении, как правильно это реализовать?

		ТекстЗапроса = 
		"//{{ЗАПРОС(Т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Подв;
Показать
Прикрепленные файлы:
Расчетная ведомость за период.ert
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Nick_Tick 26.04.13 04:29 Сейчас в теме
К сожалению, в семёрке, периодические реквизиты в запросе берутся на текущую дату. Для выяснения з/п придётся использовать историю, с выборкой документов.
3. ded20ded 26.04.13 08:27 Сейчас в теме
не могу понять как мне сделать это правильно согласен на долгую выборку уже
Функция КолНаДату(Карт,Дат)
КонецФункции


тЗапр =
"
|Период По ДатаТек;
|Кол = КолНаДату(Справочник.Картотека,ДатаТек)
|Функция СумКол = Сумма(Кол);
|";


http://www.forum.mista.ru/topic.php?id=455923
http://www.1c-pro.ru/topic22100.html
4. MishaD 14 26.04.13 08:48 Сейчас в теме
(3) Про функцию забудьте. Правильный ответ уже дали. Выгрузка в таблицу значений, и обработка уже там.
5. ded20ded 26.04.13 09:03 Сейчас в теме
6. dusha0020 1120 26.04.13 09:23 Сейчас в теме
Вообще странная логика ИБ. У меня подразделение - реквизит журнала расчетов и такой запрос делается на ура, но это наверное из-за того что люди очень часто перемещаются. В такой формулировке вообще невозможно определить сколько человек зарабатывал по подразделениям если он перемещается посреди месяца, так как все месячное начисление упадет на одно подразделение.
Очевидно, что в такой архитектуре для получения адекватных сведений о ЗП по подразделениям, нужно переходить строго в начале месяца. Так вот отсюда мысль - почему бы Вам не сгруппировать запрос по периодам, а потом перегружайте результаты запроса в ТЗ, добавив в нее колонку "Подразделение", которую и будете заполнять, получая периодическое подразделение объекта на начало периода.
Ну а свернуть ТЗ по подразделениям дело несложное. Разве что с долгом и выплаченными ранее суммами придется извратиться. Ну, например, получить их отдельным запросом и вывести в ПФ самостоятельно.
7. ded20ded 26.04.13 12:10 Сейчас в теме
dusha0020, Жаль что я так пока не умею......
8. dusha0020 1120 26.04.13 12:54 Сейчас в теме
(7) ded20ded,
Функция НайтиНачДату(ОписательПериода)
	г = Число(Лев(ОписательПериода,4));
	м = Число(Сред(ОписательПериода,5,2));
	Возврат Дата(г,м,1);
КонецФункции
//*******************************************
Процедура Сформировать()
	Перем Запрос, ТекстЗапроса, Таб;
	//Создание объекта типа Запрос
	Запрос = СоздатьОбъект("Запрос");
	ТекстЗапроса = 
	"//{{ЗАПРОС(Сформировать)
	|Период с ВыбНачПериода по ВыбКонПериода;
	|Сотрудник = ЖурналРасчетов.Зарплата.Объект;
	|ВидРасч = ЖурналРасчетов.Зарплата.ВидРасч;
	|Результат = ЖурналРасчетов.Зарплата.Результат;
	|СменВсего = ЖурналРасчетов.Зарплата.СменВсего;
	|ЧасовВсего = ЖурналРасчетов.Зарплата.ЧасовВсего;
	|Функция РезультатСумма = Сумма(Результат);
	|Функция СменВсегоСумма = Сумма(СменВсего);
	|Функция ЧасовВсегоСумма = Сумма(ЧасовВсего);
	|Группировка Сотрудник;
	|Группировка ПериодЖурнала;
	|"//}}ЗАПРОС
	;
	// Если ошибка в запросе, то выход из процедуры
	Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
		Возврат;
	КонецЕсли;
    тРез = СоздатьОбъект("ТаблицаЗначений");
	Запрос.Выгрузить(тРез,1,0);
	тРез.НоваяКолонка("Подразделение");
	тРез.ВыбратьСтроки();
	Пока тРез.ПолучитьСтроку() = 1 Цикл
		тРез.Подразделение = тРез.Сотрудник.Подразделение.Получить(НайтиНачДату(тРез.ПериодЖурнала));
	КонецЦикла;
	тРез.Свернуть("Сотрудник,Подразделение","РезультатСумма,СменВсегоСумма,ЧасовВсегоСумма");
Показать

Структуру запроса проверьте и допишите условия и прочее, что нужно.
После добавления в ТЗ подразделений и свертки по сотруднику и подразделению у Вас останутся итоговые суммы по подразделениям. И думайте как вывести уже из ТЗ на печать.
ded20ded; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот