СКД удаляет из запроса поле, явно запрашиваемое в настройках отчета (выражение в запросе)

1. user713084 12.08.17 17:34 Сейчас в теме
Здравствуйте уважаемые коллеги.

Имеется набор данных с запросом. В нем есть временная таблица с переменным (зависящим от настроек пользователя) количеством полей. Далее следует запрос с выборкой из этой таблицы и присоединением этой же таблицы по некоторому критерию. После соединения одно из полей рассчитывается некоторым выражением, которое великий и ужасный оптимизатор просто съедает и делает вид, что мальчика не было. Речь идет о поле "ГлючноеПоле". Самое интересное, что причиной глюка является выражение. Если бы не было выражения, то поле нормально бы прошло во внешний запрос, как это происходит с полем "НеглючноеПоле". Выражение не теряется только в том случае, если использовать абсолютно все поля из ВТ (НенужноеПоле1 И НенужноеПоле2), то есть создать одно рабочее поле и "протащить" в итоговый запрос не получится, а вытаскивать все поля не вариант, поскольку в этом случае в реальной задаче запрос получается очень тяжелым, и пользователю редко когда нужно задействовать все поля.

ВЫБРАТЬ
	ГлючноеПоле, НеглючноеПоле, НенужноеПоле1, НенужноеПоле2
ПОМЕСТИТЬ ВТ
ИЗ
	(ВЫБРАТЬ
		"г" КАК ГлючноеПоле,
		"нг" КАК НеглючноеПоле,
		"нн1" КАК НенужноеПоле1,
		"нн2" КАК НенужноеПоле2
		{ВЫБРАТЬ ГлючноеПоле, НеглючноеПоле, НенужноеПоле1, НенужноеПоле2}
	) КАК ВложенныйЗапрос;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ГлючноеПоле, НеглючноеПоле, НенужноеПоле1, НенужноеПоле2
	{ВЫБРАТЬ ГлючноеПоле, НеглючноеПоле, НенужноеПоле1, НенужноеПоле2}
	ИЗ
		(ВЫБРАТЬ
			ГлючноеПоле + "выражение" КАК ГлючноеПоле,
			НеглючноеПоле, НенужноеПоле1, НенужноеПоле2
			ИЗ
				(ВЫБРАТЬ
					ВыборкаИзВТ.ГлючноеПоле, ВыборкаИзВТ.НеглючноеПоле,
					ПрисоединеннаяВТ.НенужноеПоле1, ПрисоединеннаяВТ.НенужноеПоле2
					ИЗ
						(ВЫБРАТЬ
							ВТ.ГлючноеПоле, ВТ.НеглючноеПоле
							ИЗ
								ВТ КАК ВТ
						) КАК ВыборкаИзВТ
						ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ПрисоединеннаяВТ
							ПО ВыборкаИзВТ.ГлючноеПоле = ПрисоединеннаяВТ.ГлючноеПоле
				) КАК СоединениеС_ВТ
		) КАК ЗдесьПолеИсчезает
Показать


Может быть кто-то сталкивался с подобным глюком (который спокойно кочует из версии в версию без изменений) и нашел свой способ обходного маневра?
Задача стоит: как сделать так, чтобы ГлючноеПоле не глючило без необходимости выбирать абсолютно все поля из ВТ (либо отключать переменные поля в ВТ, что тоже исправляет глюк, но не решает задачу).

В файле - работающий пример, который можно покрутить. На форме есть кнопка для получения текста запроса до и после "оптимизации".

Спасибо.
Прикрепленные файлы:
ГлюкСКД.erf
Найденные решения
8. user713084 14.08.17 02:52 Сейчас в теме
(7) Спасибо, но немного не то.
В вашем варианте в скомпонованном запросе во временную таблицу вылезет весь возможный набор полей - со всеми {необязательными таблицами} и т.д. и т.п., а это то, чего не хотелось бы.
Проблему удалось решить путем встраивания дополнительной временной таблицы непосредственно перед выражением.
Как-то так:
ВЫБРАТЬ
	ГлючноеПоле, НеглючноеПоле, НенужноеПоле1, НенужноеПоле2
	ПОМЕСТИТЬ ВТ
	ИЗ
		(ВЫБРАТЬ
			"г" КАК ГлючноеПоле,
			"нг" КАК НеглючноеПоле,
			"нн1" КАК НенужноеПоле1,
			"нн2" КАК НенужноеПоле2
			{ВЫБРАТЬ ГлючноеПоле, НеглючноеПоле, НенужноеПоле1, НенужноеПоле2}
		) КАК ВложенныйЗапрос;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВыборкаИзВТ.ГлючноеПоле, ВыборкаИзВТ.НеглючноеПоле, НенужноеПоле1, НенужноеПоле2
	ПОМЕСТИТЬ СоединениеС_ВТ
	ИЗ
		(ВЫБРАТЬ
			ГлючноеПоле, НеглючноеПоле
			ИЗ ВТ
		) КАК ВыборкаИзВТ
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ПрисоединеннаяВТ
			ПО ВыборкаИзВТ.ГлючноеПоле = ПрисоединеннаяВТ.ГлючноеПоле;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ГлючноеПоле, НеглючноеПоле, НенужноеПоле1, НенужноеПоле2
	{ВЫБРАТЬ ГлючноеПоле, НеглючноеПоле, НенужноеПоле1, НенужноеПоле2}
	ИЗ
		(ВЫБРАТЬ
			ГлючноеПоле + "выражение" КАК ГлючноеПоле,
			НеглючноеПоле, НенужноеПоле1, НенужноеПоле2
			ИЗ СоединениеС_ВТ
		) КАК ЗдесьПолеИсчезает
