Кривой запрос. Доработка. Связь по номенклатуре.

1. Stanislav1993 26.11.19 15:41 Сейчас в теме
Добрый день, товарищи!
Недавно создал запрос по получению одного значения из документа. Архитектор назвал запрос - кривым.

Я забыл учесть один момент - связь с номенклатурой.
На данный момент я в тупике.
Если у вас есть советы или критика - буду рад ее прочесть.



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

Показать
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Sashares 34 26.11.19 15:48 Сейчас в теме
(1)
Архитектор назвал запрос - кривым.

Я забыл учесть один момент - связь с номенклатурой.


С составлением вопросов у вас, видимо, тоже проблемы.
3. Stanislav1993 26.11.19 15:52 Сейчас в теме
(2) Добрый вечер. Благодарю за сарказм. Я описал проблему.
4. Sashares 34 26.11.19 15:59 Сейчас в теме
(3)Задача то какая? Что надо получить? Какая связь с номенклатурой? Какая конфигурация?
Я описал проблему.

Вы прикалываетесь?

В запросе проблема как минимум в том, что 2 раза выбираются данные из таблицы Документ.ВнутреннееПотреблениеТоваров.
Можно один раз выбрать и поместить во временную таблицу.
Дмитрий74Чел; +1 Ответить
8. Stanislav1993 26.11.19 16:10 Сейчас в теме
(4) Конфигурация ЕРП 2.4.

Есть документы "Заказ на внутреннее потребление", "Внутреннее потребление" и "Регистрация несоответствий".
Документ ВП может быть создан на основании ЗНВП, а документ ЗНВП может быть создан на основании РН.

Второй случай это когда документ ВП может быть создан только на основании РН.

В документе РН ,есть табличная часть, и в ней есть колонка "Несоответствие".
6. DmitriyTih 26.11.19 16:06 Сейчас в теме
(1) Да, действительно, не совсем понятна задача, чтобы дать советы по "кривизне" запроса.
Что касается
Я забыл учесть один момент - связь с номенклатурой
рискну предположить, что нужно проводить соединение по реквизиту "Номенклатура". Типа:
 
|    Документ.ВнутреннееПотреблениеТоваров.Товары КАК ВнутреннееПотреблениеТоваров
|        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СТ_РегистрацияНесоответствий.Товары КАК СТ_РегистрацияНесоответствийТовары
    |        ПО ВнутреннееПотреблениеТоваров.Ссылка.ДокументОснование = СТ_РегистрацияНесоответствийТовары.Ссылка
    |        И ПО ВнутреннееПотреблениеТоваров.Номенклатура= СТ_РегистрацияНесоответствийТовары.Номенклатура
Stanislav1993; +1 Ответить
9. DmitriyTih 26.11.19 16:11 Сейчас в теме
(1)Да и по оптимизации: в данном запросе много соединений и отбор делается после выполнения соединений. Если документов и товаров в них много или увеличивается со временем, то запрос будет работать медленнее. Попробуйте сначала выбрать документы, применив к ним необходимые отборы (временные таблицы, пакетный запрос), и уже после этого делать соединения
5. Lenten 25 26.11.19 16:03 Сейчас в теме
сложно без вашей конфы разобраться

посмотрите

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СТ_РегистрацияНесоответствий.Товары КАК СТ_РегистрацияНесоответствийТовары

