Подскажите как лучше реализовать (помощь с скд)

1. 1c_uZer 11.10.17 10:54 Сейчас в теме
Здравствуйте! Такая ситуация, пишу отчет...код запроса представлен ниже.

ВЫБРАТЬ РАЗЛИЧНЫЕ
	ЗаработанныеПраваНаОтпуска.ДатаНачала КАК ДатаНачала,
	ЗаработанныеПраваНаОтпуска.ДатаОкончания КАК ДатаОкончания,
	ПоложенныеВидыЕжегодныхОтпусков.КоличествоДнейВГод КАК КоличествоДнейВГод,
	ПоложенныеВидыЕжегодныхОтпусков.ВидЕжегодногоОтпуска.Ссылка КАК ВидЕжегодногоОтпуска,
	ЗаработанныеПраваНаОтпуска.Сотрудник.Ссылка КАК Сотрудник,
	ВЫБОР
		КОГДА ФактическиеОтпуска.РабочийПериодС <= ЗаработанныеПраваНаОтпуска.ДатаНачала
				И ФактическиеОтпуска.РабочийПериодПо >= ЗаработанныеПраваНаОтпуска.ДатаОкончания
			ТОГДА ФактическиеОтпуска.Количество
		ИНАЧЕ 0
	КОНЕЦ КАК ДнейОтпускаПотрачено,
	ВЫБОР
		КОГДА NULL
			ТОГДА NULL
		ИНАЧЕ NULL
	КОНЕЦ КАК Примечание,
	ФактическиеОтпуска.РабочийПериодПо КАК РабочийПериодПо,
	ФактическиеОтпуска.РабочийПериодС КАК РабочийПериодС
ПОМЕСТИТЬ ВТ_ВсеОтпуска
ИЗ
	РегистрСведений.ПоложенныеВидыЕжегодныхОтпусков КАК ПоложенныеВидыЕжегодныхОтпусков
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗаработанныеПраваНаОтпуска КАК ЗаработанныеПраваНаОтпуска
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ФактическиеОтпуска КАК ФактическиеОтпуска
			ПО ЗаработанныеПраваНаОтпуска.Сотрудник.Ссылка = ФактическиеОтпуска.Сотрудник.Ссылка
		ПО (ЗаработанныеПраваНаОтпуска.ВидЕжегодногоОтпуска.Ссылка = ПоложенныеВидыЕжегодныхОтпусков.ВидЕжегодногоОтпуска.Ссылка)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ВТ_ВсеОтпуска.Сотрудник КАК Сотрудник,
	ВТ_ВсеОтпуска.ДатаОкончания КАК ДатаОкончания,
	ВТ_ВсеОтпуска.ВидЕжегодногоОтпуска КАК ВидЕжегодногоОтпуска,
	ВТ_ВсеОтпуска.КоличествоДнейВГод КАК КоличествоДнейВГод,
	ВТ_ВсеОтпуска.ДнейОтпускаПотрачено КАК ДнейОтпускаПотрачено,
	ВТ_ВсеОтпуска.ДатаНачала КАК ДатаНачала,
	ВЫБОР
		КОГДА ВТ_ВсеОтпуска.ДнейОтпускаПотрачено > ВТ_ВсеОтпуска.КоличествоДнейВГод
			ТОГДА ВТ_ВсеОтпуска.ДнейОтпускаПотрачено - ВТ_ВсеОтпуска.КоличествоДнейВГод
		ИНАЧЕ ВТ_ВсеОтпуска.ДнейОтпускаПотрачено
	КОНЕЦ КАК ОтпускаНаСледующийГод
ПОМЕСТИТЬ ВТ_ОстатвкиОтпусковНаСлГод
ИЗ
	ВТ_ВсеОтпуска КАК ВТ_ВсеОтпуска
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_ОстатвкиОтпусковНаСлГод.Сотрудник КАК Сотрудник,
	ВТ_ОстатвкиОтпусковНаСлГод.ДатаНачала КАК ДатаНачала,
	ВТ_ОстатвкиОтпусковНаСлГод.ДатаОкончания КАК ДатаОкончания,
	ВТ_ОстатвкиОтпусковНаСлГод.ДнейОтпускаПотрачено КАК ДнейОтпускаПотрачено,
	ВТ_ОстатвкиОтпусковНаСлГод.КоличествоДнейВГод КАК КоличествоДнейВГод,
	ВТ_ОстатвкиОтпусковНаСлГод.ОтпускаНаСледующийГод КАК ОтпускаНаСледующийГод,
	ВТ_ОстатвкиОтпусковНаСлГод.ВидЕжегодногоОтпуска КАК ВидЕжегодногоОтпуска