Показать

Что после компоновки с настройками, в которых включены только поля ГлючноеПоле и НеглючноеПоле примет такой вид:
ВЫБРАТЬ
	ВложенныйЗапрос.ГлючноеПоле КАК ГлючноеПоле,
	ВложенныйЗапрос.НеглючноеПоле КАК НеглючноеПоле
ПОМЕСТИТЬ ВТ
ИЗ
	(ВЫБРАТЬ
		"г" КАК ГлючноеПоле,
		"нг" КАК НеглючноеПоле) КАК ВложенныйЗапрос
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВыборкаИзВТ.ГлючноеПоле КАК ГлючноеПоле,
	ВыборкаИзВТ.НеглючноеПоле КАК НеглючноеПоле
ПОМЕСТИТЬ СоединениеС_ВТ
ИЗ
	(ВЫБРАТЬ
		ВТ.ГлючноеПоле КАК ГлючноеПоле,
		ВТ.НеглючноеПоле КАК НеглючноеПоле
	ИЗ
		ВТ КАК ВТ) КАК ВыборкаИзВТ
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ПрисоединеннаяВТ
		ПО ВыборкаИзВТ.ГлючноеПоле = ПрисоединеннаяВТ.ГлючноеПоле
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ЗдесьПолеИсчезает.ГлючноеПоле КАК ГлючноеПоле,
	ЗдесьПолеИсчезает.НеглючноеПоле КАК НеглючноеПоле
ИЗ
	(ВЫБРАТЬ
		СоединениеС_ВТ.ГлючноеПоле + "выражение" КАК ГлючноеПоле,
		СоединениеС_ВТ.НеглючноеПоле КАК НеглючноеПоле
	ИЗ
		СоединениеС_ВТ КАК СоединениеС_ВТ) КАК ЗдесьПолеИсчезает
Показать

Не так красиво, как хотелось, но работать будет. Это все же лучше, чем делать ВТ со всеми возможными полями, чтобы потом большую их часть выкинуть, если они, допустим, не нужны в отчете. В реальной задаче это сильно утяжеляет запрос.

Видимо, компоновщик только во вложенных запросах путается, но я так и не понял из-за чего конкретно.
Вопрос пока открытый, вдруг у кого-то найдется вариант получше. Или объяснение, из-за чего именно компоновщик съедает выражения.
11. Skill 14.08.17 14:29 Сейчас в теме
А если вот так
ВЫБРАТЬ
	"г" КАК ГлючноеПоле,
	"нг" КАК НеглючноеПоле,
	"нн1" КАК НенужноеПоле1,
	"нн2" КАК НенужноеПоле2
ПОМЕСТИТЬ ВТ
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВыборкаИзВТ.ГлючноеПоле + "выражение" КАК ГлючноеПоле,
	ВыборкаИзВТ.НеглючноеПоле КАК НеглючноеПоле,
	ПрисоединеннаяВТ.НенужноеПоле1 КАК НенужноеПоле1,
	ПрисоединеннаяВТ.НенужноеПоле2 КАК НенужноеПоле2
ИЗ
	(ВЫБРАТЬ
		ВТ.ГлючноеПоле КАК ГлючноеПоле,
		ВТ.НеглючноеПоле КАК НеглючноеПоле
	ИЗ
		ВТ КАК ВТ) КАК ВыборкаИзВТ
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ПрисоединеннаяВТ
		ПО ВыборкаИзВТ.ГлючноеПоле = ПрисоединеннаяВТ.ГлючноеПоле
