Группировка по дням в СКД отчете

1. shemyl696 06.07.23 10:15 Сейчас в теме
Добрый день, есть скд отчет посещения. Выводится день а в нем два столбца-часы по штатному расписанию у сотрудника и часы по отработанному времени в этот день. А по факту выходит 30 дней где пишется только часы по штатному и 30 дней где фактически отработанное время. Как скомпоновать так, чтобы все выводилось в один день? СГРУППИРОВАТЬ ПО не выходит

ВЫБРАТЬ
	ВТ.Сотрудник,
	ВТ.СтатьяЗатрат,
	ВТ.День,
	ВТ.Часов
ПОМЕСТИТЬ ВТШтатное
ИЗ
	тзШтатноеРасписание КАК ВТ

СГРУППИРОВАТЬ ПО
	ВТ.День,
	ВТ.Сотрудник,
	ВТ.СтатьяЗатрат,
	ВТ.Часов
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Посещения.Ссылка КАК Посещение
ПОМЕСТИТЬ ТекущиеПосещения
ИЗ
	Документ.Посещения КАК Посещения
		ЛЕВОЕ СОЕДИНЕНИЕ Документ.Посещения КАК Посещения1
		ПО Посещения.Ссылка = Посещения1.ПредыдущаяВерсия
ГДЕ
	ВЫБОР
			КОГДА Посещения1.Ссылка ЕСТЬ NULL
				ТОГДА ИСТИНА
			ИНАЧЕ ЛОЖЬ
		КОНЕЦ
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ПосещенияСотрудники.Ссылка КАК Документ,
	ПосещенияСотрудники.Сотрудник,
	ПосещенияДетали.СтатьяЗатрат,
	ПосещенияДетали.Сумма,
	ПосещенияДетали.Подразделение,
	ПосещенияДетали.ПодразделениеОрганизации,
	ПосещенияДетали.Категория,
	ПосещенияДетали.Количество,
	ПосещенияДетали.НоменклатурнаяГруппа,
	ПосещенияДетали.ВидЗатрат,
	ПосещенияДетали.ВидРаботы,
	ПосещенияСотрудники.Ссылка.Период КАК День
ПОМЕСТИТЬ Детали
ИЗ
	Документ.Посещения.Сотрудники КАК ПосещенияСотрудники
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Посещения.Детали КАК ПосещенияДетали
		ПО ПосещенияСотрудники.КлючСтроки = ПосещенияДетали.КлючСтроки
			И ПосещенияСотрудники.Ссылка = ПосещенияДетали.Ссылка
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТекущиеПосещения КАК ТекущиеПосещения
		ПО ПосещенияСотрудники.Ссылка = ТекущиеПосещения.Посещение
ГДЕ
	ПосещенияСотрудники.Ссылка.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
	И ПосещенияСотрудники.Ссылка.Проведен
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Детали.Документ,
	ЕСТЬNULL(Детали.Сотрудник, ВТШтатное.Сотрудник) КАК Сотрудник,
	Детали.СтатьяЗатрат,
	Детали.Сумма КАК СуммаИзДокумента,
	Детали.Подразделение,
	Детали.ПодразделениеОрганизации,
	Детали.Категория,
	Детали.Количество,
	Детали.НоменклатурнаяГруппа,
	Детали.ВидЗатрат,
	Детали.ВидРаботы,
	ЕСТЬNULL(Детали.День, ВТШтатное.День) КАК День,
	Детали.Количество * ЕСТЬNULL(СтавкиОплатыТрудаСрезПоследних.Ставка, 0) КАК Сумма,
	ВТШтатное.Часов,
	ВТШтатное.СтатьяЗатрат КАК СтатьяЗатратШР
ИЗ
	Детали КАК Детали
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтавкиОплатыТруда.СрезПоследних(&ДатаНачала, ) КАК СтавкиОплатыТрудаСрезПоследних
		ПО Детали.Сотрудник = СтавкиОплатыТрудаСрезПоследних.Сотрудник
			И Детали.ВидРаботы = СтавкиОплатыТрудаСрезПоследних.ВидРабот
		ПОЛНОЕ СОЕДИНЕНИЕ ВТШтатное КАК ВТШтатное
		ПО Детали.Сотрудник = ВТШтатное.Сотрудник
			И Детали.День = ВТШтатное.День

