СУПЕРЗАПРОСЫ: У кого самый большой запрос?

1. KazanKokos 10 26.05.17 15:24 Сейчас в теме
Выношу на обсуждение запрос с которым мучился в общей сложности часов 12.
В запрос используется код из задача на инфостарте. Образец запроса в 14м комменте http://infostart.ru/public/386912/
если в образце сумма к распределению дается как параметр то здесь распределяются суммы рассчитанные в самом запросе с учетом все группировок.

В приведенном запросе сумма доставки(из закладки Услуги ЗаказаПокупателя в пиленной перепиленной УТ10.30) распределятеся по реализациям заказа пропорционально весам реализации.
Потом распределяются по мотивациям(товарная группа) реализации пропорционально весу товарных позиций внутри реализации.
Показано как применить приведенный тестовый запрос к реальным данным. Когда у вас нет данных в регистрах(мопед не ваш - вы пришли на базу которую вы не пилили) и приходится вытаскивать суммы из сторонних реквизитов.
Отчет используется для расчета PKI
Длина запроса 310 строк.
У кого длинше есть запрос?:)

ВЫБРАТЬ
	ПродажиОбороты.ЗаказПокупателя,
	ВЫРАЗИТЬ(МАКСИМУМ(ВесаЗаказов.ВесЗаказа) КАК ЧИСЛО(15, 2)) КАК ВесЗаказа,
	ВЫРАЗИТЬ(МАКСИМУМ(ВесаЗаказов.СуммаЗаказа) КАК ЧИСЛО(15, 2)) КАК СуммаКРаспределению,
	МАКСИМУМ(ДоставкаВУслугах.СуммаЗаказа) КАК СтоимостьДоставки,
	МАКСИМУМ(ЗНД.ФактическиеРасходы) КАК СебестоимостьДоставки
ПОМЕСТИТЬ Заказы
ИЗ
	РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК ПродажиОбороты
		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаявкаНаДоставку КАК ЗНД
		ПО (ЗНД.Заказ = ПродажиОбороты.ЗаказПокупателя)
		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
			ЗПТовары.Ссылка КАК Ссылка,
			СУММА(ЗПТовары.Количество * ЕСТЬNULL(ЗПТовары.ЕдиницаИзмерения.Вес, 0)) КАК ВесЗаказа,
			СУММА(ВЫБОР
					КОГДА ЗПТовары.Ссылка.СуммаВключаетНДС
						ТОГДА ЗПТовары.Сумма + ЗПТовары.СуммаНДС
					ИНАЧЕ ЗПТовары.Сумма
				КОНЕЦ) КАК СуммаЗаказа
		ИЗ
			Документ.ЗаказПокупателя.Товары КАК ЗПТовары
		
		СГРУППИРОВАТЬ ПО
			ЗПТовары.Ссылка) КАК ВесаЗаказов
		ПО (ВесаЗаказов.Ссылка = ПродажиОбороты.ЗаказПокупателя)
		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
			ЗПУслуги.Ссылка КАК Ссылка,
			СУММА(ВЫБОР
					КОГДА ЗПУслуги.Ссылка.СуммаВключаетНДС
						ТОГДА ЗПУслуги.Сумма
					ИНАЧЕ ЗПУслуги.Сумма + ЗПУслуги.СуммаНДС
				КОНЕЦ) КАК СуммаЗаказа
		ИЗ
			Документ.ЗаказПокупателя.Услуги КАК ЗПУслуги
		ГДЕ
			ЗПУслуги.Номенклатура.Код = "БП000000555"  //Услуга "Доставка"
		
		СГРУППИРОВАТЬ ПО
			ЗПУслуги.Ссылка) КАК ДоставкаВУслугах
		ПО (ДоставкаВУслугах.Ссылка = ПродажиОбороты.ЗаказПокупателя)

СГРУППИРОВАТЬ ПО
	ПродажиОбороты.ЗаказПокупателя
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	РеализацияТоваровУслуг.Сделка КАК Сделка,
	РеализацияТоваровУслуг.Ссылка КАК Реализация,
	ТоварыРТУ.ВесРеализации,
	ТоварыРТУ.СуммаРеализации,
	1 КАК Знак
ПОМЕСТИТЬ Реализации
ИЗ
	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
			РТУТовары.Ссылка КАК Ссылка,
			СУММА(РТУТовары.Количество * ЕСТЬNULL(РТУТовары.ЕдиницаИзмерения.Вес, 0)) КАК ВесРеализации,
			СУММА(ВЫБОР
					КОГДА РТУТовары.Ссылка.СуммаВключаетНДС
						ТОГДА РТУТовары.Сумма
					ИНАЧЕ РТУТовары.Сумма + РТУТовары.СуммаНДС
				КОНЕЦ) КАК СуммаРеализации
		ИЗ
			Документ.РеализацияТоваровУслуг.Товары КАК РТУТовары
		
		СГРУППИРОВАТЬ ПО
			РТУТовары.Ссылка) КАК ТоварыРТУ
		ПО (ТоварыРТУ.Ссылка = РеализацияТоваровУслуг.Ссылка)
ГДЕ
	РеализацияТоваровУслуг.Проведен
	И РеализацияТоваровУслуг.Сделка <> ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
	И НЕ РеализацияТоваровУслуг.Сделка.Ссылка ЕСТЬ NULL 

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

ВЫБРАТЬ
	ВозвратТоваровОтПокупателя.Сделка,
	ВозвратТоваровОтПокупателя.Ссылка,
	-ТоварыВТОП.ВесРеализации,
	-ТоварыВТОП.СуммаРеализации,
	-1