Показать
12. user713084 14.08.17 16:43 Сейчас в теме
(11) Хм. Использовать автозаполнение - идея свежая. Честно говоря, я его перестал использовать сразу, как только узнал, где оно отключается. Однако, рассчитывать на автозаполнение как-то стремно. Оно из последнего запроса вообще убирает НеглючноеПоле, но при этом отчет формируется без ошибок. Спасибо, изучу этот вопрос подробнее.
20. user713084 18.08.17 00:38 Сейчас в теме
По теме еще можно добавить, что СКД теряет выражения не только в разделе выбрать, но и в условиях присоединения таблиц, и, скорее всего, во всех остальных частях запроса. Единственным выходом по прежнему остается использование промежуточных временных таблиц.
Похоже, вопрос можно считать закрытым до лучших времен.
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. tata_1211 63 12.08.17 18:07 Сейчас в теме
(1) В свое время сталкивалась с оптимизатором запроса на СКД, и для себя пришла к выводу, что поле, которое не нужно "съедать", нужно вытаскивать в итоговый запрос. Если его нет в итоговом - увы, оптимизатор его игнорирует.
3. user713084 12.08.17 18:20 Сейчас в теме
(2) Если в чистом виде вытащить, то оно вытащится. А вот если в выражении использовать (внутри запроса), то исчезнет вместе с выражением.
4. tata_1211 63 12.08.17 18:30 Сейчас в теме
(3) А, может, дать глючному полю (там где оно плюсуется с выражением) другой псевдоним, дабы система не путалась?
max_zhilin; +1 Ответить
5. user713084 12.08.17 18:52 Сейчас в теме
(4) Менять псевдонимы полей, таблиц и полей СКД (те, которые в {...} ) уже пробовал. Может не все возможные варианты перебрал, но те, что делал, ничего по сути не меняли.
6. tata_1211 63 12.08.17 19:06 Сейчас в теме
(5) Навскидку пока других мыслей не приходит.
7. Armando 1399 13.08.17 23:56 Сейчас в теме
(1)

ВЫБРАТЬ
	ГлючноеПоле, НеглючноеПоле, НенужноеПоле1, НенужноеПоле2
ПОМЕСТИТЬ ВТ
ИЗ
	(ВЫБРАТЬ
		"г" КАК ГлючноеПоле,
		"нг" КАК НеглючноеПоле,
		"нн1" КАК НенужноеПоле1,
		"нн2" КАК НенужноеПоле2
		{ВЫБРАТЬ ГлючноеПоле, НеглючноеПоле, НенужноеПоле1, НенужноеПоле2}
	) КАК ВложенныйЗапрос;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ГлючноеПоле, НеглючноеПоле, НенужноеПоле1, НенужноеПоле2
	{ВЫБРАТЬ ГлючноеПоле, НеглючноеПоле, НенужноеПоле1, НенужноеПоле2}
	ИЗ
		(ВЫБРАТЬ
			ГлючноеПоле + "выражение" КАК ГлючноеПоле,
			НеглючноеПоле, НенужноеПоле1, НенужноеПоле2
			ИЗ
				(ВЫБРАТЬ
					ВыборкаИзВТ.ГлючноеПоле, ВыборкаИзВТ.НеглючноеПоле,
					ПрисоединеннаяВТ.НенужноеПоле1, ПрисоединеннаяВТ.НенужноеПоле2
					ИЗ
						(ВЫБРАТЬ
							ВТ.ГлючноеПоле, ВТ.НеглючноеПоле
							ИЗ
								ВТ КАК ВТ
						) КАК ВыборкаИзВТ
						ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ПрисоединеннаяВТ
							ПО ВыборкаИзВТ.ГлючноеПоле = ПрисоединеннаяВТ.ГлючноеПоле
				) КАК СоединениеС_ВТ
		) КАК ЗдесьПолеИсчезает
Показать
8. user713084 14.08.17 02:52 Сейчас в теме
(7) Спасибо, но немного не то.
В вашем варианте в скомпонованном запросе во временную таблицу вылезет весь возможный набор полей - со всеми {необязательными таблицами} и т.д. и т.п., а это то, чего не хотелось бы.
Проблему удалось решить путем встраивания дополнительной временной таблицы непосредственно перед выражением.
Как-то так:
ВЫБРАТЬ
	ГлючноеПоле, НеглючноеПоле, НенужноеПоле1, НенужноеПоле2
	ПОМЕСТИТЬ ВТ
	ИЗ
		(ВЫБРАТЬ
			"г" КАК ГлючноеПоле,
			"нг" КАК НеглючноеПоле,
			"нн1" КАК НенужноеПоле1,
			"нн2" КАК НенужноеПоле2
			{ВЫБРАТЬ ГлючноеПоле, НеглючноеПоле, НенужноеПоле1, НенужноеПоле2}
		) КАК ВложенныйЗапрос;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВыборкаИзВТ.ГлючноеПоле, ВыборкаИзВТ.НеглючноеПоле, НенужноеПоле1, НенужноеПоле2
	ПОМЕСТИТЬ СоединениеС_ВТ
	ИЗ
		(ВЫБРАТЬ
			ГлючноеПоле, НеглючноеПоле
			ИЗ ВТ
		) КАК ВыборкаИзВТ
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ПрисоединеннаяВТ
			ПО ВыборкаИзВТ.ГлючноеПоле = ПрисоединеннаяВТ.ГлючноеПоле;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ГлючноеПоле, НеглючноеПоле, НенужноеПоле1, НенужноеПоле2
	{ВЫБРАТЬ ГлючноеПоле, НеглючноеПоле, НенужноеПоле1, НенужноеПоле2}
	ИЗ
		(ВЫБРАТЬ
			ГлючноеПоле + "выражение" КАК ГлючноеПоле,
			НеглючноеПоле, НенужноеПоле1, НенужноеПоле2
			ИЗ СоединениеС_ВТ
		) КАК ЗдесьПолеИсчезает