СГРУППИРОВАТЬ ПО
	Детали.Документ,
	Детали.СтатьяЗатрат,
	Детали.Сумма,
	Детали.Подразделение,
	Детали.ПодразделениеОрганизации,
	Детали.Категория,
	Детали.Количество,
	Детали.НоменклатурнаяГруппа,
	Детали.ВидЗатрат,
	Детали.ВидРаботы,
	ВТШтатное.Часов,
	ВТШтатное.СтатьяЗатрат,
	ЕСТЬNULL(Детали.Сотрудник, ВТШтатное.Сотрудник),
	Детали.Количество * ЕСТЬNULL(СтавкиОплатыТрудаСрезПоследних.Ставка, 0),
	Детали.День,
	ВТШтатное.День
Показать
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
17. shemyl696 13.07.23 11:56 Сейчас в теме
(16) решение нашлось) ошибка была в том, что выбиралась дата, а не период регистрации. Дата создания документа штатное расписание. Документ создавался в мае, а расписание было на июль. Отсюда и не соответствие.
| ШтатноеРасписаниеУпрСотрудники.Ссылка.ПериодРегистрации Как Дата
|ИЗ
| Документ.ШтатноеРасписаниеУпр.Сотрудники КАК ШтатноеРасписаниеУпрСотрудники
|ГДЕ
| ШтатноеРасписаниеУпрСотрудники.Ссылка.Проведен = ИСТИНА
| И ШтатноеРасписаниеУпрСотрудники.Ссылка.ПериодРегистрации >= &ДатаНач
| И ШтатноеРасписаниеУпрСотрудники.Ссылка.ПериодРегистрации <= &ДатаКон";

Вот измененная часть запроса, которая сработала
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user-z99999 70 06.07.23 10:37 Сейчас в теме
Вот простая логика:
первый запрос - получаем данные по штатному расписанию (временная таблица)
второй запрос - получаем данные по факту (временная таблица)

третий запрос - первый запрос ЛЕВОЕ СОЕДИНЕНИЕ второй запрос (соединяем по датам и ФИО)

В третем запросе будет: ФИО, по штатному, по факту
И его в СКД можно разместить.
3. shemyl696 10.07.23 10:59 Сейчас в теме
(2)пробую, не выходит, либо только часы по штатному появляются либо по отработанному
4. user-z99999 70 10.07.23 11:44 Сейчас в теме
(3) Пример как соединить две таблицы
ВЫБРАТЬ
	"Иванов" КАК ФИО,
	20 КАК План
ПОМЕСТИТЬ ВТ_План

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	"Петров",
	10

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	"Сидоров",
	30
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	"Иванов" КАК ФИО,
	100 КАК Факт
ПОМЕСТИТЬ ВТ_Факт

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	"Петров",
	20
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_План.ФИО КАК ФИО,
	ВТ_План.План КАК План,
	ВТ_Факт.Факт КАК Факт
ИЗ
	ВТ_План КАК ВТ_План
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Факт КАК ВТ_Факт
		ПО ВТ_План.ФИО = ВТ_Факт.ФИО
Показать
5. akarpushina 10.07.23 14:33 Сейчас в теме
(3) Объединение
ПО Детали.Сотрудник = ВТШтатное.Сотрудник
Но судя по запросу, одно из полей может принимать значение NULL.
Корректнее будет получить полный список сотрудников, и уже с ним объединять обе таблицы.
6. shemyl696 10.07.23 16:19 Сейчас в теме
(5)
там отчет только по одному сотрудник должен быть. Из документа начисление зарплаты сотрудника выбираешь отчет по посещениям
7. akarpushina 11.07.23 07:09 Сейчас в теме
(6) Значит, берите сотрудника из таблицы документа (там он точно не NULL), а уже к нему присоединяйте остальные таблицы. Если выбирается не то, что должно быть, тестируйте запрос, последовательно присоединяя каждую временную таблицу и анализируя что получилось.
8. homer_ 78 11.07.23 09:34 Сейчас в теме
Как считается поля "Аналитика" в запросе такого поля нету!
9. shemyl696 12.07.23 16:57 Сейчас в теме
(8)Аналитика это номенклатурная группа
10. homer_ 78 12.07.23 17:03 Сейчас в теме
(9) У вас нету в плане ном группе из за этого разъезжается план и факт. или убирайте ном группу из группировки отчета, или в скд сделать еще набор данных или переделать запрос
11. Said-We 12.07.23 21:57 Сейчас в теме
(1) Это что бы документы у которых были пересчёты не попадали.
Документ.Посещения КАК Посещения
ЛЕВОЕ СОЕДИНЕНИЕ Документ.Посещения КАК Посещения1
ПО Посещения.Ссылка = Посещения1.ПредыдущаяВерсия