ИЗ
	Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
			РТУТовары.Ссылка КАК Ссылка,
			СУММА(РТУТовары.Количество * ЕСТЬNULL(РТУТовары.ЕдиницаИзмерения.Вес, 0)) КАК ВесРеализации,
			СУММА(ВЫБОР
					КОГДА РТУТовары.Ссылка.СуммаВключаетНДС
						ТОГДА РТУТовары.Сумма
					ИНАЧЕ РТУТовары.Сумма + РТУТовары.СуммаНДС
				КОНЕЦ) КАК СуммаРеализации
		ИЗ
			Документ.ВозвратТоваровОтПокупателя.Товары КАК РТУТовары
		
		СГРУППИРОВАТЬ ПО
			РТУТовары.Ссылка) КАК ТоварыВТОП
		ПО (ТоварыВТОП.Ссылка = ВозвратТоваровОтПокупателя.Ссылка)
ГДЕ
	ВозвратТоваровОтПокупателя.Проведен
	И ВозвратТоваровОтПокупателя.Сделка <> ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
	И НЕ ВозвратТоваровОтПокупателя.Сделка.Ссылка ЕСТЬ NULL 
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Рeализации1.Сделка КАК ЗаказПокупателя,
	Рeализации1.Реализация КАК Реализация,
	Рeализации1.Реализация.Дата КАК РеализацияДата,
	Рeализации1.СуммаРеализации КАК СуммаРеализации,
	Рeализации1.Знак КАК Знак,
	ВЫРАЗИТЬ(Рeализации1.ВесРеализации КАК ЧИСЛО(15, 2)) КАК Вес,
	ВЫРАЗИТЬ(ЕСТЬNULL(СУММА(Рeализации2.ВесРеализации), 0) КАК ЧИСЛО(15, 2)) КАК БазаВеса
ПОМЕСТИТЬ ДанныеСНакоплением
ИЗ
	Реализации КАК Рeализации1
		ЛЕВОЕ СОЕДИНЕНИЕ Реализации КАК Рeализации2
		ПО Рeализации1.Реализация.Дата > Рeализации2.Реализация.Дата
			И Рeализации1.Сделка = Рeализации2.Сделка

СГРУППИРОВАТЬ ПО
	Рeализации1.Сделка,
	Рeализации1.Реализация,
	Рeализации1.СуммаРеализации,
	Рeализации1.ВесРеализации,
	Рeализации1.Реализация.Дата,
	Рeализации1.Знак

ИНДЕКСИРОВАТЬ ПО
	ЗаказПокупателя,
	РеализацияДата
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Данные.ЗаказПокупателя КАК ЗаказПокупателя,
	Данные.Реализация КАК Реализация,
	Итог.СтоимостьДоставки,
	ВЫБОР
		КОГДА Итог.ВесЗаказа = 0
			ТОГДА 0
		ИНАЧЕ (ВЫРАЗИТЬ(Итог.СтоимостьДоставки * (Данные.БазаВеса + Данные.Вес) / Итог.ВесЗаказа КАК ЧИСЛО(15, 2))) - (ВЫРАЗИТЬ(Итог.СтоимостьДоставки * Данные.БазаВеса / Итог.ВесЗаказа КАК ЧИСЛО(15, 2)))
	КОНЕЦ КАК СтоимостьДоставкиРеализации,
	Итог.СебестоимостьДоставки,
	ВЫБОР
		КОГДА Итог.ВесЗаказа = 0
			ТОГДА 0
		ИНАЧЕ (ВЫРАЗИТЬ(Итог.СебестоимостьДоставки * (Данные.БазаВеса + Данные.Вес) / Итог.ВесЗаказа КАК ЧИСЛО(15, 2))) - (ВЫРАЗИТЬ(Итог.СебестоимостьДоставки * Данные.БазаВеса / Итог.ВесЗаказа КАК ЧИСЛО(15, 2)))
	КОНЕЦ КАК СебестоимостьДоставкиРеализации,
	Данные.БазаВеса,
	Данные.Вес КАК ВесРеализации,
	Итог.ВесЗаказа,
	Данные.Знак КАК Знак
ПОМЕСТИТЬ ИтогиСебестоимостиРеализаций
ИЗ
	ДанныеСНакоплением КАК Данные
		ЛЕВОЕ СОЕДИНЕНИЕ Заказы КАК Итог
		ПО (Итог.ЗаказПокупателя = Данные.ЗаказПокупателя)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ИтогиСебестоимостиРеализаций.ЗаказПокупателя,
	ИтогиСебестоимостиРеализаций.Реализация,
	ИтогиСебестоимостиРеализаций.СтоимостьДоставки,
	ИтогиСебестоимостиРеализаций.СтоимостьДоставкиРеализации,
	ИтогиСебестоимостиРеализаций.СебестоимостьДоставки,
	ИтогиСебестоимостиРеализаций.СебестоимостьДоставкиРеализации,
	ИтогиСебестоимостиРеализаций.БазаВеса,
	ИтогиСебестоимостиРеализаций.ВесРеализации,
	ИтогиСебестоимостиРеализаций.ВесЗаказа,
	ИтогиСебестоимостиРеализаций.Знак
ПОМЕСТИТЬ СтоимостиДоставок
ИЗ
	ИтогиСебестоимостиРеализаций КАК ИтогиСебестоимостиРеализаций
;

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

