gifts2017

Обработка для конвертации текста запроса, построенного на вложенных запросах, в запрос на временных таблицах для 8.2

Опубликовал Andrey Matveev (matveev.andrey.v) в раздел Программирование - Инструментарий

Столкнулись с редактированием текста запроса под временные таблицы вместо вложенных запросов? Потеряли поля при таком редактировании? Тогда это вам пригодится
После прочтения статьи "ТИПИЧНЫЕ ПРИЧИНЫ НЕОПТИМАЛЬНОЙ РАБОТЫ ЗАПРОСОВ И МЕТОДЫ ОПТИМИЗАЦИИ В 1С " появилось желание оптимизировать многие свои отчеты и запросы, и убрать из них все связи с вложенными запросами, переделав их во временные таблицы. Оказалось что делать это не так просто как на первый взгляд, иногда теряются какие то названия полей и в итоге могут потеряться итоговые поля или условия последнего запроса. Это привело к созданию такой обработки. Из особенностей отмечу автоматическую нумерацию вложенных запросов с названием "Вложенный запрос", а так же правильное установление порядка следования и вложенности вложенных запросов при преобразование в пакетный запрос. Проверял на больших запросах, работает отлично. Сохраняйте старую копию и формируйте по новому и сравнивайте результат. По моему опыту выигрыш в производительности дает значительный при очень больших запросах с большим количеством связей, у меня есть приме когда с 15 минут формирования сократился до 1 минуты. Значительный прирост производительности появился на SQL базах с редко обновляемой или не обновляемой статистикой. Подробнее про это влияние можете прочесть в статье в начале описания.

Теперь о самой обработке, до преобразования необходимо открыть текст запроса конструктором и нажать ОК, делается это для удаления лишних пробелов пустых строк и т.п. что бы конвертеру возможно было распознать конструкции вложенного запроса. Далее все просто скидываем текст наживаем "Преобразовать" и получаем новый текст. Есть еще кнопка "Заменить первый", она заменяет только внешний запрос во временную таблицу и далее не продолжает. 