Но дальше есть ещё одно условие
ГДЕ
ПосещенияСотрудники.Ссылка.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
И ПосещенияСотрудники.Ссылка.Проведен
Т.е. если у исходного документа есть документ пересчет, который позже этого периода, то исходный документ не попадет так как есть документ пересчет, а документ пересчет не попадет так как он в период не попадает. А еще пересчет может быть не проведен. Т.е какие-то посещения вообще не попадут, хотя они возможно имели место.
Какие движения делает этот документ. Может сразу их смотреть, а не по документам бегать?
14. shemyl696 13.07.23 09:44 Сейчас в теме
(11) в документе посещения есть часы которые идут автоматом(по пропуску на КП) , а если сотрудник не отметился, то через некоторое время его заносят вручную, или вообще могут часы изменить
12. Said-We 12.07.23 22:02 Сейчас в теме
(1)
ВЫБРАТЬ
ВТ.Сотрудник,
ВТ.СтатьяЗатрат,
ВТ.День,
ВТ.Часов
ПОМЕСТИТЬ ВТШтатное
ИЗ
тзШтатноеРасписание КАК ВТ

СГРУППИРОВАТЬ ПО
ВТ.День,
ВТ.Сотрудник,
ВТ.СтатьяЗатрат,
ВТ.Часов
; 
Показать
Может хотя бы часы просуммировать, а не просто выбрать различные?
ВЫБРАТЬ
ВТ.Сотрудник,
ВТ.СтатьяЗатрат,
ВТ.День,
Сумма(ВТ.Часов) as Часов
ПОМЕСТИТЬ ВТШтатное
ИЗ
тзШтатноеРасписание КАК ВТ

СГРУППИРОВАТЬ ПО
ВТ.День,
ВТ.Сотрудник,
ВТ.СтатьяЗатрат
; 
Показать
13. shemyl696 13.07.23 09:42 Сейчас в теме
(12) а они сделаны)

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	//Программно формируем отчет
	//Отменяем стандартную обработку
	СтандартнаяОбработка = Ложь;
	//Получаем схему
	Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
	
	//...и настройки
	Настройки = КомпоновщикНастроек.ПолучитьНастройки();
	ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
	
	//Создаем компоновщик макета и получаем макет компоновки
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);
	//<--------------------------------------------------------------------------------------->//
	ПараметрДата = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Период2")).Значение;	
	        
	зпрс = Новый Запрос;
	зпрс.УстановитьПараметр("ДатаНач",НачалоДня(ПараметрДата.ДатаНачала));
	зпрс.УстановитьПараметр("ДатаКон",КонецДня(ПараметрДата.ДатаОкончания));
	зпрс.Текст = "ВЫБРАТЬ
	             |	ШтатноеРасписаниеУпрСотрудники.Сотрудник,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов1,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов2,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов3,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов4,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов5,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов6,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов7,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов8,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов9,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов10,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов11,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов12,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов13,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов14,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов15,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов16,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов17,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов18,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов19,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов20,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов21,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов22,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов23,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов24,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов25,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов26,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов27,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов28,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов29,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов30,
	             |	ШтатноеРасписаниеУпрСотрудники.Часов31,
	             |	ШтатноеРасписаниеУпрСотрудники.СтатьяЗатрат,
	             |	ШтатноеРасписаниеУпрСотрудники.Ссылка.Дата  Как Дата
	             |ИЗ
	             |	Документ.ШтатноеРасписаниеУпр.Сотрудники КАК ШтатноеРасписаниеУпрСотрудники
	             |ГДЕ
	             |	ШтатноеРасписаниеУпрСотрудники.Ссылка.Проведен = ИСТИНА
	             |	И ШтатноеРасписаниеУпрСотрудники.Ссылка.ПериодРегистрации >= &ДатаНач
	             |	И ШтатноеРасписаниеУпрСотрудники.Ссылка.ПериодРегистрации <= &ДатаКон";
	
	рез = зпрс.Выполнить().Выгрузить();
	
	тзШтатноеРасписание = Новый ТаблицаЗначений;
	мтип = Новый Массив;
	мтип.Добавить(Тип("СправочникСсылка.СотрудникиОрганизаций"));
	тзШтатноеРасписание.Колонки.Добавить("Сотрудник",Новый ОписаниеТипов(мтип));
	мтип.Очистить();
	мтип.Добавить(Тип("СправочникСсылка.СтатьиЗатрат"));
	тзШтатноеРасписание.Колонки.Добавить("СтатьяЗатрат",Новый ОписаниеТипов(мтип));
	мтип.Очистить();
	мтип.Добавить(Тип("Дата"));
	тзШтатноеРасписание.Колонки.Добавить("День",Новый ОписаниеТипов(мтип));
	мтип.Очистить();
	мтип.Добавить(Тип("Число"));
	тзШтатноеРасписание.Колонки.Добавить("Часов",Новый ОписаниеТипов(мтип));
	
	Для Каждого стр из рез Цикл          
		Для ит = 1 по 31 цикл
			Если стр["Часов"+СокрЛП(ит)] <> 0 тогда
				нстр = тзШтатноеРасписание.Добавить();
				нстр.Сотрудник = стр.Сотрудник;
				нстр.СтатьяЗатрат = стр.СтатьяЗатрат;
				нстр.День = НачалоМесяца(стр.Дата)+86400*(ит-1);
				нстр.Часов = стр["Часов"+СокрЛП(ит)];
			КонецЕсли;	
		КонецЦикла;
	КонецЦикла;	
	
	МВТ = Новый МенеджерВременныхТаблиц;
	
	зпрс = Новый Запрос;
	зпрс.УстановитьПараметр("тзШтатноеРасписание",тзШтатноеРасписание);
	зпрс.МенеджерВременныхТаблиц = МВТ;
	зпрс.Текст = "ВЫБРАТЬ
	             |	ВТ.Сотрудник,
	             |	ВТ.СтатьяЗатрат,
	             |	ВТ.День,
	             |	ВТ.Часов
	             |ПОМЕСТИТЬ тзШтатноеРасписание
	             |ИЗ
	             |	&тзШтатноеРасписание КАК ВТ";
	зпрс.Выполнить();
	
	//ВнешниеНаборыДанных = Новый Структура;
	//ВнешниеНаборыДанных.Вставить("тзШтатноеРасписание",тзШтатноеРасписание);
	
	//Инициализируем процессор компоновки
	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина,,МВТ);
	//<--------------------------------------------------------------------------------------->//
	//Очищаем документ результата
	ДокументРезультат.Очистить();
	
	//Выводим отчет в документ
	ПроцессорВывода = Новый
	ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