СГРУППИРОВАТЬ ПО
	ПродажиОбороты.ЗаказПокупателя,
	ПродажиОбороты.Регистратор.Дата,
	ПродажиОбороты.Регистратор,
	ПродажиОбороты.Номенклатура.Мотивация

ИНДЕКСИРОВАТЬ ПО
	ПродажиОбороты.ЗаказПокупателя,
	ПродажиОбороты.Регистратор.Дата,
	ПродажиОбороты.Номенклатура.Мотивация
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	БазаРаспределения.Реализация,
	СУММА(БазаРаспределения.Вес) КАК ВесРеализации
ПОМЕСТИТЬ ВесаРеализаций
ИЗ
	БазаРаспределения КАК БазаРаспределения

СГРУППИРОВАТЬ ПО
	БазаРаспределения.Реализация
;

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	БазаРаспределения.ЗаказПокупателя,
	БазаРаспределения.РегистраторДата,
	БазаРаспределения.Реализация,
	БазаРаспределения.Мотивация,
	БазаРаспределения.Вес,
	БазаРаспределения.ВесЗаказа,
	БазаРаспределения.ВесРеализации,
	БазаРаспределения.Себестоимость,
	БазаРаспределения.СтоимостьПродаж,
	БазаРаспределения.СтоимостьДоставкиРеализации,
	БазаРаспределения.СебестоимостьДоставкиРеализации,
	БазаРаспределения.Знак,
	ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(БазаРаспределения_1.Вес, 0)) КАК ЧИСЛО(15, 2)) КАК БазаВеса
ПОМЕСТИТЬ НакопленныеДанные
ИЗ
	КРаспределению КАК БазаРаспределения
		ЛЕВОЕ СОЕДИНЕНИЕ БазаРаспределения КАК БазаРаспределения_1
		ПО БазаРаспределения.ЗаказПокупателя = БазаРаспределения_1.ЗаказПокупателя
			И БазаРаспределения.Реализация = БазаРаспределения_1.Реализация
			И БазаРаспределения.Мотивация > БазаРаспределения_1.Мотивация

СГРУППИРОВАТЬ ПО
	БазаРаспределения.ЗаказПокупателя,
	БазаРаспределения.РегистраторДата,
	БазаРаспределения.Реализация,
	БазаРаспределения.Мотивация,
	БазаРаспределения.Вес,
	БазаРаспределения.ВесЗаказа,
	БазаРаспределения.БазаВеса,
	БазаРаспределения.ВесРеализации,
	БазаРаспределения.Себестоимость,
	БазаРаспределения.СтоимостьПродаж,
	БазаРаспределения.СтоимостьДоставкиРеализации,
	БазаРаспределения.СебестоимостьДоставкиРеализации,
	БазаРаспределения.Знак
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Данные.ЗаказПокупателя.Ответственный КАК Менеджер,
	Данные.ЗаказПокупателя КАК ЗаказПокупателя,
	Данные.Реализация КАК Реализация,
	Данные.Реализация.Дата КАК РеализацияДата,
	Данные.Мотивация КАК Мотивация,
	Данные.СтоимостьДоставкиРеализации КАК СтоимостьДоставки,
	Данные.СебестоимостьДоставкиРеализации КАК СебестоимостьДоставки,
	Данные.ВесРеализации,
	Данные.Знак * ВЫБОР
		КОГДА ВесаРеализаций.ВесРеализации = 0
			ТОГДА 0
		ИНАЧЕ (ВЫРАЗИТЬ(Данные.СтоимостьДоставкиРеализации * (Данные.БазаВеса + Данные.Вес) / ВесаРеализаций.ВесРеализации КАК ЧИСЛО(15, 2))) - (ВЫРАЗИТЬ(Данные.СтоимостьДоставкиРеализации * Данные.БазаВеса / ВесаРеализаций.ВесРеализации КАК ЧИСЛО(15, 2)))
	КОНЕЦ КАК Доставка,
	Данные.Знак * ВЫБОР
		КОГДА ВесаРеализаций.ВесРеализации = 0
			ТОГДА 0
		ИНАЧЕ (ВЫРАЗИТЬ(Данные.СебестоимостьДоставкиРеализации * (Данные.БазаВеса + Данные.Вес) / Данные.ВесРеализации КАК ЧИСЛО(15, 2))) - (ВЫРАЗИТЬ(Данные.СебестоимостьДоставкиРеализации * Данные.БазаВеса / Данные.ВесРеализации КАК ЧИСЛО(15, 2)))
	КОНЕЦ КАК ЗатратыНаДоставку,
	Данные.Вес,
	Данные.Себестоимость,
	Данные.СтоимостьПродаж,
	Данные.ВесЗаказа
ИЗ
	НакопленныеДанные КАК Данные
		ЛЕВОЕ СОЕДИНЕНИЕ ВесаРеализаций КАК ВесаРеализаций
		ПО (ВесаРеализаций.Реализация = Данные.Реализация)

УПОРЯДОЧИТЬ ПО
	Менеджер,
	ЗаказПокупателя,
	РеализацияДата
Показать