Показать

Что после компоновки с настройками, в которых включены только поля ГлючноеПоле и НеглючноеПоле примет такой вид:
ВЫБРАТЬ
	ВложенныйЗапрос.ГлючноеПоле КАК ГлючноеПоле,
	ВложенныйЗапрос.НеглючноеПоле КАК НеглючноеПоле
ПОМЕСТИТЬ ВТ
ИЗ
	(ВЫБРАТЬ
		"г" КАК ГлючноеПоле,
		"нг" КАК НеглючноеПоле) КАК ВложенныйЗапрос
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВыборкаИзВТ.ГлючноеПоле КАК ГлючноеПоле,
	ВыборкаИзВТ.НеглючноеПоле КАК НеглючноеПоле
ПОМЕСТИТЬ СоединениеС_ВТ
ИЗ
	(ВЫБРАТЬ
		ВТ.ГлючноеПоле КАК ГлючноеПоле,
		ВТ.НеглючноеПоле КАК НеглючноеПоле
	ИЗ
		ВТ КАК ВТ) КАК ВыборкаИзВТ
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ПрисоединеннаяВТ
		ПО ВыборкаИзВТ.ГлючноеПоле = ПрисоединеннаяВТ.ГлючноеПоле
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ЗдесьПолеИсчезает.ГлючноеПоле КАК ГлючноеПоле,
	ЗдесьПолеИсчезает.НеглючноеПоле КАК НеглючноеПоле
ИЗ
	(ВЫБРАТЬ
		СоединениеС_ВТ.ГлючноеПоле + "выражение" КАК ГлючноеПоле,
		СоединениеС_ВТ.НеглючноеПоле КАК НеглючноеПоле
	ИЗ
		СоединениеС_ВТ КАК СоединениеС_ВТ) КАК ЗдесьПолеИсчезает
Показать

Не так красиво, как хотелось, но работать будет. Это все же лучше, чем делать ВТ со всеми возможными полями, чтобы потом большую их часть выкинуть, если они, допустим, не нужны в отчете. В реальной задаче это сильно утяжеляет запрос.

Видимо, компоновщик только во вложенных запросах путается, но я так и не понял из-за чего конкретно.
Вопрос пока открытый, вдруг у кого-то найдется вариант получше. Или объяснение, из-за чего именно компоновщик съедает выражения.
9. Armando 1399 14.08.17 09:21 Сейчас в теме
(8) пробовали писать на партенрский форум или в поддержку 1С на адрес v8@1c.ru ?
10. user713084 14.08.17 14:07 Сейчас в теме
(9) Даже не знал про такой форум. 1С не так давно начал осваивать. Подписки на ИТС нет, конечно.
Наверное, стоит написать.
11. Skill 14.08.17 14:29 Сейчас в теме
А если вот так
ВЫБРАТЬ
	"г" КАК ГлючноеПоле,
	"нг" КАК НеглючноеПоле,
	"нн1" КАК НенужноеПоле1,
	"нн2" КАК НенужноеПоле2
ПОМЕСТИТЬ ВТ
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВыборкаИзВТ.ГлючноеПоле + "выражение" КАК ГлючноеПоле,
	ВыборкаИзВТ.НеглючноеПоле КАК НеглючноеПоле,
	ПрисоединеннаяВТ.НенужноеПоле1 КАК НенужноеПоле1,
	ПрисоединеннаяВТ.НенужноеПоле2 КАК НенужноеПоле2
ИЗ
	(ВЫБРАТЬ
		ВТ.ГлючноеПоле КАК ГлючноеПоле,
		ВТ.НеглючноеПоле КАК НеглючноеПоле
	ИЗ
		ВТ КАК ВТ) КАК ВыборкаИзВТ
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ПрисоединеннаяВТ
		ПО ВыборкаИзВТ.ГлючноеПоле = ПрисоединеннаяВТ.ГлючноеПоле
