Принцип построения запроса для отчёта (скрин в примере)

1. user2042586 24.01.24 19:37 Сейчас в теме
Добрый вечер, товарищи. Прошу подсказку: какой принцип посторения запроса должен быть для отчёта такого вида на СКД? Из РС могу вытащить данные по сотруднику: период начала и период конца отпуска, но в период на СКД получается добавить ресурс (напирмер цифру 1) только для того измерения собственно по которому есть записи в рс, каким образом добавить и получить числа в промежутке и добавить к этим измерениям так же ресурс? Будьте добры натолкните на мысль..
Пример отчёта в приложении.
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. starjevschik 24.01.24 20:54 Сейчас в теме
нужна полная таблица дней, а регистр уже к ней присоединять. Календарь например можно использовать, если есть в конифгурации.
3. user2042586 25.01.24 13:17 Сейчас в теме
То что полный список дней нужно получить - понятно. Проблема как к полному списку дней прицепить все дни из графика отпусков, если запрос по графику отпусков даёт только начало отпуска и конец.
4. Said-We 25.01.24 13:30 Сейчас в теме
(3) В форме вывода группировка горизонтальная. А в реальности каждый день по каждому сотруднику это строка. И там либо есть запланированный отпуск либо его нет.
В данных таблица вертикальная. В СКД группировка горизонтальная.
5. user2042586 25.01.24 13:44 Сейчас в теме
(4) Строк по графику отпуска всё равно ограничено началом и концом.

Т.е. вот таким запросом простым

ВЫБРАТЬ
	ГрафикОтпусковОрганизаций.Период,
	ГрафикОтпусковОрганизаций.Сотрудник КАК Сотрудник,
	ГрафикОтпусковОрганизаций.Организация
ИЗ
	РегистрСведений.ГрафикОтпусковОрганизаций КАК ГрафикОтпусковОрганизаций
ГДЕ
	ГрафикОтпусковОрганизаций.Период МЕЖДУ &ПериодС И &ПериодПо
	И ГрафикОтпусковОрганизаций.Сотрудник = &Сотрудник

СГРУППИРОВАТЬ ПО
	ГрафикОтпусковОрганизаций.Период,
	ГрафикОтпусковОрганизаций.Сотрудник,
	ГрафикОтпусковОрганизаций.Организация
Показать

Получается пример:

Иванов А 08.01.2024
Иванов А 14.01.2024
Иванов А 01.04.2024
Иванов А 08.04.2024

Далее берем запрос:

ВЫБРАТЬ
РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
РегламентированныйПроизводственныйКалендарь.Год = &Год

Тут получаем полный список дней в году.

Если просто прицепить соединением к производственному календарю - график отпусков, то получится тоже самое в скд:

Всего для двух дат:
Иванов А 08.01.2024
Иванов А 14.01.2024

Не могу додуматься как мне правильно соединить эти два регистра.
7. nomad_irk 76 25.01.24 14:02 Сейчас в теме
(5)
ВЫБРАТЬ
     Т1.Сотрудник,
     Т1.Организация,
     Т2.ДатаКалендаря
ИЗ
      ГрафикОтпусков КАК Т1
           ЛЕВОЕ СОЕДИНЕНИЕ Календарь КАК Т2
           ПО Т2.ДатаКалендаря МЕЖДУ Т1.НачалоПериода И Т1.КонецПериода
6. Said-We 25.01.24 13:56 Сейчас в теме
(5) В графике отпусков не одна дата. Либо период "с" "по", либо "с" и количество дней.
Судя по названию регистра, то скорее всего у Вас ЗиУП 2.5, в ней есть дата окончания планируемого отпуска.
Связь должна быть первая таблица все даты (пусть поле называется ДатаХ), к ней левое соединение таблицы графика отпусков по ДатаХ между ДатаН и ДатаК.

(7) Нужны все даты, даже когда нет отпуска по графику отпусков. Поэтому таблицы соединить наоборот необходимо.
8. user2042586 25.01.24 14:15 Сейчас в теме
(6) УПП 1.3.