p.s. с тем что запрос можно слегка сократить - согласен
По теме из базы знаний
Ответы
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. корум 287 26.05.17 15:45 Сейчас в теме
(1) загляни в ЗУП, УПП или ERP , и ужаснись.
5. KazanKokos 10 26.05.17 15:48 Сейчас в теме
(2) да согласен. не самый большой запрос. но все же :)
3. ResetAtreides 26.05.17 15:47 Сейчас в теме
310? Даже не смешно.. Вот только что один старый отчет СКД открыл, запрос 4750 строк..
4. KazanKokos 10 26.05.17 15:48 Сейчас в теме
(3) я гдет тысячи на 3 строк рисовал запрос в 1С:ПИФ как-то. только он динамически собирался.
7. корум 287 26.05.17 15:54 Сейчас в теме
(3) "у нас джЭнтльменам верят на слово..."?
11. KazanKokos 10 26.05.17 15:59 Сейчас в теме
(7) давно писал. уже не найти. ))
12. ResetAtreides 26.05.17 15:59 Сейчас в теме
(7) А что ты хочешь увидеть? Все 4тыс строк, которые конструктор все равно не откроет, т.к. там свои регистры к УППшным добавлены. Или скриншот блокнота?
Предлагаю просто поверить, думаю типовые такого же размера можно встретить
13. корум 287 26.05.17 16:07 Сейчас в теме
(12) хочу увидеть, справится ли движок форума инфостарт с такими простынями.
16. ResetAtreides 26.05.17 16:11 Сейчас в теме
(13) Ну так запости сам какой нибудь общий модуль и проверь. Если просто сомневаешься что он есть, могу на почту сам отчет скинуть
6. корум 287 26.05.17 15:53 Сейчас в теме
Решил испытать движок инфостарта на длину постов? Спросил бы напрямую у админов :)

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

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

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_ДанныеСотрудников.ПериодРегистрации КАК ДатаС,
	ВТ_ДанныеСотрудников.Сотрудник,
	МИНИМУМ(ЕСТЬNULL(ВТ_ДанныеСотрудников1.ПериодРегистрации, ДОБАВИТЬКДАТЕ(&ПериодРегистрации, МЕСЯЦ, 1))) КАК ДатаПо
ПОМЕСТИТЬ ВТ_ПериодыРаботы
ИЗ
	ВТ_ДанныеСотрудников КАК ВТ_ДанныеСотрудников
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ДанныеСотрудников КАК ВТ_ДанныеСотрудников1
		ПО ВТ_ДанныеСотрудников.Сотрудник = ВТ_ДанныеСотрудников1.Сотрудник
			И ВТ_ДанныеСотрудников.ПериодРегистрации < ВТ_ДанныеСотрудников1.ПериодРегистрации

СГРУППИРОВАТЬ ПО
	ВТ_ДанныеСотрудников.Сотрудник,
	ВТ_ДанныеСотрудников.ПериодРегистрации
;

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

СГРУППИРОВАТЬ ПО
	Начисления.ВидРасчета,
	ВТ_ПериодыРаботы.Сотрудник,
	ВТ_ПериодыРаботы.Сотрудник.Код,
	ВТ_ПериодыРаботы.ДатаС

ИНДЕКСИРОВАТЬ ПО
	Сотрудник
;

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

СГРУППИРОВАТЬ ПО
	ВложенныйЗапрос.Сотрудник,
	ВложенныйЗапрос.Начисление,
	НАЧАЛОПЕРИОДА(ВложенныйЗапрос.ПериодРегистрации, ДЕНЬ),
	ВложенныйЗапрос.Размер

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

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

СГРУППИРОВАТЬ ПО
	ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Сотрудник,
	ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Значение,
	НАЧАЛОПЕРИОДА(ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Период, ДЕНЬ),
	ВложенныйЗапрос.Начисление
;

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

СГРУППИРОВАТЬ ПО
	ЕСТЬNULL(ВТ_НачисленияФакт.Сотрудник, ВТ_НачисленияПлан.Сотрудник),
	ЕСТЬNULL(ВТ_НачисленияФакт.ВидРасчета, ВТ_НачисленияПлан.Начисление),
	ЕСТЬNULL(ВТ_НачисленияФакт.СотрудникКод, ВТ_НачисленияПлан.Сотрудник.Код),
	ЕСТЬNULL(ВТ_НачисленияПлан.Размер, 0),
	ЕСТЬNULL(ВТ_НачисленияФакт.ОтработаноЧасов, 0),
	ЕСТЬNULL(ВТ_НачисленияФакт.Начисление, 0),
	ЕСТЬNULL(ВТ_НачисленияФакт.ПериодДействия, ВТ_НачисленияПлан.Период)

ИНДЕКСИРОВАТЬ ПО
	Сотрудник
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
	&ПериодРегистрации,
	ГрафикРаботыСотрудниковСрезПоследних.Сотрудник,
	ГрафикРаботыСотрудниковСрезПоследних.ГрафикРаботы КАК ГрафикРаботы
ПОМЕСТИТЬ ВТ_ДанныеГрафиков
ИЗ
	РегистрСведений.ГрафикРаботыСотрудников.СрезПоследних(
			&ПериодРегистрации,
			Сотрудник В
				(ВЫБРАТЬ
					Сотр.Сотрудник
				ИЗ
					Вт_Данные КАК Сотр)) КАК ГрафикРаботыСотрудниковСрезПоследних

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

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
	&ПериодРегистрации,
	ТерриторииСотрудниковСрезПоследних.Сотрудник,
	ВЫБОР
		КОГДА ТерриторииСотрудниковСрезПоследних.ДействуетДо <> ДАТАВРЕМЯ(1, 1, 1)
				И ТерриторииСотрудниковСрезПоследних.ДействуетДо < &ПериодРегистрации
			ТОГДА ТерриторииСотрудниковСрезПоследних.ТерриторияПоОкончании
		ИНАЧЕ ТерриторииСотрудниковСрезПоследних.Территория
	КОНЕЦ КАК Территория