Показать
12. user713084 14.08.17 16:43 Сейчас в теме
(11) Хм. Использовать автозаполнение - идея свежая. Честно говоря, я его перестал использовать сразу, как только узнал, где оно отключается. Однако, рассчитывать на автозаполнение как-то стремно. Оно из последнего запроса вообще убирает НеглючноеПоле, но при этом отчет формируется без ошибок. Спасибо, изучу этот вопрос подробнее.
13. Skill 14.08.17 16:58 Сейчас в теме
(12)
Да тут даже не автозаполнение, просто у вас вложенных запросов очень много, и они там не нужны.
14. user713084 14.08.17 17:12 Сейчас в теме
(13) В данном упрощенном примере не нужны. Но в реальной задаче, на основании которой составлен этот пример, каждый запрос нужен.
15. kgn2011 5 16.08.17 11:27 Сейчас в теме
(14)У меня вот тоже пример,где СКД съедает строки ,по которым нет цены в регистре.Закупки.Связываю табл.часть.док-та Левым соединением с регистром.
Может,подскажите ,как это обойти?
Конфигурация Ут 10.2 (доработанная)

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

СГРУППИРОВАТЬ ПО
	ГотоваяПродукцияПродукция.Номенклатура,
	ГотоваяПродукцияПродукция.ХарактеристикаПродукции,
	ГотоваяПродукцияПродукция.ЕдиницаИзмерения,
	ГотоваяПродукцияМатериалы.Номенклатура,
	ГотоваяПродукцияМатериалы.ХарактеристикаНоменклатуры,
	ГотоваяПродукцияМатериалы.ЕдиницаИзмерения,
	ГотоваяПродукцияМатериалы.Номенклатура.БазоваяЕдиницаИзмерения,
	ГотоваяПродукцияПродукция.Ссылка

ИМЕЮЩИЕ
	МАКСИМУМ(ЗакупкиОбороты.Период) <= &ДатаКонца
Показать
17. user713084 16.08.17 21:42 Сейчас в теме
(15) Полагаю, строки исчезают в соответствии с условиями
ГДЕ ЗакупкиОбороты.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
...
ИМЕЮЩИЕ МАКСИМУМ(ЗакупкиОбороты.Период) <= &ДатаКонца

Когда в ЗакупкиОбороты не найдется строки, удовлетворяющей условиям связи с ГотоваяПродукцияМатериалы, поля ЗакупкиОбороты.Регистратор и ЗакупкиОбороты.Период примут значение NULL, при любом сравнении с которым получится ЛОЖЬ. Что и приведет к исключению таких строк из результата запроса.
Ничего аномального тут не происходит.

Попробуйте все необходимые условия задавать в выражении ПО. В этом случае ничто не сможет съесть строки из основной таблицы. Либо в выражениях ГДЕ и ИМЕЮЩИЕ учитывайте, что в присоединенной таблице может вместо обычных полей оказаться строка, полностью состоящая из значений NULL.
18. kgn2011 5 17.08.17 11:53 Сейчас в теме
(17) Я понимаю,что если в ЗакупкиОбороты не найдется строки ...получится то,что и получилось (выкидывает строку). В том-то и дело,что не могу нигде это указать....
ЕСТЬNULL(ЗакупкиОбороты.Номенклатура,NULL).
Куда это запихнуть..???
19. user713084 17.08.17 15:54 Сейчас в теме
(18) А с чего вы взяли, что вам нужно именно это куда-то вставить?

И зачем вообще вызывать функцию ЕСТЬNULL со вторым параметром NULL? Чтобы один NULL заменить на другой NULL?

Составлять запросы как и решать уравнения в математике невозможно путем подстановки наугад. Попробуйте в голове прокрутить последовательность действий, которую будет выполнять сервер базы данных, когда будет обрабатывать ваш запрос.

И прочтите в документации раздел Встроенный язык > Работа с запросами > Синтаксис текста запросов > Использование выражений в языке запросов > Логические выражения > ЕСТЬ NULL - оператор проверки значения на NULL. Там же есть и пример использования. Возможно вы путаете функцию с одноименным оператором. Они похожи по написанию, но работают по-разному.