!Внимание заменяет все вложенные запросы на временные, независимо от того используются они в соединении(или условии) или нет, т.е. для таких вложенных таблиц не происходит оптимизации!

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Обработка для конвертации теста запроса построенного на вложенных запросах в запрос на временных таблицах для 8.2
.epf 8,83Kb
16.07.14
16
.epf 1.0.0.0 8,83Kb 16 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Саша Безымяный (help1Ckr) 23.07.14 10:08
Идея хорошая, но можно сделать еще лучше - встроить данный механизм в типовую консоль запросов
2. Andrey Matveev (matveev.andrey.v) 23.07.14 11:59
(1) help1Ckr, спасибо за оценку, уже встроил, но выложить тут не смогу поскольку консоль запросов не моя разработка. Могу выслать консоль доработанную вам
3. aspirator 23 (aspirator23) 27.07.14 15:21
(2) И мне можно эту консоль получить? Часто приходится встречать запросы с вложенными подзапросами и переделывать.
4. Andrey Matveev (matveev.andrey.v) 28.07.14 07:19
(3) aspirator23, Да конечно, отправил вам в ЛС
5. aspirator 23 (aspirator23) 28.07.14 10:27
6. Amid Dimas (dimas103) 28.07.14 12:59
Попробовал Из УТ 10.3 запрос "Печать прайс-листа" взять, он тормозит на PostgreSQl. Этой обработкой сделать не получилось. Не правильно конвертирует.
ВЫБРАТЬ РАЗРЕШЕННЫЕ //РАЗЛИЧНЫЕ
   ЗапросПрайс.ЦеноваяГруппа.Порядок КАК ЦеноваяГруппаПорядок,
	НЕ ЕСТЬNULL(ЗапросПрайс.Номенклатура.ВестиУчетПоХарактеристикам, ИСТИНА) КАК НетХарактеристик,
	ЗапросПрайс.ТипЦен.ПорядокОкругления КАК ПорядокОкругления,
	ЗапросПрайс.ТипЦен.ОкруглятьВБольшуюСторону КАК ОкруглятьВБольшуюСторону,
	ЗапросПрайс.ТипЦен КАК ТипЦен,
	ЗапросПрайс.ТипЦен.Представление КАК ТипЦенПредставление,
	ЗапросПрайс.ЦеноваяГруппа,
	ЗапросПрайс.ЦеноваяГруппа.Представление КАК ЦеноваяГруппаПредставление,
	ЗапросПрайс.Номенклатура КАК Номенклатура,
	ЗапросПрайс.Номенклатура.Представление КАК НоменклатураПредставление,
	ЗапросПрайс.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
	ЗапросПрайс.ХарактеристикаНоменклатуры.Представление КАК ХарактеристикаНоменклатурыПредставление,
	Остатки.Остаток,
	МестаХранения.МестоХранения КАК Стеллаж,
	МестаХранения.МестоХранения.Представление КАК СтеллажПредставление,
	Штрихкоды.Штрихкод КАК ШтрихКод,
	ВЫБОР КОГДА ЗапросПрайс.Цена <> 0 ТОГДА
		ЗапросПрайс.ЕдиницаИзмерения.Представление
	ИНАЧЕ
		&ПустаяСтрока
	КОНЕЦ КАК ЕдиницаИзмерения,
	ВЫБОР КОГДА ЗапросПрайс.Цена <> 0 ТОГДА
		ЗапросПрайс.ВалютаПрайса.Представление
	ИНАЧЕ
		&ПустаяСтрока
	КОНЕЦ КАК Валюта,
	ВЫБОР КОГДА ЗапросПрайс.Валюта = ЗапросПрайс.ВалютаПрайса
			ИЛИ ЗапросПрайс.Цена = 0 ТОГДА
		ЗапросПрайс.Цена
	ИНАЧЕ
		ЗапросПрайс.Цена * ВЫБОР КОГДА КурсыВалютСрезПоследних.Курс = 0 ТОГДА
										1
									ИНАЧЕ
										КурсыВалютСрезПоследних.Курс КОНЕЦ
						 * ВЫБОР КОГДА КурсыВалютСрезПоследнихОтчет.Кратность = 0 ТОГДА
										1
									ИНАЧЕ
										КурсыВалютСрезПоследнихОтчет.Кратность КОНЕЦ
						 / ВЫБОР КОГДА КурсыВалютСрезПоследнихОтчет.Курс = 0 ТОГДА
										1
									ИНАЧЕ
										КурсыВалютСрезПоследнихОтчет.Курс КОНЕЦ
						 / ВЫБОР КОГДА КурсыВалютСрезПоследних.Кратность = 0 ТОГДА
										1
									ИНАЧЕ
										КурсыВалютСрезПоследних.Кратность КОНЕЦ
	КОНЕЦ КАК Цена