ПОМЕСТИТЬ ВТ_ДанныеТерриторий
ИЗ
	РегистрСведений.ТерриторииСотрудников.СрезПоследних(
			&ПериодРегистрации,
			Сотрудник В
				(ВЫБРАТЬ
					Сотр.Сотрудник
				ИЗ
					Вт_Данные КАК Сотр)) КАК ТерриторииСотрудниковСрезПоследних

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

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВложенныйЗапрос.Сотрудник,
	ВложенныйЗапрос.ДатаС КАК ПериодРегистрации,
	ВТ_ДанныеГрафиков.ГрафикРаботы,
	ВложенныйЗапрос.ДатаПо
ПОМЕСТИТЬ ВТ_ГрафикиПоПериодам
ИЗ
	(ВЫБРАТЬ
		ВТ_ПериодыРаботы.Сотрудник КАК Сотрудник,
		ВТ_ПериодыРаботы.ДатаС КАК ДатаС,
		МАКСИМУМ(ВТ_ДанныеГрафиков.ПериодРегистрации) КАК ПериодРегистрации,
		ВТ_ПериодыРаботы.ДатаПо КАК ДатаПо
	ИЗ
		ВТ_ПериодыРаботы КАК ВТ_ПериодыРаботы
			ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ДанныеГрафиков КАК ВТ_ДанныеГрафиков
			ПО ВТ_ПериодыРаботы.Сотрудник = ВТ_ДанныеГрафиков.Сотрудник
				И ВТ_ПериодыРаботы.ДатаС >= ВТ_ДанныеГрафиков.ПериодРегистрации
	
	СГРУППИРОВАТЬ ПО
		ВТ_ПериодыРаботы.Сотрудник,
		ВТ_ПериодыРаботы.ДатаС,
		ВТ_ПериодыРаботы.ДатаПо) КАК ВложенныйЗапрос
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ДанныеГрафиков КАК ВТ_ДанныеГрафиков
		ПО ВложенныйЗапрос.Сотрудник = ВТ_ДанныеГрафиков.Сотрудник
			И ВложенныйЗапрос.ПериодРегистрации = ВТ_ДанныеГрафиков.ПериодРегистрации
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВложенныйЗапрос.Сотрудник,
	ВложенныйЗапрос.ДатаС КАК ПериодРегистрации,
	ВложенныйЗапрос.ДатаПо,
	ВТ_ДанныеТерриторий.Территория
ПОМЕСТИТЬ ВТ_ТерииторииПоПериодам
ИЗ
	(ВЫБРАТЬ
		ВТ_ПериодыРаботы.Сотрудник КАК Сотрудник,
		ВТ_ПериодыРаботы.ДатаС КАК ДатаС,
		МАКСИМУМ(ВТ_ДанныеТерриторий.ПериодРегистрации) КАК ПериодРегистрации,
		ВТ_ПериодыРаботы.ДатаПо КАК ДатаПо
	ИЗ
		ВТ_ПериодыРаботы КАК ВТ_ПериодыРаботы
			ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ДанныеТерриторий КАК ВТ_ДанныеТерриторий
			ПО ВТ_ПериодыРаботы.Сотрудник = ВТ_ДанныеТерриторий.Сотрудник
				И ВТ_ПериодыРаботы.ДатаС >= ВТ_ДанныеТерриторий.ПериодРегистрации
	
	СГРУППИРОВАТЬ ПО
		ВТ_ПериодыРаботы.Сотрудник,
		ВТ_ПериодыРаботы.ДатаС,
		ВТ_ПериодыРаботы.ДатаПо) КАК ВложенныйЗапрос
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ДанныеТерриторий КАК ВТ_ДанныеТерриторий
		ПО ВложенныйЗапрос.Сотрудник = ВТ_ДанныеТерриторий.Сотрудник
			И ВложенныйЗапрос.ПериодРегистрации = ВТ_ДанныеТерриторий.ПериодРегистрации
;

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

СГРУППИРОВАТЬ ПО
	ВТ_ГрафикиПоПериодам.ПериодРегистрации,
	ВТ_ГрафикиПоПериодам.Сотрудник,
	ВТ_ГрафикиПоПериодам.ГрафикРаботы
;

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

СГРУППИРОВАТЬ ПО
	ВТ_Данные.Сотрудник,
	ВТ_Данные.ТабельныйНомер,
	ВТ_ДанныеСотрудников.Должность,
	ВТ_ДанныеСотрудников.Подразделение,
	ВТ_Данные.Период
;

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

УПОРЯДОЧИТЬ ПО
	Сотрудник,
	Период