Да есть начало отпуска и конец.
Если например 4 недели отпуск разбит - то 8 записей в сумме. Дата начала отпуска первой недели, конец отпуска первой недели и тд.
НО. По соединениям всё равно пока не могу сориентироваться. ДатаН и ДатаК это - ок, но в графике отпусков запросом получаю только даты непосредственно без дополнений каких-то что это начало или конец отпуска. Просто строка с датой.. Поэтому интервал не понятно как указать.
9. Said-We 25.01.24 14:19 Сейчас в теме
Выбор когда ГрафикОтпусковОрганизаций.Сотрудник Есть NULL Тогда 0 иначе 1 конец как ...
user2042586; +1 Ответить
10. user2042586 25.01.24 14:46 Сейчас в теме
(9)
Выбор когда ГрафикОтпусковОрганизаций.Сотрудник Есть NULL Тогда 0 иначе 1 конец


Один фиг я получаю только строки с датами которые есть в графике.. Блин(
11. user2042586 25.01.24 14:49 Сейчас в теме
(9) Т.е. вот тут не понятно как соединить ещё и с датами промежуточными между началом отпуска и концом, коненчо получаю просто даты начала отпуска.

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

СГРУППИРОВАТЬ ПО
	ГрафикОтпусковОрганизаций.Сотрудник,
	ГрафикОтпусковОрганизаций.Организация,
	РегламентированныйПроизводственныйКалендарь.ДатаКалендаря,
	ГрафикОтпусковОрганизаций.Период
Показать
12. Said-We 25.01.24 17:46 Сейчас в теме
ПО РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ ГрафикОтпусковОрганизаций.Период И ГрафикОтпусковОрганизаций.ДатаОкончания или как там период окончания называется в графике отпусков
user2042586; +1 Ответить
13. user2042586 26.01.24 13:08 Сейчас в теме
(12) Благодарю за ответ и помощь. В том и дело что нет даты начала и конца, просто измерение - период)
23. user2042586 05.02.24 12:27 Сейчас в теме
Ни в одном из вариантов не получается соединить таблицы. Все поля пустые выводятся, кроме регл календаря. Фиаско какое-то полнейшее.


(12)
ПО РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ ГрафикОтпусковОрганизаций.Период И ГрафикОтпусковОрганизаций.ДатаОкончания или как там период окончания называется в графике отпусков


Такой вариант тоже не срабатывает..
14. Said-We 26.01.24 13:16 Сейчас в теме
(13) А ресурс дата завершения есть?
15. user2042586 26.01.24 15:35 Сейчас в теме
16. Said-We 26.01.24 16:40 Сейчас в теме
(15) В типовом ЗиУП 2.5 есть документ График отпусков, в нем есть дата начала окончания и количество дней.
Этот документ двигает РС график отпусков. В этом регистре есть дата окончания.
17. user2042586 30.01.24 17:08 Сейчас в теме
(16) Приношу извинения что пропал. В общем я жестко затупил. Конкретной даты начала и конца нет в регистре, но есть статус. По нему можно узнать начало и конец отпуска. Вот такой запрос получает строки с началом и концом:
ВЫБРАТЬ
	ГрафикОтпусковОрганизаций.Сотрудник КАК Сотрудник,
	ГрафикОтпусковОрганизаций.Организация,
	ВЫБОР
		КОГДА ГрафикОтпусковОрганизаций.Состояние = ЗНАЧЕНИЕ(Перечисление.ТипыПериодическихЗадачРаботника.ОтпускЕжегодный)
			ТОГДА ГрафикОтпусковОрганизаций.Период
	КОНЕЦ КАК НачалоОтпуска,
	ВЫБОР
		КОГДА ГрафикОтпусковОрганизаций.Состояние = ЗНАЧЕНИЕ(Перечисление.ТипыПериодическихЗадачРаботника.Свободен)
			ТОГДА ГрафикОтпусковОрганизаций.Период
	КОНЕЦ КАК КонецОтпуска
ИЗ
	РегистрСведений.ГрафикОтпусковОрганизаций КАК ГрафикОтпусковОрганизаций
ГДЕ
	ГрафикОтпусковОрганизаций.Период МЕЖДУ &ПериодС И &ПериодПо



И теперь у меня всё равно остается проблема как склеить его с регламентированным календарём. 
Вот это не прокатывает:

ПО РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ ГрафикОтпусковОрганизаций.Период И ГрафикОтпусковОрганизаций.ДатаОкончания
Показать
18. user2042586 02.02.24 13:03 Сейчас в теме
Товарищи, не подскажете идеи какие-нибдуь?
19. Said-We 02.02.24 14:55 Сейчас в теме
(18) Не совсем понятно, какие сложности у Вас возникают.
https://onecompiler.com/sqlserver/42396tpmc