//СВОЙСТВА
//ПРЕДСТАВЛЕНИЯ_СВОЙСТВА
ИЗ
(ВЫБРАТЬ 
	ЦеныБазовые.ТипЦен КАК ТипЦен,
	ВЫБОР КОГДА &ВВалютеОтчета = ЛОЖЬ ТОГДА
		ВЫБОР КОГДА ЦеныБазовые.ТипЦен.Рассчитывается ТОГДА
			ЦеныБазовые.ТипЦен.ВалютаЦены
		ИНАЧЕ
			МИНИМУМ(
				ВЫБОР КОГДА ЦеныБазовые.ТипЦен.Рассчитывается ТОГДА
					ВЫБОР КОГДА ЦеныРасчетные.Валюта ЕСТЬ NULL ТОГДА
						ЦеныБазовые.Валюта
					ИНАЧЕ
						ВЫБОР КОГДА ЦеныБазовые.СпособРасчетаЦены = &СпособНаценка ТОГДА
							ЦеныРасчетные.Валюта
						ИНАЧЕ
							ЦеныБазовые.ВалютаДиапазона
						КОНЕЦ
					КОНЕЦ
				ИНАЧЕ
					ЦеныБазовые.Валюта
				КОНЕЦ
			)
		КОНЕЦ
	ИНАЧЕ
		&ВалютаОтчета
	КОНЕЦ КАК ВалютаПрайса,
	ЦеныБазовые.ЦеноваяГруппа,
	ЦеныБазовые.Номенклатура,
	ЦеныБазовые.ХарактеристикаНоменклатуры,
	МИНИМУМ(
		ВЫБОР КОГДА ЦеныБазовые.ТипЦен.Рассчитывается ТОГДА
			ЦеныРасчетные.ЕдиницаИзмерения
		ИНАЧЕ
			ЦеныБазовые.ЕдиницаИзмерения
		КОНЕЦ
	) КАК ЕдиницаИзмерения,
	МИНИМУМ(
		ВЫБОР КОГДА ЦеныБазовые.ТипЦен.Рассчитывается ТОГДА
			ВЫБОР КОГДА ЦеныРасчетные.Валюта ЕСТЬ NULL ТОГДА
				ЦеныБазовые.Валюта
			ИНАЧЕ
				ВЫБОР КОГДА ЦеныБазовые.СпособРасчетаЦены = &СпособНаценка ТОГДА
					ЦеныРасчетные.Валюта
				ИНАЧЕ
					ЦеныБазовые.ВалютаДиапазона
				КОНЕЦ
			КОНЕЦ
		ИНАЧЕ
			ЦеныБазовые.Валюта
		КОНЕЦ
	) КАК Валюта,
	МИНИМУМ(
		ВЫБОР КОГДА ЦеныБазовые.ТипЦен.Рассчитывается ТОГДА
			ВЫБОР КОГДА ЦеныБазовые.СпособРасчетаЦены = &СпособНаценка ТОГДА
				ВЫБОР КОГДА ЦеныРасчетные.Цена ЕСТЬ NULL ТОГДА
					0
				ИНАЧЕ
               ВЫБОР КОГДА не ЦеныБазовые.ТипЦен.ЦенаВключаетНДС и ЦеныБазовые.Номенклатура.СтавкаНДС=Значение(Перечисление.СтавкиНДС.НДС18)
				ТОГДА	ЦеныРасчетные.Цена * (1 + ЦеныБазовые.ПроцентСкидкиНаценки / 100)*100/118
               КОГДА не ЦеныБазовые.ТипЦен.ЦенаВключаетНДС и ЦеныБазовые.Номенклатура.СтавкаНДС=Значение(Перечисление.СтавкиНДС.НДС10)
				ТОГДА	ЦеныРасчетные.Цена * (1 + ЦеныБазовые.ПроцентСкидкиНаценки / 100)*100/110
				иначе	ЦеныРасчетные.Цена * (1 + ЦеныБазовые.ПроцентСкидкиНаценки / 100) конец
				КОНЕЦ
			ИНАЧЕ
				ЦеныБазовые.ЦенаДиапазона
			КОНЕЦ
		ИНАЧЕ
			ЦеныБазовые.Цена
		КОНЕЦ
	) КАК Цена

ИЗ
(ВЫБРАТЬ
	СписокНоменклатуры.Номенклатура КАК Номенклатура,
	СписокНоменклатуры.Номенклатура.ЦеноваяГруппа КАК ЦеноваяГруппа,
	СписокНоменклатуры.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
	СпрТипЦен.ТипЦен КАК ТипЦен,
	ЦеныНоменклатуры.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	ЕСТЬNULL(ЦеныНоменклатуры.Цена, 0) КАК Цена,
	ВЫБОР КОГДА ЦеныНоменклатуры.Номенклатура ЕСТЬ NULL ТОГДА
		СпрТипЦен.ПроцентСкидкиНаценки
	ИНАЧЕ
		ЕСТЬNULL(ЦеныНоменклатуры.ПроцентСкидкиНаценки, ЦеныНоменклатуры.ТипЦен.ПроцентСкидкиНаценки)
	КОНЕЦ КАК ПроцентСкидкиНаценки,
	ВЫБОР КОГДА ЦеныНоменклатуры.Номенклатура ЕСТЬ NULL ТОГДА
		СпрТипЦен.СпособРасчетаЦены
	ИНАЧЕ
		ЕСТЬNULL(ЦеныНоменклатуры.СпособРасчетаЦены, ЦеныНоменклатуры.ТипЦен.СпособРасчетаЦены)
	КОНЕЦ КАК СпособРасчетаЦены,
	ЕСТЬNULL(ШкалыДиапазонов.Цена, 0) КАК ЦенаДиапазона,
	ЕСТЬNULL(ШкалыДиапазонов.ВерхняяГраница, 0) КАК ВерхняяГраница,
	ЕСТЬNULL(ЦеныНоменклатуры.Валюта, СпрТипЦен.Валюта) КАК Валюта,
	ШкалыДиапазонов.Валюта КАК ВалютаДиапазона

ИЗ
	(ВЫБРАТЬ
		СпрХарактеристики.Владелец КАК Номенклатура,
		СпрХарактеристики.Ссылка КАК ХарактеристикаНоменклатуры
	ИЗ Справочник.ХарактеристикиНоменклатуры КАК СпрХарактеристики
	{ГДЕ СпрХарактеристики.Владелец.* КАК Номенклатура,
	СпрХарактеристики.Владелец.ЦеноваяГруппа.* КАК ЦеноваяГруппа}
	ОБЪЕДИНИТЬ ВСЕ
	ВЫБРАТЬ
		СпрНоменклатура.Ссылка,
		ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
	ИЗ Справочник.Номенклатура КАК СпрНоменклатура
	{ГДЕ СпрНоменклатура.Ссылка.* КАК Номенклатура,
	СпрНоменклатура.Ссылка.ЦеноваяГруппа.* КАК ЦеноваяГруппа}
	) КАК СписокНоменклатуры
	СОЕДИНЕНИЕ
	(ВЫБРАТЬ
		СправочникЦен.Ссылка КАК ТипЦен,
		СправочникЦен.ВалютаЦены КАК Валюта,
		СправочникЦен.ПроцентСкидкиНаценки КАК ПроцентСкидкиНаценки,
		СправочникЦен.СпособРасчетаЦены КАК СпособРасчетаЦены
	ИЗ
		Справочник.ТипыЦенНоменклатуры КАК СправочникЦен
	{ГДЕ СправочникЦен.Ссылка.* КАК ТипЦен}
	) КАК СпрТипЦен
	ПО НЕ СписокНоменклатуры.Номенклатура.ЭтоГруппа
	 И НЕ СписокНоменклатуры.Номенклатура.Набор
	ЛЕВОЕ СОЕДИНЕНИЕ
	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, {Номенклатура.* КАК Номенклатура,
	   Номенклатура.ЦеноваяГруппа.* КАК ЦеноваяГруппа, ТипЦен.* КАК ТипЦен}) КАК ЦеныНоменклатуры
	ПО ЦеныНоменклатуры.Номенклатура = СписокНоменклатуры.Номенклатура
	И ЦеныНоменклатуры.ТипЦен = СпрТипЦен.ТипЦен
	И ЦеныНоменклатуры.ХарактеристикаНоменклатуры = СписокНоменклатуры.ХарактеристикаНоменклатуры

) КАК ЦеныБазовые
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, {Номенклатура.* КАК Номенклатура,
   Номенклатура.ЦеноваяГруппа.* КАК ЦеноваяГруппа}) КАК ЦеныРасчетные