АВТОУПОРЯДОЧИВАНИЕ
Показать
9. KazanKokos 10 26.05.17 15:55 Сейчас в теме
(6) Думаешь тема взлетит? :) А так еще хотел продемонстрировать как применить запрос с распределением суммы :)
10. корум 287 26.05.17 15:56 Сейчас в теме
(9) думаю в итоге придёт support и закономерно грохнет тему.
8. nihfalck 26.05.17 15:54 Сейчас в теме
ради интереса пошел померил) запрос из самописной обработки по зарплате - формирует большую таблицу по плановым и фактическим начислениям - 1567 строк. это сплошным текстом, без динамического формирования.
14. herfis 498 26.05.17 16:09 Сейчас в теме
Аналитический отчетик на СКД собственноручный самописный - 843 строки (но там отключено автозаполнение и много занимают настройки СКД)
Но я легко и в 10 000 могу поверить.
15. starik-2005 3036 26.05.17 16:10 Сейчас в теме
Большие запросы пишутся горе-программистами 1С из-за горе-рекомендаций фирмы 1С. Суть горе-рекомендаций в том, чтобы программист, не особо знакомый с работой SQL-оптимизатора, планами запросов и прочей внутренней кухней СУБД выделял все используемые таблицы сначала во временные, а потом уже из временных таблиц формировал результат. В итоге такие горе-программисты пишут запрос с сотней временных таблиц, а в конце не редок случай, когда результат этого всего фильтруется по одной ссылке. Видел я как-то обмен данными между ЗУП и порталом Битрикса, где порядка тысячи строк в запросе в основном составляли конструкции "ВЫБРАТЬ А, Б, Ц ПОМЕСТИТЬ ВТТ1 ИЗ Т1; ВЫБРАТЬ Б, Ц, А ПОМЕСТИТЬ ВТТ2 ИЗ ВТТ1; ...".

В общем есть одно достаточно на мой взгляд репрезентативное наблюдение - чем длиннее запрос, тем тупее программист. Понятно, что есть и исключения, но они часто только подтверждают правило.
v3rter; Serega-artem; +2 Ответить
17. KazanKokos 10 26.05.17 16:16 Сейчас в теме
(15) ВТ используются не от тупости а для наглядности во время разработки ) Злой Вы Сергей : )
18. starik-2005 3036 26.05.17 16:18 Сейчас в теме
(17)
ВТ используются не от тупости а для наглядности
Для наглядности чего? Чем ВТ будет нагляднее простого соединения или объединения двух таблиц?
19. KazanKokos 10 26.05.17 16:21 Сейчас в теме
(18) я согласен что есть моменты когда без подзапросов нельзя обойтись. Но когда нет разницы что с ВТ что без почему бы и нет?
Ты просто создаешь запрос последовательно. готовишь таблицы потом скармливаешь другой. Так нагляднее и быстрее.
Тот же приведенный запрос отрабатывает за 2 секунды на большой реальной базе.
20. ResetAtreides 26.05.17 16:21 Сейчас в теме
(18)
Чем ВТ будет нагляднее простого соединения или объединения двух таблиц?

Ну хотя бы тем, что не всегда этого достаточно или что иногда приходится одни и те же таблицы использовать несколько раз.. или тем, что эти таблицы перед соединением/объединением должны быть как-то обработаны.. или тем, что дофига соединений в одной таблицы почти нечитаемы
klinval; nihfalck; KazanKokos; +3 Ответить
21. KazanKokos 10 26.05.17 16:23 Сейчас в теме
(20) точно. Вот не ожидал от Старика такого ответа. никак :)
22. herfis 498 26.05.17 16:30 Сейчас в теме
(20)
Ну хотя бы тем, что не всегда этого достаточно или что иногда приходится одни и те же таблицы использовать несколько раз.. или тем, что эти таблицы перед соединением/объединением должны быть как-то обработаны..

И где же тут наглядность?
23. ResetAtreides 26.05.17 16:36 Сейчас в теме
(22) Есть на входе таблица номенклатура + цена. Надо по ней пропорционально сумме строки размазать какую-то общую сумму. Текст запроса без временных таблиц приведите?
25. herfis 498 26.05.17 16:37 Сейчас в теме
(23) Вы не поняли. Разговор был про наглядность. Наглядность не имеет отношения к функциональности. А вы привели причины больше функциональные, наглядность там разве что прицепом.
27. ResetAtreides 26.05.17 16:42 Сейчас в теме
(25) С временной таблицей это наглядный и понятный запрос, без неё скорее всего тоже получится, но что бы понять, придется сидеть и курить
(26) Должно или не должно, это вопрос ситуационный. Обычно у меня такая потребность возникала посередине другого запроса, и выходить из него, что бы что-то пересчитать и заходить назад как-то странно. Да и пока считаю, что запрос это быстрее сделает. Примеров сравнения производительности не видел
28. starik-2005 3036 27.05.17 09:16 Сейчас в теме
(27)
Примеров сравнения производительности не видел
Ну так почитайте соответствующую литературу. Есть достаточно много публикаций о том, что не нужно все делать в запросе. Но, конечно, это не публикации про 1С, но принципы работы везде примерно одинаковые.
29. ResetAtreides 29.05.17 12:49 Сейчас в теме
(28) Это напоминает пойди туда, не знаю куда, найди то.. и пр. Если уж лень даже ссылку дать, то смысл вашего сообщения?
33. starik-2005 3036 29.05.17 13:23 Сейчас в теме
(29) ну, например, на хабре про 1С и распределение: https://habrahabr.ru/post/318240/
Но важен тут вот этот комментарий:
Вы попали в точку. На специализированном форуме (ссылка выше), где была размещена та же статья, автору указали на это несоответствие.
В том подмножестве T-SQL, которое реализовано в 1С нет, например, оконных функций, которые в этой задаче позволяют быстро посчитать нарастающий итог — это два первых запроса. Также нет и RowNumber(), который помог бы третий запрос оптимизировать. Поэтому как будто все должно было быть наоборот: запрос должен был тормозить (там n^2), а код — снизить затраты до n. Как автор получил прямо противоположный результат — можно только догадываться.
В статье действительно больше лирики, чем физики.