вы берете таблицу с товарами, но товары не используете. а просто документы. вам либо надо с самим документом СТ_РегистрацияНесоответствий соединяться, либо еще из заказа и номенклатуру брать и по ней соединяться
Stanislav1993; +1 Ответить
10. Stanislav1993 26.11.19 16:14 Сейчас в теме
(5)
(6) Связь делать в первом запросе или во втором?
11. Lenten 25 26.11.19 16:15 Сейчас в теме
12. Stanislav1993 26.11.19 16:35 Сейчас в теме
(11)
Функция СТ_ПолучитьНесоответствие(Ссылка)
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	СТ_РегистрацияНесоответствийТовары.Несоответствие КАК Несоответствие,
	|	ЗаказНВП.ДокументОснование КАК ДокументОснование
	|ИЗ
	|	Документ.ВнутреннееПотреблениеТоваров КАК ВнутреннееПотреблениеТоваров
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказНаВнутреннееПотребление КАК ЗаказНВП
	|		ПО ВнутреннееПотреблениеТоваров.ЗаказНаВнутреннееПотребление = ЗаказНВП.Ссылка
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СТ_РегистрацияНесоответствий.Товары КАК СТ_РегистрацияНесоответствийТовары
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ВнутреннееПотреблениеТоваров.Товары КАК ВнутреннееПотреблениеТоваровТовары
	|		ПО (ВнутреннееПотреблениеТоваровТовары.Номенклатура = СТ_РегистрацияНесоответствийТовары.Номенклатура)
	|		ПО (ЗаказНВП.ДокументОснование = СТ_РегистрацияНесоответствийТовары.Ссылка)
	|ГДЕ
	|	ВнутреннееПотреблениеТоваров.Ссылка В(&Ссылка)
	|
	|СГРУППИРОВАТЬ ПО
	|	СТ_РегистрацияНесоответствийТовары.Несоответствие,
	|	ЗаказНВП.ДокументОснование
	|
	|ОБЪЕДИНИТЬ
	|
	|ВЫБРАТЬ
	|	СТ_РегистрацияНесоответствийТовары.Несоответствие,
	|	ВнутреннееПотреблениеТоваров.ДокументОснование
	|ИЗ
	|	Документ.ВнутреннееПотреблениеТоваров КАК ВнутреннееПотреблениеТоваров
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СТ_РегистрацияНесоответствий КАК СТ_РегистрацияНесоответствий
	|		ПО ВнутреннееПотреблениеТоваров.ДокументОснование = СТ_РегистрацияНесоответствий.Ссылка
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СТ_РегистрацияНесоответствий.Товары КАК СТ_РегистрацияНесоответствийТовары
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ВнутреннееПотреблениеТоваров.Товары КАК ВнутреннееПотреблениеТоваровТовары
	|		ПО (ВнутреннееПотреблениеТоваровТовары.Номенклатура = СТ_РегистрацияНесоответствийТовары.Номенклатура)
	|		ПО (ВнутреннееПотреблениеТоваров.ДокументОснование = СТ_РегистрацияНесоответствийТовары.Ссылка)
	|ГДЕ
	|	ВнутреннееПотреблениеТоваров.Ссылка В(&Ссылка)
	|
	|СГРУППИРОВАТЬ ПО
	|	СТ_РегистрацияНесоответствийТовары.Несоответствие,
	|	ВнутреннееПотреблениеТоваров.ДокументОснование";
	
	
	Запрос.УстановитьПараметр("Ссылка", Ссылка);
	РезультатЗапроса = Запрос.Выполнить();
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл			
		Массив = Новый Массив;
		//Если ТипЗнч(ВыборкаДетальныеЗаписи.ДокументОснование) = Тип("ДокументСсылка.СТ_РегистрацияНесоответствий")Тогда
			 Массив.Вставить(0,ВыборкаДетальныеЗаписи.ДокументОснование);
			 Массив.Вставить(1,ВыборкаДетальныеЗаписи.Несоответствие);
			 Возврат Массив;
		//КонецЕсли;
	КонецЦикла;
КонецФункции

Показать
7. starjevschik 26.11.19 16:07 Сейчас в теме
Надо просто почитать что-нибудь хорошее про запросы SQL
такие проблемы разумно решать именно этим способом, это надежное и долговременное решение.
Stanislav1993; +1 Ответить
13. VmvLer 26.11.19 16:37 Сейчас в теме
и в первом и во втором подзапросах левая таблица одна и та же и условие одно и тоже.
соединения это уже другая кухня.