ИЗ
	ВТ_ОстатвкиОтпусковНаСлГод КАК ВТ_ОстатвкиОтпусковНаСлГод
Показать


И вот какая ситуация как видно на первом скрине:

если года у периода за который выдается отпуск не совпадают, появляется огромная каша как на скрине 2.

Если года в документе за который предоставляется отпуск одинаковые проблем особо нет, то есть мне надо чтобы минус стал нулем и отрицательные значения упали на следующий год, надеюсь доступно объяснил, помогите, сам не могу разобраться....
Прикрепленные файлы:
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
7. antonio_i 80 11.10.17 13:18 Сейчас в теме +0.7 $m
Как вариант - применить функцию
ВычислитьВыражение(Выражение, Группировка, ТипРасчета, Начало, Конец, Сортировка, ИерархическаяСортировка, ОбработкаОдинаковыхЗначенийПорядка)

Создать вычисляемое поле ОтпускаОсталосьВЭтомГоду
Если нужен нарастающий итог: ВычислитьВыражение("Сумма(ОсталосьОтпуска )", , "Группировка", "Первая", "Текущая")
Если нужно только из предыдущего года остаток
ОтпускаОсталось - ВычислитьВыражение(ЕстьNull(ОтпускаОсталось,0),"", "Группировка", "Предыдущая", "Предыдущая")
Чтобы отфильтровать отрицательные значения использовать
Вsбор
Когда МоёВыражение < 0
Тогда 0
Иначе
МоёВыражение
Конец

И уже это поле выводить в последней колонке отчёта
Вот ещё небольшая подсказка с видео: Разбор ВычислитьВыражение
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. red80 11.10.17 11:08 Сейчас в теме
Зачем так много временных таблиц?

ПО ЗаработанныеПраваНаОтпуска.Сотрудник.Ссылка = ФактическиеОтпуска.Сотрудник.Ссылка
Мои глаза! Сотрудник и так Ссылка.
3. 1c_uZer 11.10.17 11:09 Сейчас в теме
(2) да просто пробовал разные варианты, к окончательному результату не пришел....
4. 1c_uZer 11.10.17 11:10 Сейчас в теме
(2) а что не так с соединением?...
5. red80 11.10.17 11:11 Сейчас в теме
(4) Вызывается лишнее неявное левое соединение
6. 1c_uZer 11.10.17 11:14 Сейчас в теме
7. antonio_i 80 11.10.17 13:18 Сейчас в теме +0.7 $m
Как вариант - применить функцию
ВычислитьВыражение(Выражение, Группировка, ТипРасчета, Начало, Конец, Сортировка, ИерархическаяСортировка, ОбработкаОдинаковыхЗначенийПорядка)

Создать вычисляемое поле ОтпускаОсталосьВЭтомГоду
Если нужен нарастающий итог: ВычислитьВыражение("Сумма(ОсталосьОтпуска )", , "Группировка", "Первая", "Текущая")
Если нужно только из предыдущего года остаток
ОтпускаОсталось - ВычислитьВыражение(ЕстьNull(ОтпускаОсталось,0),"", "Группировка", "Предыдущая", "Предыдущая")
Чтобы отфильтровать отрицательные значения использовать
Вsбор
Когда МоёВыражение < 0
Тогда 0
Иначе
МоёВыражение
Конец

И уже это поле выводить в последней колонке отчёта
Вот ещё небольшая подсказка с видео: Разбор ВычислитьВыражение
8. 1c_uZer 11.10.17 13:21 Сейчас в теме
(7) не знал про эту функцию, буду пробовать, спасибо.
Оставьте свое сообщение

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