Но если действительно интересно, то могу поискать соответствующие статьи (да и Вы можете их поискать на том же хабре).
36. ResetAtreides 29.05.17 14:48 Сейчас в теме
(33) Но в целом-то указанная статья именно о том, что запрос быстрее работает. Ну и ту задачу, что там упоминается, я бы запросом не стал делать, нарушается принцип читаемости кода. А так, если есть ещё какие-то статьи, где выборки быстрее запроса, с удовольствием посмотрю. Спасибо
37. starik-2005 3036 29.05.17 15:51 Сейчас в теме
(36)
где выборки быстрее запроса
Это не единственная причина. Предположу, что "ВЫБРАТЬ 1+2+3*7+12*34+4...." может работать быстрее, чем А = 1+2+3*7+12*34+4..., но мы же не используем для этого запрос, да?

Есть много всего, что можно делать запросами (например, реализация жадного алгоритма от Ильдаровича), но это не значит, что оное нужно делать запросами. По поводу статей -то если Вас забанили в гугле, то я, конечно, могу поискать, но, помнится, их было достаточно, чтобы Вы и сами могли справиться. Например, на том же хабре была статья, в которой достаточно убедительно предлагали даже сортировку в ряде случаев передавать даже не серверу приложений (не говоря уже о сервере базы данных), а клиенту при отображении, чтобы экономить ресурсы сервера. Это может быть справедливо для небольших списков, которые используются достаточно часто в интерфейсе клиента. Т.к. клиентов много и все они работают на отдельном компьютере, то в ряде случаев лучше сэкономить на сортировке и упорядочивать данные списки на стороне клиента, а не писать "упорядочить" в запросе. Но, конечно, это уже при достаточной зрелости проекта и высоком числе пользователей, ибо сортировка в любом случае меньше чем n*log2(n) не займет и при выполнении оной на сервере эта нагрузка будет взята из его ресурсов, при этом клиент будет "курить".
38. herfis 498 29.05.17 16:06 Сейчас в теме
(37) Со всем согласен. Только, к сожалению, почти все эти справедливые замечания плохо ложатся на 1С. Тонкий клиент провоцирует все делать на сервере (все оптимизации сводятся к кэшированию на клиенте и уменьшению количества серверных вызовов, иначе только хуже будет). СКД провоцирует все делать в запросе (процедурные вкрапления дороги и сложны). Тормоза 1С провоцируют перекладывать нагрузку на сервер СУБД. И так далее. В функционале 1С изначально есть некий дисбаланс, который не позволяет прямо применять сложившиеся best practices. У 1С они, к сожалению, свои.
39. KazanKokos 10 29.05.17 16:08 Сейчас в теме
(38) по приведенной задаче требовалось построить отчет. никаких документов и т.д.. Предлагаете сделать выборки высчитать все внутри объекта отчета и рисовать отчет вручную?
40. herfis 498 29.05.17 16:18 Сейчас в теме
(39) Да кого тут интересует ваша задача? :) Тут, понимаешь, разговор за жисть.
корум; nihfalck; KazanKokos; +3 Ответить
41. starik-2005 3036 29.05.17 17:47 Сейчас в теме
(38)
е эти справедливые замечания плохо ложатся на 1С.
Не уверен. Достаточно многое можно делать и на клиенте (особенно, если на сервере какое-нить г-но с 100 ядрами и частотой 2ГГц - зион 1-го поколения 65нм, а на клиенте i3 3,5ГГц 14нм, который это же этак раза в три быстрее вычислит, ибо все-равно в один поток). Я, например, стараюсь на сервер бегать из больших форм только без контекста или в общие модули, т.к. большую часть управления формой можно сделать безо всего вот этого серверного дергания контекста. Более того, ради интереса попробуйте строку разложить в массив подстрок вызвав безконтекстную процедуру и вызвав клиентскую процедуру. Даже на файловой базе скорость клиентского вызова на порядок выше, не говоря уже о вызове безконтекстной процедуры в клиент-сервере - это на два порядка медленнее. И если стоит задача размазать сумму по строкам табличной части документа, то серверный вызов тут нафиг не нужен - на клиенте реально будет быстрее. Это не говоря о запросах. Просто MVC нужно уметь готовить, а не просто по-привычке юзать то, что в 1С типа считается стандартом. (- Вы все делаете так, как делали все время... - Но все время делали так...(с) Астерикс и Обеликс: Клеопатра).
42. KazanKokos 10 29.05.17 17:54 Сейчас в теме
(41) хм. вешать на клиента не логично как мне кажется в любом случае. даже простое условное оформление иногда тормозит.
Плюс если мы всегда можем потребовать хорошую мощность сервера, то мощь клиентской машины никогда, а представьте как будут работать процедуры на минимальной конфигурации компов да еще с вебклиента.
48. starik-2005 3036 30.05.17 10:55 Сейчас в теме
(42)
даже простое условное оформление иногда тормозит
Ибо оно дергает сервер, если его менять (не меняется оно на клиенте). Или имеется ввиду оформление выводимых строк? Не замечал, что тормоза именно в нем (если, конечно, там не мульон разыменовываний и тыща строк).
49. KazanKokos 10 30.05.17 11:05 Сейчас в теме
(48) в любом случае работать с данными на клиенте дебилизм считаю )
50. starik-2005 3036 30.05.17 11:47 Сейчас в теме
(49)
работать с данными на клиенте дебилизм считаю
Все - данные. Все - дебилы )))
43. herfis 498 29.05.17 17:59 Сейчас в теме
(41)
И если стоит задача размазать сумму по строкам табличной части документа, то серверный вызов тут нафиг не нужен - на клиенте реально будет быстрее.