КонецПроцедуры
Показать
15. Said-We 13.07.23 11:32 Сейчас в теме
(13) Не увидел где они суммируются. Первый запрос не нужен, если он ничего не делает. Он создает копию таблицы в менеджере. Зачем если она там уже есть.

(14) Вы не поняли. Я не спрашивал как оно происходит по природе. Я показал пример когда у вас данные в БД есть, а в ваш запрос они не попадут, хотя должны. В вашем запросе логическая ошибка.
16. Said-We 13.07.23 11:38 Сейчас в теме
(13)
нстр.День = НачалоМесяца(стр.Дата)+86400*(ит-1);
И для февраля с 28 днями отработает? Первое февраля + 31 день будет уже март. Ну, и в марте уже март. Можно запросом сразу собрать нужную таблицу из "Документ.ШтатноеРасписаниеУпр.Сотрудники", а не циклом бегать и гонять данные из SQL сервера на 1С сервер и обратно.
Если стр["Часов"+СокрЛП(ит)] <> 0 тогда
Не проверяет того, что в февральском документе кто-то запихнул в 31 февраля не нулевые данные.
17. shemyl696 13.07.23 11:56 Сейчас в теме
(16) решение нашлось) ошибка была в том, что выбиралась дата, а не период регистрации. Дата создания документа штатное расписание. Документ создавался в мае, а расписание было на июль. Отсюда и не соответствие.
| ШтатноеРасписаниеУпрСотрудники.Ссылка.ПериодРегистрации Как Дата
|ИЗ
| Документ.ШтатноеРасписаниеУпр.Сотрудники КАК ШтатноеРасписаниеУпрСотрудники
|ГДЕ
| ШтатноеРасписаниеУпрСотрудники.Ссылка.Проведен = ИСТИНА
| И ШтатноеРасписаниеУпрСотрудники.Ссылка.ПериодРегистрации >= &ДатаНач
| И ШтатноеРасписаниеУпрСотрудники.Ссылка.ПериодРегистрации <= &ДатаКон";

Вот измененная часть запроса, которая сработала
18. shemyl696 13.07.23 11:57 Сейчас в теме
(16) ему физически не запихнуть, потому что штатное привязано к производственному календарю и заполняется автоматически, просто выбираешь график работника и все
19. Said-We 13.07.23 11:58 Сейчас в теме
(18)В вашем варианте можно было менять дату документа и вуаля - документ считается уже февральским.
Оставьте свое сообщение

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