И еще не забывайте про условие соединения с таблицей в выражении ПО. В нем можно использовать логическое выражение любой сложности и сравнивать не только поля двух таблиц, но и, например, сравнить поле присоединяемой таблицы с &параметром отчета. Нужно только поставить птичку "Произвольное" в соответствующей строке на закладке "Связи" конструктора запросов.
16. kgn2011 5 16.08.17 11:28 Сейчас в теме
20. user713084 18.08.17 00:38 Сейчас в теме
По теме еще можно добавить, что СКД теряет выражения не только в разделе выбрать, но и в условиях присоединения таблиц, и, скорее всего, во всех остальных частях запроса. Единственным выходом по прежнему остается использование промежуточных временных таблиц.
Похоже, вопрос можно считать закрытым до лучших времен.
21. kgn2011 5 18.08.17 09:36 Сейчас в теме
(20)Все получилось с временными таблицами! Спасибо!
22. nvv1970 02.09.17 00:20 Сейчас в теме
(20) Вы очень правильно отказались от автозаполнения полей, но в запросе нахомутали с фигурными рогами... В итоге сами себе устроили ловушку и запутали оптимизатор.
СКД не умеет получать выборки из НЕПОСЛЕДНЕГО пакета или из временных таблиц. Указанение выбранных полей не заблокировано пользователям для любых таблиц, но работает только для последней.
А вот указание в компоновщике отборов - это наше все. Указывай где вздумается, помогай СКД. (Кстати, явное указание отборов в "рогах" срабатывает даже при автозаполнении - это для меня является до сих пор странностью со стороны разработчиков платформы. Ну ладно, им видней...)

Я даже впал в недоумение от вашего примера. Указал конкатенацию как ГлючноеПоле1, а ГлючноеПоле вытянул как есть. Другие варинты пробовал... И хоть ты тресни искомое поле пропадало!

Ах, да! Ну конечно! Удалил фигурные скобки из первого пакета... И о чудо... Мы не дурим СКД, СКД не дурит нас )) Все работает идеально.

ВЫБРАТЬ
	ГлючноеПоле, НеглючноеПоле, НенужноеПоле1, НенужноеПоле2
ПОМЕСТИТЬ ВТ
ИЗ
	(ВЫБРАТЬ
		"г" КАК ГлючноеПоле,
		"нг" КАК НеглючноеПоле,
		"нн1" КАК НенужноеПоле1,
		"нн2" КАК НенужноеПоле2
		//{ВЫБРАТЬ ГлючноеПоле, НеглючноеПоле, НенужноеПоле1, НенужноеПоле2}
	) КАК ВложенныйЗапрос;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ГлючноеПоле, НеглючноеПоле, НенужноеПоле1, НенужноеПоле2
	{ВЫБРАТЬ ГлючноеПоле, НеглючноеПоле, НенужноеПоле1, НенужноеПоле2}
	ИЗ
		(ВЫБРАТЬ
			ГлючноеПоле + "выражение" КАК ГлючноеПоле,
			НеглючноеПоле, НенужноеПоле1, НенужноеПоле2
			ИЗ
				(ВЫБРАТЬ
					ВыборкаИзВТ.ГлючноеПоле, ВыборкаИзВТ.НеглючноеПоле,
					ПрисоединеннаяВТ.НенужноеПоле1, ПрисоединеннаяВТ.НенужноеПоле2
					ИЗ
						(ВЫБРАТЬ
							ВТ.ГлючноеПоле, ВТ.НеглючноеПоле
							ИЗ
								ВТ КАК ВТ
						) КАК ВыборкаИзВТ
						ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ПрисоединеннаяВТ
							ПО ВыборкаИзВТ.ГлючноеПоле = ПрисоединеннаяВТ.ГлючноеПоле
				) КАК СоединениеС_ВТ
		) КАК ЗдесьПолеИсчезает
Показать

Любите, цените и учите СКД. Это величайшее изобретение 1с ))))