вопрос: зачем делать запрос к левой таблице два раза с одним и тем же условием, не логичнее сделать запрос к этой таблице одни раз с помещение ссылки в Вт?
Sashares; +1 Ответить
14. Stanislav1993 26.11.19 17:54 Сейчас в теме
(13)
 Запрос = Новый Запрос;
 Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
 Запрос.Текст = "ВЫБРАТЬ
                |	ВнутреннееПотреблениеТоваров.ЗаказНаВнутреннееПотребление.ДокументОснование КАК ДокументОснованиеВП,
                |	ВнутреннееПотреблениеТоваров.ДокументОснование КАК ДокументОснованиеЗНВП,
                |	СТ_РегистрацияНесоответствийТовары.Номенклатура КАК Номенклатура,
                |	СТ_РегистрацияНесоответствийТовары.Несоответствие КАК Несоответствие
                |ПОМЕСТИТЬ ТаблицаТовары
                |ИЗ
                |	Документ.ВнутреннееПотреблениеТоваров.Товары КАК ВнутреннееПотреблениеТоваровТовары
                |		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВнутреннееПотреблениеТоваров КАК ВнутреннееПотреблениеТоваров
                |			ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказНаВнутреннееПотребление КАК ЗНВП
                |			ПО ВнутреннееПотреблениеТоваров.ЗаказНаВнутреннееПотребление = ЗНВП.Ссылка
                |		ПО ВнутреннееПотреблениеТоваровТовары.Ссылка = ВнутреннееПотреблениеТоваров.Ссылка,
                |	Документ.СТ_РегистрацияНесоответствий.Товары КАК СТ_РегистрацияНесоответствийТовары
                |ГДЕ
                |	ВнутреннееПотреблениеТоваров.Ссылка = &Ссылка
                |;
                |
                |////////////////////////////////////////////////////////////­////////////////////
                |ВЫБРАТЬ
                |	ТаблицаТовары.Несоответствие КАК Несоответствие
                |ИЗ
                |	Документ.ВнутреннееПотреблениеТоваров.Товары КАК ВнутреннееПотреблениеТоваровТовары
                |		ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаТовары КАК ТаблицаТовары
                |		ПО ВнутреннееПотреблениеТоваровТовары.Номенклатура = ТаблицаТовары.Номенклатура";
Показать
18. Stanislav1993 26.11.19 18:48 Сейчас в теме
(13) Я сделал так...но результат запроса пустой
19. VmvLer 27.11.19 09:24 Сейчас в теме
(18)
(15), (16) - полная чушь, вы не поняли главную и очень простую вещь.
если честно, то мне лень тратить на вас время если вы понимаете базисные вещи.

если вы стоически примете эту критику и найдете решение самостоятельно, то из вас выйдет
спец экстра-класса, в противном случае ...боже, храни 1С.
Stanislav1993; +1 Ответить
20. Stanislav1993 27.11.19 09:47 Сейчас в теме
15. Stanislav1993 26.11.19 18:26 Сейчас в теме
ВЫБРАТЬ
                |	ЗаказНаВнутреннееПотребление.Ссылка КАК Ссылка,
                |	ЗаказНаВнутреннееПотребление.ДокументОснование КАК ДокументОснование
                |ПОМЕСТИТЬ ТаблицаЗНВП
                |ИЗ
                |	Документ.ЗаказНаВнутреннееПотребление КАК ЗаказНаВнутреннееПотребление
                |;
                |
                |////////////////////////////////////////////////////////////­////////////////////
                |ВЫБРАТЬ
                |	СТ_РегистрацияНесоответствийТовары.Ссылка КАК Ссылка,
                |	СТ_РегистрацияНесоответствийТовары.Номенклатура КАК Номенклатура,
                |	СТ_РегистрацияНесоответствийТовары.Несоответствие КАК Несоответствие
                |ПОМЕСТИТЬ ТаблицаРН
                |ИЗ
                |	Документ.СТ_РегистрацияНесоответствий.Товары КАК СТ_РегистрацияНесоответствийТовары
                |;
                |
                |////////////////////////////////////////////////////////////­////////////////////
                |ВЫБРАТЬ
                |	ТаблицаРН.Несоответствие КАК Несоответствие,
                |	ВнутреннееПотреблениеТоваров.Товары.(
                |		Номенклатура КАК Номенклатура
                |	) КАК Товары
                |ИЗ
                |	ТаблицаВП КАК ТаблицаВП
                |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаЗНВП КАК ТаблицаЗНВП
                |			ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаРН КАК ТаблицаРН
                |			ПО ТаблицаЗНВП.ДокументОснование = ТаблицаРН.Ссылка
                |		ПО ТаблицаВП.ДокументОснование = ТаблицаЗНВП.Ссылка
                |		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВнутреннееПотреблениеТоваров КАК ВнутреннееПотреблениеТоваров
                |		ПО ТаблицаВП.Ссылка = ВнутреннееПотреблениеТоваров.Ссылка
Показать
16. Stanislav1993 26.11.19 18:47 Сейчас в теме
Пока что это все что смог сделать...правда результат возвращает пустой...
ВЫБРАТЬ
	ЗаказНаВнутреннееПотребление.Ссылка КАК Ссылка,
	ЗаказНаВнутреннееПотребление.ДокументОснование КАК ДокументОснование
ПОМЕСТИТЬ ТаблицаЗНВП
ИЗ
	Документ.ЗаказНаВнутреннееПотребление КАК ЗаказНаВнутреннееПотребление
;

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВнутреннееПотреблениеТоваровТовары.Номенклатура КАК Номенклатура,
	ВнутреннееПотреблениеТоваров.Ссылка КАК Ссылка,
	ВнутреннееПотреблениеТоваров.ДокументОснование КАК ДокументОснование
ПОМЕСТИТЬ ТаблицаВП
ИЗ
	Документ.ВнутреннееПотреблениеТоваров.Товары КАК ВнутреннееПотреблениеТоваровТовары
		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВнутреннееПотреблениеТоваров КАК ВнутреннееПотреблениеТоваров
			ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаЗНВП КАК ТаблицаЗНВП
			ПО ВнутреннееПотреблениеТоваров.ДокументОснование = ТаблицаЗНВП.Ссылка
		ПО ВнутреннееПотреблениеТоваровТовары.Ссылка = ВнутреннееПотреблениеТоваров.Ссылка
ГДЕ
	ВнутреннееПотреблениеТоваров.Ссылка = &Ссылка
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ТаблицаВП.Номенклатура КАК Номенклатура,
	ТаблицаРН.Несоответствие КАК Несоответствие
ИЗ
	ТаблицаВП КАК ТаблицаВП
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаРН КАК ТаблицаРН
		ПО ТаблицаВП.ДокументОснование = ТаблицаРН.Ссылка
			И ТаблицаВП.Номенклатура = ТаблицаРН.Номенклатура,
	ТаблицаЗНВП КАК ТаблицаЗНВП
Показать
17. Stanislav1993 26.11.19 18:48 Сейчас в теме
21. xxxAndricxxx 64 28.11.19 09:43 Сейчас в теме
Не хочу глубоко погружаться, мельком заглянул, чисто советы:

1) если запрос возвращается пустым, то возможно он не сразу стал пустым. Можно "по кускам" последовательно оттрассировать и в какой то момент обнаружить, что куда-то что-то почему-то делось, и понять что к этому привело ), кстати есть удобные запросники (здесь на портале), которыми можно сразу просматривать содержимое временных таблиц, рекомендую.

2)
ВЫБРАТЬ
    ЗаказНаВнутреннееПотребление.Ссылка КАК Ссылка,
    ЗаказНаВнутреннееПотребление.ДокументОснование КАК ДокументОснование
ПОМЕСТИТЬ ТаблицаЗНВП
ИЗ
    Документ.ЗаказНаВнутреннееПотребление КАК ЗаказНаВнутреннееПотребление
;

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

К чему такие жертвы ? )

3) Чем больше информации на входе, тем меньше напрягаться аудитории вникать, и больше вероятность привлечь больше участников к решению задачи, и как следствие решить задачу )

4) Выкиньте из головы попытки подогнать запрос под что то, не понимая до конца к чему это приводит, просто напишите "простой" запрос первоначально и подумайте, как наложить на него требуемые условия с минимальным количеством обращением к базе )

5) Там выше дали хороший совет, от того что Вам расскажут, в следующий раз повторится скорее всего тоже самое, старайтесь сами решить задачу. Я уверен, что получится, не хотел ничем обидеть и удачи )
Оставьте свое сообщение

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