ЕМНИП, если начать лопатить большую ТЧ на клиенте, то это спровоцирует ряд неявных контекстных вызовов платформы для синхронизации серверного контекста. Тогда как на сервере это будет один явный. Так что как раз массовую обработку ТЧ лучше делать на сервере.
KazanKokos; +1 Ответить
44. KazanKokos 10 29.05.17 18:01 Сейчас в теме
(43) "ЕМНИП, если начать лопатить большую ТЧ на клиенте" - абсолютно согласен. Лично для меня это железный аргумент все делать на сервере. Ато меня тут многозвездочные чуть не сбили с правильного пути.
45. herfis 498 29.05.17 18:05 Сейчас в теме
(44) Ну, про все остальное-то правильно. Если можно минимизировать серверные вызовы - нужно их минимизировать. Если можно обойтись неконтекстными - надо ими обходиться. И про то, что на клиент можно достаточно сложные расчеты выносить - тоже верно. Просто нечасто так бывает, чтобы сложные расчеты не были завязаны на синхронизацию контекста (в рамках одной строки или шапки).
47. starik-2005 3036 29.05.17 19:11 Сейчас в теме
(44)
абсолютно согласен
Доверяй, но проверяй! (с)
46. starik-2005 3036 29.05.17 19:11 Сейчас в теме
(43)
ЕМНИП, если начать лопатить большую ТЧ на клиенте, то это спровоцирует ряд неявных контекстных вызовов платформы для синхронизации серверного контекста
Пример приведете? Всегда было интересно )))
53. herfis 498 30.05.17 12:49 Сейчас в теме
(46) Поставил эксперимент на 8.3.6
На тысяче строк табличной части лишних серверных вызовов вроде не генерится при их пересчете на клиенте.
Видать, либо на ранних релизах было иначе либо память подвела.
54. starik-2005 3036 30.05.17 13:30 Сейчас в теме
(53)
Видать, либо на ранних релизах было иначе либо память подвела.
Память подвела. Неявные серверные запросы генерятся для, например, получения представления ссылки, но при обработке значений простых типов такого происходить не будет (да и не было никогда).
30. корум 287 29.05.17 12:56 Сейчас в теме
(27)
Обычно у меня такая потребность возникала посередине другого запроса, и выходить из него, что бы что-то пересчитать и заходить назад как-то странно.


Обычно помогает перед открытием конструктора запросов (или блокнота, не суть) какое-то время подумать над постановкой задачи, чтобы не возникали ВНЕЗАПНЫЕ потребности.

Архитектор - это не только гараж нарисовать.
31. ResetAtreides 29.05.17 13:03 Сейчас в теме
(30) Очередной телепат, лечащий по посту в интернете?
KazanKokos; +1 Ответить
26. starik-2005 3036 26.05.17 16:39 Сейчас в теме
(23)
Есть на входе таблица номенклатура + цена. Надо по ней пропорционально сумме строки размазать какую-то общую сумму.
Это вообще не должно решаться запросом. Запросы не для этого созданы. У Ильдааровича есть примеры того, как это делать, и запрос там - далеко не первый по производительности. Запросам запросово, а коду кодово! (с)
24. starik-2005 3036 26.05.17 16:36 Сейчас в теме
(20)
...

Ну, во-первых, если этого недостаточно, то никто не мешает отфильтровать данные в самом соединении. Если же данные используются повторно (типа списка физиков из ЗУП), то я лично, ни разу не против того, чтобы поместить их в ВТ и проиндексировать. Но реляционные структуры - это связанные данные, которые нужны обычно в одном кортеже из нескольких таблиц. И если сначала все засовывать во временную таблицу, а потом это все обрабатывать, то проблема возникает в том, что временная таблица - это не таблица в памяти - она пишется в tempdb. И если есть очень много документов, из которых нужно отобрать все документы по определенной, например, номенклатуре, то не стоит засовывать этот список во временную таблицу, а нужно просто взять и получить ссылку из табличной части документа, отфильтрованной по нужной номенклатуре.

Временные таблицы вообще должны быть использованы только для повторного использования или для последующей фильтрации через внутреннее соединение больших списков по небольшой группе элементов фильтра. В остальных случаях применение временных таблиц лично мне видится крайне нецелесообразным.
32. v3rter 29.05.17 13:17 Сейчас в теме
Большие запросы развивают интеллект и заставляют задуматься о быстродействии ) Но не всё удобно делать запросами, особенно если нужно пронумеровать строки, составить пары и т.п.
34. ipoloskov 162 29.05.17 13:32 Сейчас в теме
Большой запрос может говорить о неправильной архитектуре данных. И программист городит трехэтажные выборки вместо того, чтобы добавить реквизит в регистр.
корум; +1 Ответить
35. KazanKokos 10 29.05.17 14:14 Сейчас в теме
(34) в случае простых выборок да.
но бывает что
- ты приходишь на базу с большой историей и с недоработанным регистрами а отчет нужен срочно. Тогда выхода нет.
- сложные случаи там "Распределение сумм","Расчет по календарю","Поиск пустых мест", "Отчеты по просрочке" и прочее прочее
51. d4rkmesa 30.05.17 12:04 Сейчас в теме
Нет времени разбираться как воткнуть запрос, стандартный запрос по остаткам из 3-й WMS >4000 строк.
52. KazanKokos 10 30.05.17 12:48 Сейчас в теме
(51) [ CODE ] здесь код [ / CODE ] только пробелы убери :)
Оставьте свое сообщение

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