ПО ЦеныБазовые.Номенклатура = ЦеныРасчетные.Номенклатура
И ЦеныБазовые.ХарактеристикаНоменклатуры = ЦеныРасчетные.ХарактеристикаНоменклатуры
И ЦеныБазовые.ТипЦен.БазовыйТипЦен = ЦеныРасчетные.ТипЦен

ГДЕ
	НЕ ЦеныБазовые.ТипЦен.Рассчитывается
	ИЛИ ЦеныБазовые.СпособРасчетаЦены <> &СпособДиапазон
	ИЛИ (ЦеныБазовые.СпособРасчетаЦены = &СпособДиапазон И ЦеныРасчетные.Цена МЕЖДУ 0.000001 И ЦеныБазовые.ВерхняяГраница-0.000001)

СГРУППИРОВАТЬ ПО
	ЦеныБазовые.ТипЦен,
	ЦеныБазовые.ЦеноваяГруппа,
	ЦеныБазовые.Номенклатура,
	ЦеныБазовые.ХарактеристикаНоменклатуры
) КАК ЗапросПрайс
{ЛЕВОЕ 
СОЕДИНЕНИЕ
(Выбрать * из (ВЫБРАТЬ
	НесвернутыеОстатки1.Номенклатура КАК НоменклатураОст,
	НесвернутыеОстатки1.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатурыОст,
	Сумма(НесвернутыеОстатки1.Остаток) КАК Остаток
 ИЗ
	(ВЫБРАТЬ
		Ост.Номенклатура.Ссылка КАК Номенклатура,
		Ост.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
		Ост.КоличествоОстаток КАК Остаток
	ИЗ
		РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, {Склад.* КАК Склад,
		   Склад.ВидСклада.* КАК ВидСклада, Номенклатура.* КАК Номенклатура,
		   Номенклатура.ЦеноваяГруппа.* КАК ЦеноваяГруппа}) КАК Ост
	ОБЪЕДИНИТЬ ВСЕ
	ВЫБРАТЬ
		НТТ.Номенклатура.Ссылка КАК Номенклатура,
		НТТ.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
		НТТ.КоличествоОстаток КАК Остаток
	ИЗ
		РегистрНакопления.ТоварыВНТТ.Остатки(&Дата, {Склад.* КАК Склад,
		   Склад.ВидСклада.* КАК ВидСклада, Номенклатура.* КАК Номенклатура,
		   Номенклатура.ЦеноваяГруппа.* КАК ЦеноваяГруппа}) КАК НТТ
	ОБЪЕДИНИТЬ ВСЕ
	ВЫБРАТЬ
		Розница.Номенклатура.Ссылка КАК Номенклатура,
		Розница.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
		Розница.КоличествоОстаток КАК Остаток
	ИЗ
		РегистрНакопления.ТоварыВРознице.Остатки(&Дата, {Склад.* КАК Склад,
		   Склад.ВидСклада.* КАК ВидСклада, Номенклатура.* КАК Номенклатура,
		   Номенклатура.ЦеноваяГруппа.* КАК ЦеноваяГруппа}) КАК Розница
	) КАК НесвернутыеОстатки1
 СГРУППИРОВАТЬ ПО
	НесвернутыеОстатки1.Номенклатура,
	НесвернутыеОстатки1.ХарактеристикаНоменклатуры ) как  НесвернутыеОстатки
) КАК Остатки
 ПО
	ЗапросПрайс.Номенклатура = Остатки.НоменклатураОст
	И ЗапросПрайс.ХарактеристикаНоменклатуры = Остатки.ХарактеристикаНоменклатурыОст
}
СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&Дата) КАК КурсыВалютСрезПоследних
ПО ЗапросПрайс.Валюта = КурсыВалютСрезПоследних.Валюта
   И ЗапросПрайс.Цена <> 0
СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&Дата) КАК КурсыВалютСрезПоследнихОтчет
ПО ЗапросПрайс.ВалютаПрайса = КурсыВалютСрезПоследнихОтчет.Валюта

{
ЛЕВОЕ СОЕДИНЕНИЕ
(ВЫБРАТЬ
	МестаХраненияНоменклатуры.Номенклатура КАК НоменклатураХранения,
	МестаХраненияНоменклатуры.МестоХранения КАК МестоХранения
ИЗ
	РегистрСведений.МестаХраненияНоменклатуры КАК МестаХраненияНоменклатуры
СОЕДИНЕНИЕ
(ВЫБРАТЬ
	МестаХраненияНоменклатуры.Номенклатура КАК Номенклатура,
	МИНИМУМ(МестаХраненияНоменклатуры.Приоритет) КАК Приоритет
ИЗ
	РегистрСведений.МестаХраненияНоменклатуры КАК МестаХраненияНоменклатуры
СГРУППИРОВАТЬ ПО
	Номенклатура
) КАК МинПриоритет
ПО МестаХраненияНоменклатуры.Номенклатура = МинПриоритет.Номенклатура
И МестаХраненияНоменклатуры.Приоритет = МинПриоритет.Приоритет
) КАК МестаХранения
ПО ЗапросПрайс.Номенклатура = МестаХранения.НоменклатураХранения
}
{
ЛЕВОЕ СОЕДИНЕНИЕ
(ВЫБРАТЬ
	Штрихкоды.ШтрихКод КАК ШтрихКод,
	Штрихкоды.Владелец КАК Владелец,
	Штрихкоды.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатурыШтрихКода
ИЗ
	РегистрСведений.Штрихкоды КАК Штрихкоды
) КАК ШтрихКоды
ПО ЗапросПрайс.Номенклатура = Штрихкоды.Владелец
И ЗапросПрайс.ХарактеристикаНоменклатуры = Штрихкоды.ХарактеристикаНоменклатурыШтрихКода
}
//СОЕДИНЕНИЯ

{ГДЕ
ИСТИНА КАК СвойстваИКатегории
//СВОЙСТВА
//КАТЕГОРИИ
}
УПОРЯДОЧИТЬ ПО
	ТипЦен,
	ЦеноваяГруппаПорядок,
	Номенклатура,
	ХарактеристикаНоменклатуры