UP: хочу еще обратить внимание как именно СКД пытается оптимизировать запрос. Понимание этого позволяет порой добиваться значительных оптимизаций, когда вроде сам запрос набора данных уже оптимизировать некуда...
1. СКД пытается оптимизировать конечный запрос (и далее по цепочке), т.е. в первую очередь те данные которые являются выборкой. Они и будут отображаться. Ведь ничего кроме последнего пакета СКД вывести не может.
2. Вложенные запросы я не замечал чтобы СКД оптимизировал (кстати ваш пример это опроверг, но
это влечет ошибку). Они всегда остаются нетронутыми в отличии от временных таблиц.Косвенно мою правоту подтверждает то, что при удалении всех фигурных скобок и установке автополей оптимизированный запрос будет точно таким же как описал в посте (после моих изменений).
3. Если использовать временные таблицы, то СКД удаляет ненужные поля начиная от последнего пакета к первому. Все что не будет использовать - удаляется на основании (НЕ)выбранных в варианте полей из Результата/Выборки (последний пакет) и из всех временных таблиц!!
Указали выбранные поля черт знает где - всех запутали, сбили с толку (
23. user713084 03.09.17 13:40 Сейчас в теме
(22) Я думал, что достаточно четко описал ситуацию.
Если убрать "рога" из первого запроса пакета, то мы не только "не дурим" СКД, но еще и выбираем во временную таблицу весь возможный набор полей. Давайте представим, что в первом пакете у меня у меня идет выборка из ОстатковИОборотов какого-нибудь складского регистра со всеми его измерениями, и не просто выборка, а с группировкой по периоду "Авто" со всей колодой от ПериодГод до ПериодСекунда и Регистратор. Каков будет период и набор измерений - выбирает пользователь. Мне лишь нужно потом полученный выбор в запросе присоединить и объединить с другими таблицами и так далее, и тому подобное. Но если пользователю нужно получить данные с детализацией в один год по какому-то одному измерению, а мы, чтобы "не дурить СКД" во временную таблицу будем набивать по максимуму - все измерения с детализацией до секунды, то что из этого получится? Из этого получится необъятная таблица и формирование отчета займет намного больше времени. В сотни раз большее.

И к тому же, промежуточные рога, насколько я понял, именно для того и предназначены, чтобы на промежуточном этапе отсеять ненужные поля. Может быть их разработчики СКД реализовали глючно, но задумка была такая, иначе бы они не работали нигде, кроме последнего запроса. Я вам даже больше скажу, в этих промежутчных рогах можно разные поля обзывать одним именем или одно и то же поле разными именами - в этом случае СКД отрабатывает четко: если пользователь запросил данное поле, компоновщик в обязательном порядке подтянет все поля, которые были названы таким же псевдонимом в промежуточных рогах.

Изучать СКД - дело хорошее, вот только книжные авторы часто под этим подразумевают стандартный набор типовых решений дальше которого ни-ни, а если что-то идет не так - нужно еще раз прочитать догмы 1С в стиле "не возжелай конечный остаток без начального, не укради период по секунде, почитай измерение с реквизитами его" и т.п.
24. nvv1970 04.09.17 15:45 Сейчас в теме
(23) А я тоже думал, что достаточно четко сказал, что СКД из первого пакета ПРИ ВОЗМОЖНОСТИ сама удалит поля и без фигурных скобок ))) И даже привел для этого пример.
Давайте представим

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

ПС: Когда я узнал для чего в СКД "источники данных", то сильно удивился. Оказалось, что это рудимент. Допускаю, что по той же причине могут выбираться "выбранные поля" во временных таблицах.
25. user713084 04.09.17 19:59 Сейчас в теме
(24) Ладно, пусть будет как вам угодно. Для меня не важно, что считает СКД. Важно только то, какой получается итоговый запрос в макете компоновки, как долго он будет выполняться, сколько памяти отъест у сервера и сколько данных будет гонять по сети. В предложенном вами варианте компоновщик из запроса в ВТ ничего не убирает, оставляет его как есть, либо приведите конкретный рабочий пример. Это единственное, что имеет значение.
26. nvv1970 05.09.17 21:26 Сейчас в теме
(25)
В предложенном вами варианте компоновщик из запроса в ВТ ничего не убирает

Я оказывается забыл выложить пример, где СКД замечательно удаляет поля из пакетов, где {выбранные поля} не указываются, сорри. )
В вашем примере "Глючнное поле" не может быть вырезано в принципе, т.к. по нему выполняется соединение. Т.е. после соединения можно удалить, до - нельзя. Уберите соединение или сделайте его необязательным (в соответсвии с требуемой логикой) и поле станет "удаляемовозможным" и не используйте вложенные запросы. Это не мне угодно, это так СКД работает.
Для меня не важно, что считает СКД.

А вы пытаетесь себя поставить в основу и чтобы СКД подстраивалась под вас ))
27. user713084 06.09.17 17:14 Сейчас в теме
(26)
В вашем примере "Глючнное поле" не может быть вырезано в принципе, т.к. по нему выполняется соединение.
Кто вам сказал, что поля, по которым происходит соединение, не могут быть вырезаны?
Еще как могут. Прекрасно вырезаются, при этом даже тип соединения меняется, если в выражении ПО после их удаления не остается других условий.

Можем произвести взаимовыгодный обмен: я вам выложу рабочий пример, в котором поле, по которому происходит соединение в запросе, вырезается компоновщиком как из выбора, так и из соединения, если оно не запрашивается в настройках пользователя.
А вы мне покажете пример, где поле удаляется из запроса в ВТ без использования рогов в этом запросе, либо в вышестоящем по пакету до него (в последнем можно и даже нужно, поскольку о режиме автозаполнения речи не идет).
28. R_A_A 23.01.19 15:40 Сейчас в теме
(27)
Кто вам сказал, что поля, по которым происходит соединение, не могут быть вырезаны?
Еще как могут. Прекрасно вырезаются, при этом даже тип соединения меняется, если в выражении ПО после их удаления не остается других условий.