Для компактности вместо дат использовал числа от 1 до 31. У Вас даты, в остальном всё тоже самое.
Прикрепленные файлы:
20. user2042586 02.02.24 16:28 Сейчас в теме
Да просто отрабатывает совсем некорректно. Выдает все даты за год и всё. Остальыне поля - все пустые.

ВЫБРАТЬ
	ГрафикОтпусковОрганизаций.Сотрудник КАК Сотрудник,
	ГрафикОтпусковОрганизаций.Организация,
	ВЫБОР
		КОГДА ГрафикОтпусковОрганизаций.Состояние = ЗНАЧЕНИЕ(Перечисление.ТипыПериодическихЗадачРаботника.ОтпускЕжегодный)
			ТОГДА ГрафикОтпусковОрганизаций.Период
	КОНЕЦ КАК НачалоОтпуска,
	ВЫБОР
		КОГДА ГрафикОтпусковОрганизаций.Состояние = ЗНАЧЕНИЕ(Перечисление.ТипыПериодическихЗадачРаботника.Свободен)
			ТОГДА ГрафикОтпусковОрганизаций.Период
	КОНЕЦ КАК КонецОтпуска
ПОМЕСТИТЬ ВТ_Данные
ИЗ
	РегистрСведений.ГрафикОтпусковОрганизаций КАК ГрафикОтпусковОрганизаций
ГДЕ
	ГрафикОтпусковОрганизаций.Период МЕЖДУ &ПериодС И &ПериодПо
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_Данные.Сотрудник,
	РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
ИЗ
	РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Данные КАК ВТ_Данные
		ПО (РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ ВТ_Данные.НачалоОтпуска И ВТ_Данные.КонецОтпуска)
ГДЕ
	РегламентированныйПроизводственныйКалендарь.Год = &Год
Показать
21. Said-We 02.02.24 16:37 Сейчас в теме
(20)
    ВЫБОР
        КОГДА ГрафикОтпусковОрганизаций.Состояние = ЗНАЧЕНИЕ(Перечисление.ТипыПериодическихЗадачРаботника.ОтпускЕжегодный)
            ТОГДА ГрафикОтпусковОрганизаций.Период
    КОНЕЦ КАК НачалоОтпуска,
    ВЫБОР
        КОГДА ГрафикОтпусковОрганизаций.Состояние = ЗНАЧЕНИЕ(Перечисление.ТипыПериодическихЗадачРаботника.Свободен)
            ТОГДА ГрафикОтпусковОрганизаций.Период
    КОНЕЦ КАК КонецОтпуска
Т.е. Вы заполняете либо дату начала отпуска, либо дату окончания, но никогда обе. Состояние не может одновременно иметь разные значения. Не квантовый компьютер же.
Таблица "ВТ_Данные" у Вас неправильная.
22. user2042586 05.02.24 09:18 Сейчас в теме
(21) А как тогда передавать период начала и конца?
24. Said-We 05.02.24 12:36 Сейчас в теме
(22) Обычный запрос разбиения на периоды. Поиском воспользуйтесь - примеров разных вариантов реализации полно.

Например так:
sost - это ваше состояние в отпуске (1) / НЕ в отпуске (0). По умолчанию ноль, или как у Вас "Свободен".
sostDO - это состояние до текущей даты. Если состояние не менялось, то такая запись не нужна.
Сам запрос переписать в запрос 1С - он переписывается, но много писанины и переливания из пустого в порожнее. Но алгоритм такой же.

Поиском поищите разбить на периоды.
Прикрепленные файлы:
25. user2042586 06.02.24 11:50 Сейчас в теме
(24) С sql ничего не понятно, но очень интересно) Спасибо)
33. Said-We 26.02.24 15:24 Сейчас в теме
(25)
С sql ничего не понятно, но очень интересно) Спасибо)
А так:
https://forum.infostart.ru/forum9/topic310008/
26. Said-We 06.02.24 12:38 Сейчас в теме
(25) А с поиском "разбить на периоды"?
27. user2042586 08.02.24 13:31 Сейчас в теме
(26) Пока прямо чтобы дельное было не нашёл.
28. Said-We 08.02.24 15:17 Сейчас в теме
(27) Вот первый попавшейся поиском, но это не лучший вариант. Есть проще.
https://infostart.ru/1c/articles/1348065/?ysclid=lsd6kd7gdw926511841
29. Onwardv 65 10.02.24 18:19 Сейчас в теме
Как-то не очень понятно. С УПП опыта нет.

Посмотрел конфу УПП 1.3. Данных там нет. Мои догадки:
РС "ГрафикОтпусковОрганизаций" - периодический. Соответственно, стандартный реквизит "Период" - дата начала отпуска.
А вот реквизит "ДатаОкончания" - Дата окончания отпуска, соответственно. При условии, что Состояние = ЗНАЧЕНИЕ(Перечисление.ТипыПериодическихЗадачРаботника.ОтпускЕжегодный). И, скорее всего, надо брать СрезПоследних. А то там всякие больничные во время отпуска и т.д.
Также предполагаю, что условие отбора по периоду следует изменить. Чтобы попали отрезки отпусков, в которые попадает граница параметра. Т.е. отпуск с 28 декабря по 3 января по вашему условию не попадает.

Тогда примерный запрос для получения отпускных периодов будет:

ВЫБРАТЬ
    ГрафикОтпусков.Сотрудник КАК Сотрудник,
    ГрафикОтпусков.Период КАК ДатаОтпускаОт,
    ГрафикОтпусков.ДатаОкончания КАК ДатаОтпускаПо
ПОМЕСТИТЬ ВТ_Данные
ИЗ
    РегистрСведений.ГрафикОтпусковОрганизаций.СрезПоследних() КАК ГрафикОтпусков
ГДЕ
    ГрафикОтпусков.Состояние = ЗНАЧЕНИЕ(Перечисление.ТипыПериодическихЗадачРаботника.ОтпускЕжегодный)
    И (ГрафикОтпусков.Период МЕЖДУ &ПериодС И &ПериодПо
          ИЛИ ГрафикОтпусков.ДатаОкончания МЕЖДУ &ПериодС И &ПериодПо
Показать
30. Onwardv 65 10.02.24 18:26 Сейчас в теме
Затем берете каждый день за выбранный пользователем период. Насколько понимаю, в вашем случае можно получить из РС "РегистрСведений.РегламентированныйПроизводственныйКалендарь".
Примерный запрос:
Выбрать
    Календарь.ДатаКалендаря
Поместить ВТ_ВсеДаты
ИЗ
    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь
ГДЕ 
Календарь.ДатаКалендаря МЕЖДУ &ПериодС И &ПериодПо
Показать
31. Onwardv 65 10.02.24 18:32 Сейчас в теме
Затем берете все даты и соединяете левым соединением с отпускными периодами сотрудников.
Примерный запрос:
ВЫБРАТЬ
    ВТ_ВсеДаты.ДатаКалендаря, 
    ВТ_Данные.Сотрудник,
    ВТ_Данные.ДатаОтпускаОт,
    ВТ_Данные.ДатаОтпускаПо
ИЗ ВТ_ВсеДаты КАК ВТ_ВсеДаты
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Данные КАК ВТ_Данные
        ПО ВТ_ВсеДаты.ДатаКалендаря >= ВТ_Данные.ДатаОтпускаОт
               И ВТ_ВсеДаты.ДатаКалендаря <= ВТ_Данные.ДатаОтпускаПо
Показать
32. Onwardv 65 10.02.24 18:48 Сейчас в теме
(31)Здесь поля "ДатаОтпускаОт" и "ДатаОтпускаПо" носят справочный характер, чтобы убедиться, что всё соединилось как надо. Обычно сразу не получается. Особое внимание на граничные даты: если год, то это 1 января и 31 декабря. Убедившись, что всё в порядке, эти поля можно и удалить.

В результате у Вас на каждый день (ДатаКалендаря) будет минимум одна запись - это если в этот день ни один из сотрудников не находится в отпуске. Также м.б. несколько записей на один день (ДатаКалендаря): по одной записи на каждого сотрудника, находящегося в этот день в отпуске.

Если на один день (ДатаКалендаря) на одного Сотрудника будет более одной записи, то это сигнализирует о бардаке в учете. Желательно разобраться.
Если лень, то добавив "РАЗЛИЧНЫЕ" и убрав поля ДатаОтпускаОт и ДатаОтпускаПо можно непринужденно избавиться от дублей в записях.

Вот по результатам этого и можно строить Ваш отчет.
Оставьте свое сообщение

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