ИТОГИ МАКСИМУМ(Цена), МИНИМУМ(Валюта), МИНИМУМ(ЕдиницаИзмерения), МИНИМУМ(Остаток),
      МИНИМУМ(Стеллаж) , МИНИМУМ(СтеллажПредставление), МИНИМУМ(ШтрихКод),
      МИНИМУМ(НетХарактеристик), МИНИМУМ(ЦеноваяГруппа)
//ИТОГИ
ПО
	ЗапросПрайс.ТипЦен,
	ЗапросПрайс.ЦеноваяГруппа,
	ЗапросПрайс.Номенклатура,
	ЗапросПрайс.ХарактеристикаНоменклатуры
//ОБЩИЕ_СВОЙСТВА
АВТОУПОРЯДОЧИВАНИЕ
...Показать Скрыть
7. Andrey Matveev (matveev.andrey.v) 28.07.14 11:48
(6) dimas103, Добрый день, судя по наличию комментариев в запросе типа "//ОБЩИЕ_СВОЙСТВА" вы не открыли ее конструктором и не нажали "ок" что бы удалить лишние символы как написано на основной странице обработки. Кроме того я не настраивал конвертер что бы он распознавал фигурный скобки {} которые используются в построителе запросов. Если еще кому то понадобится напишите сюда сообщение, пару человек наберется, допилю
8. Amid Dimas (dimas103) 28.07.14 16:42
(7) matveev.andrey.v, Да точно, лишнее не по убирал. Сначала статью прочитал потом через пару дней попробовать решил. Не получилось, сразу отписал. Если не сложно то добавь фигурные скобки. И хорошо бы еще Комменты. Вот в стандартной конфе написан такой запрос. При чем он формируется динамически в зависимости от настроек. Хотел твоей обработкой на лету его видоизменять. А этого нет. Вообще хорошая бы вещь получилась. Потому что часто пишут про оптимизацию запросов но в старых базах проще твоей обработкой изменить запрос чем перпеписывать логику запроса заново.
9. Andrey Matveev (matveev.andrey.v) 28.07.14 15:24
(8) dimas103, Видишь ли если запрос формируется динамически то тебе будет сложно его преобразовать конверетром во временные таблицы, т.к. там после конвертирования его опять придется по кускам разбивать, по моему уже проще самому переделать. Фигурные скобки попробую доделать только честно говоря никогда ими не пользовался, придется попарится.
10. Amid Dimas (dimas103) 28.07.14 17:30
(9) matveev.andrey.v, Так втом то и идея что полностью готовый отчет сфоримрованный системой с условиями. Уже через твою обработку преобразовывать в запрос со временными таблицами и запускать дальше на выполнение.
11. Andrey Matveev (matveev.andrey.v) 28.07.14 18:26
(10) dimas103, АААА тогда понятно но это нереализуемо, собрать текст запроса можно только при компиляции
12. Andrey Matveev (matveev.andrey.v) 29.07.14 08:45
(10) dimas103, Сегодня еще раз подумал над вашим предложением и наконец понял, что вы имеете ввиду, зашить обработку в процедуру, которая при компиляции будет преобразовывать сформированный текст запроса. Идея отличная, спасибо! Вы кстати можете ее сами реализовать, поскольку текст обработки открытый, а такое будет совсем несложно сделать. Если мне когда нибудь понадобится такое, обязательно сделаю и выложу сюда код
13. aspirator 23 (aspirator23) 30.07.14 18:23
(12) matveev.andrey.v, Что-то вот такой запрос не может корректно преобразовать.
Полученный первый подзапрос пытается выбирать из таблицы, которой нет.
Это розница 1.0 отчет Торг29

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

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

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

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

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ТоварыНаСкладахОбороты.Период КАК Период,
	ТоварыНаСкладахОбороты.Регистратор КАК Регистратор,
	ТоварыНаСкладахОбороты.Номенклатура,
	ТоварыНаСкладахОбороты.ХарактеристикаНоменклатуры,
	ТоварыНаСкладахОбороты.КоличествоПриход,
	ТоварыНаСкладахОбороты.КоличествоРасход,
	ТоварыНаСкладахОбороты.Склад.Магазин КАК Магазин
ПОМЕСТИТЬ ТоварыНаСкладахОбороты
ИЗ
	РегистрНакопления.ТоварыНаСкладах.Обороты(&НачПериода, &КонПериода, Регистратор, Склад = &Склад) КАК ТоварыНаСкладахОбороты

ИНДЕКСИРОВАТЬ ПО
	Период
;

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