Не может быть! Я уже что только не делал с текстом запроса, чтобы СКД удаляла все неиспользованные в выборке поля из временных таблиц, но поля используемые в соединениях таблиц СКД не удаляет! В результате не удаляются и лишние запросы в пакете.
Вот простейший пример. Если выбираем к выборке только поле "А", то из второго запроса "выпиливается" только поле "Б", поле "Х" остается. Если же убрать из условия соединения таблиц ВТ1 и ВТ2 поле "Х", то СКД удаляет весь второй запрос, как ненужный. Можно ли добиться такого же поведения при сохранении условия соединения? Я уже и не надеюсь..
ВЫБРАТЬ
	"А" КАК А
ПОМЕСТИТЬ ВТ1
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	"Б" КАК Б,
	"Х" КАК Х
ПОМЕСТИТЬ ВТ2
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ1.А КАК А,
	ВТ2.Б КАК Б,
	ВТ2.Х КАК Х
{ВЫБРАТЬ
	А,
	Б,
	Х}
ИЗ
	ВТ1 КАК ВТ1
		{ЛЕВОЕ СОЕДИНЕНИЕ ВТ2 КАК ВТ2
		ПО ВТ1.А = ВТ2.Х}
Показать
29. R_A_A 23.01.19 20:02 Сейчас в теме
(28) Проверил тестовый пример на 8.3 - все отлично отрабатывает, лишние подзапросы удаляются! На рабочей версии платформы 8.2.18.109 - нифига, второй запрос с полем "Х" остается...
30. user713084 24.01.19 00:36 Сейчас в теме
Нужно во вложенном подзапросе выбирать поля компоновщика, чтобы они исчезали в ВТ и дальше по тексту.
Именно во вложенном.
На внешнем уровне, где происходит помещение во временную таблицу, не сработает.
Вообще, поля компоновщика желательно выбирать сразу в том месте, где они впервые появляются из базы.
Тогда они не появятся нигде во всем запросе, если не выбраны в настройках.
Это, конечно, имеет смысл только с отключенным автозаполнением.

ВЫБРАТЬ ВТ1.А ПОМЕСТИТЬ ВТ1
ИЗ (ВЫБРАТЬ "А" КАК А {ВЫБРАТЬ А}) КАК ВТ1;

ВЫБРАТЬ ВТ2.Б, ВТ2.Х ПОМЕСТИТЬ ВТ2
ИЗ (ВЫБРАТЬ "Б" КАК Б, "Х" КАК Х {ВЫБРАТЬ Б, Х}) КАК ВТ2;

ВЫБРАТЬ ВТ1.А, ВТ2.Б, ВТ2.Х {ВЫБРАТЬ А, Б, Х}
ИЗ ВТ1 {ЛЕВОЕ СОЕДИНЕНИЕ ВТ2 КАК ВТ2 ПО ВТ1.А = ВТ2.Х}
Показать


В итоге для настройки с группировкой А, Б из макета компоновки получим:

ВЫБРАТЬ
	ВТ1.А КАК А
ПОМЕСТИТЬ ВТ1
ИЗ
	(ВЫБРАТЬ
		"А" КАК А) КАК ВТ1
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ2.Б КАК Б
ПОМЕСТИТЬ ВТ2
ИЗ
	(ВЫБРАТЬ
		"Б" КАК Б) КАК ВТ2
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ1.А КАК А,
	ВТ2.Б КАК Б
ИЗ
	ВТ1 КАК ВТ1,
	ВТ2 КАК ВТ2
Показать


То есть, условие связи ушло.

P.S. Не замечал никакой разницы в СКД разных версий платформы. Никакого развития там нет.
Такое впечатление, что они как уволили того гения, который ее написал, так до сих пор не могут найти человека, который сможет туда влезть, не сломать себе мозг, и довести до ума начатое.
Прикрепленные файлы:
ИсчезающиеУсловияСоединения.erf
31. R_A_A 24.01.19 15:58 Сейчас в теме
(30) Спасибо за подсказку об использовании вложенных подзапросов с "рогами". Но это тоже не нормальное поведение выходит - условие связи нарушается. Чтобы получить более менее правильную реакцию нужно в подзапросе для ВТ2 написать для поля "Х" другой синоним - {ВЫБРАТЬ Б, Х КАК Б}. Тогда при выборе поля Б, поле "Х" тоже остается и связь таблиц не нарушается.

Не замечал никакой разницы в СКД разных версий платформы.

Ну как же! Вот на моем примере - 8.3. работает корректно, а 8.2 нет. Да и на вашем варианте есть разница - если выбрать только поле "Б" на 8.2 СКД выдает ошибку (вырезается запрос с ВТ1), а в 8.3. все в порядке.
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)