ИНДЕКСИРОВАТЬ ПО
	Период
;

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

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

ВЫБРАТЬ
	ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0),
	ЗНАЧЕНИЕ(Документ.ОприходованиеТоваров.ПустаяСсылка),
	ЦеныНоменклатурыМагазиновСрезПоследних.Номенклатура,
	ЦеныНоменклатурыМагазиновСрезПоследних.ХарактеристикаНоменклатуры,
	ЦеныНоменклатурыМагазиновСрезПоследних.Магазин,
	ЦеныНоменклатурыМагазиновСрезПоследних.Цена * ЦеныНоменклатурыМагазиновСрезПоследних.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / ЦеныНоменклатурыМагазиновСрезПоследних.ЕдиницаИзмерения.Коэффициент
ИЗ
	РегистрСведений.ЦеныНоменклатурыМагазинов.СрезПоследних(&КонецПредыдущегоПериода, Магазин = &Магазин) КАК ЦеныНоменклатурыМагазиновСрезПоследних
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТоварыНаСкладахОстаткиИОбороты КАК ТоварыНаСкладахОстаткиИОбороты
		ПО ЦеныНоменклатурыМагазиновСрезПоследних.Номенклатура = ТоварыНаСкладахОстаткиИОбороты.Номенклатура
			И ЦеныНоменклатурыМагазиновСрезПоследних.ХарактеристикаНоменклатуры = ТоварыНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры
			И ЦеныНоменклатурыМагазиновСрезПоследних.Магазин = ТоварыНаСкладахОстаткиИОбороты.Магазин

ИНДЕКСИРОВАТЬ ПО
	Период
;

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

ИНДЕКСИРОВАТЬ ПО
	Период
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ТоварыНаСкладахОстаткиИОбороты.Период КАК Период,
	ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
	ТоварыНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры,
	СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток) КАК КоличествоКонечныйОстаток,
	ТоварыНаСкладахОстаткиИОбороты.Регистратор КАК Регистратор
ПОМЕСТИТЬ ТабОстатки
ИЗ
	РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(
			&НачПериода,
			&КонПериода,
			Регистратор,
			,
			Склад = &Склад
				И Номенклатура В (&ОтборНоменклатуры)) КАК ТоварыНаСкладахОстаткиИОбороты

СГРУППИРОВАТЬ ПО
	ТоварыНаСкладахОстаткиИОбороты.Период,
	ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
	ТоварыНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры,
	ТоварыНаСкладахОстаткиИОбороты.Регистратор

ИНДЕКСИРОВАТЬ ПО
	Период
;

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

СГРУППИРОВАТЬ ПО
	ВложенныйЗапрос.Регистратор,
	ВложенныйЗапрос.Период

ИНДЕКСИРОВАТЬ ПО
	Период
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ЦеныНоменклатурыМагазинов.Период КАК Период,
	ЦеныНоменклатурыМагазинов.Регистратор КАК Регистратор,
	ЦеныНоменклатурыМагазинов.Номенклатура,
	ЦеныНоменклатурыМагазинов.ХарактеристикаНоменклатуры,
	ЦеныНоменклатурыМагазинов.Цена,
	ЦеныНоменклатурыМагазинов.Магазин
ПОМЕСТИТЬ ЦеныНоменклатурыМагазиновБезХарактеристик
ИЗ
	ЦеныНоменклатурыМагазинов КАК ЦеныНоменклатурыМагазинов
ГДЕ
	ЦеныНоменклатурыМагазинов.ХарактеристикаНоменклатуры = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)

ИНДЕКСИРОВАТЬ ПО
	Период
;

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

ИНДЕКСИРОВАТЬ ПО
	Период
;

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

УПОРЯДОЧИТЬ ПО
	ДатаДок,
	Регистратор
...Показать Скрыть
14. Andrey Matveev (matveev.andrey.v) 31.07.14 08:59
(13) aspirator23, Добрый день. Да вижу что сконвертировался неправильно. К сожалению у меня нет этой конфигурации что бы протестировать с конструктором, vогли бы вы выслать dt
15. aspirator 23 (aspirator23) 31.07.14 14:11
(14) matveev.andrey.v, С Dt-файлом сложновато. Выслал сам отчет Торг29 и cf-файл в личную и здесь прикрепил отчет.
Возможно причина в том что там сложная вложенность запросов.
Прикрепленные файлы:
ТОРГ29.rar
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа