Кривой запрос. Доработка. Связь по номенклатуре.
Добрый день, товарищи!
Недавно создал запрос по получению одного значения из документа. Архитектор назвал запрос - кривым.
Я забыл учесть один момент - связь с номенклатурой.
На данный момент я в тупике.
Если у вас есть советы или критика - буду рад ее прочесть.
Недавно создал запрос по получению одного значения из документа. Архитектор назвал запрос - кривым.
Я забыл учесть один момент - связь с номенклатурой.
На данный момент я в тупике.
Если у вас есть советы или критика - буду рад ее прочесть.
Функция СТ_ПолучитьНесоответствие(Ссылка)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СТ_РегистрацияНесоответствийТовары.Несоответствие КАК Несоответствие,
| ЗаказНВП.ДокументОснование КАК ДокументОснование
|ИЗ
| Документ.ВнутреннееПотреблениеТоваров КАК ВнутреннееПотреблениеТоваров
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказНаВнутреннееПотребление КАК ЗаказНВП
| ПО ВнутреннееПотреблениеТоваров.ЗаказНаВнутреннееПотребление = ЗаказНВП.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СТ_РегистрацияНесоответствий.Товары КАК СТ_РегистрацияНесоответствийТовары
| ПО (ЗаказНВП.ДокументОснование = СТ_РегистрацияНесоответствийТовары.Ссылка)
|ГДЕ
| ВнутреннееПотреблениеТоваров.Ссылка В(&Ссылка)
|
|СГРУППИРОВАТЬ ПО
| СТ_РегистрацияНесоответствийТовары.Несоответствие,
| ЗаказНВП.ДокументОснование
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
| СТ_РегистрацияНесоответствийТовары.Несоответствие,
| ВнутреннееПотреблениеТоваров.ДокументОснование
|ИЗ
| Документ.ВнутреннееПотреблениеТоваров КАК ВнутреннееПотреблениеТоваров
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СТ_РегистрацияНесоответствий КАК СТ_РегистрацияНесоответствий
| ПО ВнутреннееПотреблениеТоваров.ДокументОснование = СТ_РегистрацияНесоответствий.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СТ_РегистрацияНесоответствий.Товары КАК СТ_РегистрацияНесоответствийТовары
| ПО ВнутреннееПотреблениеТоваров.ДокументОснование = СТ_РегистрацияНесоответствийТовары.Ссылка
|ГДЕ
| ВнутреннееПотреблениеТоваров.Ссылка В(&Ссылка)
|
|СГРУППИРОВАТЬ ПО
| СТ_РегистрацияНесоответствийТовары.Несоответствие,
| ВнутреннееПотреблениеТоваров.ДокументОснование";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Массив = Новый Массив;
//Если ТипЗнч(ВыборкаДетальныеЗаписи.ДокументОснование) = Тип("ДокументСсылка.СТ_РегистрацияНесоответствий")Тогда
Массив.Вставить(0,ВыборкаДетальныеЗаписи.ДокументОснование);
Массив.Вставить(1,ВыборкаДетальныеЗаписи.Несоответствие);
Возврат Массив;
//КонецЕсли;
КонецЦикла;
КонецФункции
ПоказатьОтветы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(3)Задача то какая? Что надо получить? Какая связь с номенклатурой? Какая конфигурация?
Вы прикалываетесь?
В запросе проблема как минимум в том, что 2 раза выбираются данные из таблицы Документ.ВнутреннееПотреблениеТоваров.
Можно один раз выбрать и поместить во временную таблицу.
Я описал проблему.
Вы прикалываетесь?
В запросе проблема как минимум в том, что 2 раза выбираются данные из таблицы Документ.ВнутреннееПотреблениеТоваров.
Можно один раз выбрать и поместить во временную таблицу.
(4) Конфигурация ЕРП 2.4.
Есть документы "Заказ на внутреннее потребление", "Внутреннее потребление" и "Регистрация несоответствий".
Документ ВП может быть создан на основании ЗНВП, а документ ЗНВП может быть создан на основании РН.
Второй случай это когда документ ВП может быть создан только на основании РН.
В документе РН ,есть табличная часть, и в ней есть колонка "Несоответствие".
Есть документы "Заказ на внутреннее потребление", "Внутреннее потребление" и "Регистрация несоответствий".
Документ ВП может быть создан на основании ЗНВП, а документ ЗНВП может быть создан на основании РН.
Второй случай это когда документ ВП может быть создан только на основании РН.
В документе РН ,есть табличная часть, и в ней есть колонка "Несоответствие".
(1) Да, действительно, не совсем понятна задача, чтобы дать советы по "кривизне" запроса.
Что касается
Что касается
Я забыл учесть один момент - связь с номенклатурой
рискну предположить, что нужно проводить соединение по реквизиту "Номенклатура". Типа:
| Документ.ВнутреннееПотреблениеТоваров.Товары КАК ВнутреннееПотреблениеТоваров
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СТ_РегистрацияНесоответствий.Товары КАК СТ_РегистрацияНесоответствийТовары
| ПО ВнутреннееПотреблениеТоваров.Ссылка.ДокументОснование = СТ_РегистрацияНесоответствийТовары.Ссылка
| И ПО ВнутреннееПотреблениеТоваров.Номенклатура= СТ_РегистрацияНесоответствийТовары.Номенклатура
(1)Да и по оптимизации: в данном запросе много соединений и отбор делается после выполнения соединений. Если документов и товаров в них много или увеличивается со временем, то запрос будет работать медленнее. Попробуйте сначала выбрать документы, применив к ним необходимые отборы (временные таблицы, пакетный запрос), и уже после этого делать соединения
сложно без вашей конфы разобраться
посмотрите
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СТ_РегистрацияНесоответствий.Товары КАК СТ_РегистрацияНесоответствийТовары
вы берете таблицу с товарами, но товары не используете. а просто документы. вам либо надо с самим документом СТ_РегистрацияНесоответствий соединяться, либо еще из заказа и номенклатуру брать и по ней соединяться
посмотрите
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СТ_РегистрацияНесоответствий.Товары КАК СТ_РегистрацияНесоответствийТовары
вы берете таблицу с товарами, но товары не используете. а просто документы. вам либо надо с самим документом СТ_РегистрацияНесоответствий соединяться, либо еще из заказа и номенклатуру брать и по ней соединяться
(11)
Функция СТ_ПолучитьНесоответствие(Ссылка)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СТ_РегистрацияНесоответствийТовары.Несоответствие КАК Несоответствие,
| ЗаказНВП.ДокументОснование КАК ДокументОснование
|ИЗ
| Документ.ВнутреннееПотреблениеТоваров КАК ВнутреннееПотреблениеТоваров
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказНаВнутреннееПотребление КАК ЗаказНВП
| ПО ВнутреннееПотреблениеТоваров.ЗаказНаВнутреннееПотребление = ЗаказНВП.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СТ_РегистрацияНесоответствий.Товары КАК СТ_РегистрацияНесоответствийТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ВнутреннееПотреблениеТоваров.Товары КАК ВнутреннееПотреблениеТоваровТовары
| ПО (ВнутреннееПотреблениеТоваровТовары.Номенклатура = СТ_РегистрацияНесоответствийТовары.Номенклатура)
| ПО (ЗаказНВП.ДокументОснование = СТ_РегистрацияНесоответствийТовары.Ссылка)
|ГДЕ
| ВнутреннееПотреблениеТоваров.Ссылка В(&Ссылка)
|
|СГРУППИРОВАТЬ ПО
| СТ_РегистрацияНесоответствийТовары.Несоответствие,
| ЗаказНВП.ДокументОснование
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
| СТ_РегистрацияНесоответствийТовары.Несоответствие,
| ВнутреннееПотреблениеТоваров.ДокументОснование
|ИЗ
| Документ.ВнутреннееПотреблениеТоваров КАК ВнутреннееПотреблениеТоваров
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СТ_РегистрацияНесоответствий КАК СТ_РегистрацияНесоответствий
| ПО ВнутреннееПотреблениеТоваров.ДокументОснование = СТ_РегистрацияНесоответствий.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СТ_РегистрацияНесоответствий.Товары КАК СТ_РегистрацияНесоответствийТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ВнутреннееПотреблениеТоваров.Товары КАК ВнутреннееПотреблениеТоваровТовары
| ПО (ВнутреннееПотреблениеТоваровТовары.Номенклатура = СТ_РегистрацияНесоответствийТовары.Номенклатура)
| ПО (ВнутреннееПотреблениеТоваров.ДокументОснование = СТ_РегистрацияНесоответствийТовары.Ссылка)
|ГДЕ
| ВнутреннееПотреблениеТоваров.Ссылка В(&Ссылка)
|
|СГРУППИРОВАТЬ ПО
| СТ_РегистрацияНесоответствийТовары.Несоответствие,
| ВнутреннееПотреблениеТоваров.ДокументОснование";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Массив = Новый Массив;
//Если ТипЗнч(ВыборкаДетальныеЗаписи.ДокументОснование) = Тип("ДокументСсылка.СТ_РегистрацияНесоответствий")Тогда
Массив.Вставить(0,ВыборкаДетальныеЗаписи.ДокументОснование);
Массив.Вставить(1,ВыборкаДетальныеЗаписи.Несоответствие);
Возврат Массив;
//КонецЕсли;
КонецЦикла;
КонецФункции
Показать
и в первом и во втором подзапросах левая таблица одна и та же и условие одно и тоже.
соединения это уже другая кухня.
вопрос: зачем делать запрос к левой таблице два раза с одним и тем же условием, не логичнее сделать запрос к этой таблице одни раз с помещение ссылки в Вт?
соединения это уже другая кухня.
вопрос: зачем делать запрос к левой таблице два раза с одним и тем же условием, не логичнее сделать запрос к этой таблице одни раз с помещение ссылки в Вт?
(13)
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст = "ВЫБРАТЬ
| ВнутреннееПотреблениеТоваров.ЗаказНаВнутреннееПотребление.ДокументОснование КАК ДокументОснованиеВП,
| ВнутреннееПотреблениеТоваров.ДокументОснование КАК ДокументОснованиеЗНВП,
| СТ_РегистрацияНесоответствийТовары.Номенклатура КАК Номенклатура,
| СТ_РегистрацияНесоответствийТовары.Несоответствие КАК Несоответствие
|ПОМЕСТИТЬ ТаблицаТовары
|ИЗ
| Документ.ВнутреннееПотреблениеТоваров.Товары КАК ВнутреннееПотреблениеТоваровТовары
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВнутреннееПотреблениеТоваров КАК ВнутреннееПотреблениеТоваров
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказНаВнутреннееПотребление КАК ЗНВП
| ПО ВнутреннееПотреблениеТоваров.ЗаказНаВнутреннееПотребление = ЗНВП.Ссылка
| ПО ВнутреннееПотреблениеТоваровТовары.Ссылка = ВнутреннееПотреблениеТоваров.Ссылка,
| Документ.СТ_РегистрацияНесоответствий.Товары КАК СТ_РегистрацияНесоответствийТовары
|ГДЕ
| ВнутреннееПотреблениеТоваров.Ссылка = &Ссылка
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ТаблицаТовары.Несоответствие КАК Несоответствие
|ИЗ
| Документ.ВнутреннееПотреблениеТоваров.Товары КАК ВнутреннееПотреблениеТоваровТовары
| ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаТовары КАК ТаблицаТовары
| ПО ВнутреннееПотреблениеТоваровТовары.Номенклатура = ТаблицаТовары.Номенклатура";
Показать
ВЫБРАТЬ
| ЗаказНаВнутреннееПотребление.Ссылка КАК Ссылка,
| ЗаказНаВнутреннееПотребление.ДокументОснование КАК ДокументОснование
|ПОМЕСТИТЬ ТаблицаЗНВП
|ИЗ
| Документ.ЗаказНаВнутреннееПотребление КАК ЗаказНаВнутреннееПотребление
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| СТ_РегистрацияНесоответствийТовары.Ссылка КАК Ссылка,
| СТ_РегистрацияНесоответствийТовары.Номенклатура КАК Номенклатура,
| СТ_РегистрацияНесоответствийТовары.Несоответствие КАК Несоответствие
|ПОМЕСТИТЬ ТаблицаРН
|ИЗ
| Документ.СТ_РегистрацияНесоответствий.Товары КАК СТ_РегистрацияНесоответствийТовары
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ТаблицаРН.Несоответствие КАК Несоответствие,
| ВнутреннееПотреблениеТоваров.Товары.(
| Номенклатура КАК Номенклатура
| ) КАК Товары
|ИЗ
| ТаблицаВП КАК ТаблицаВП
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаЗНВП КАК ТаблицаЗНВП
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаРН КАК ТаблицаРН
| ПО ТаблицаЗНВП.ДокументОснование = ТаблицаРН.Ссылка
| ПО ТаблицаВП.ДокументОснование = ТаблицаЗНВП.Ссылка
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВнутреннееПотреблениеТоваров КАК ВнутреннееПотреблениеТоваров
| ПО ТаблицаВП.Ссылка = ВнутреннееПотреблениеТоваров.Ссылка
Показать
Пока что это все что смог сделать...правда результат возвращает пустой...
ВЫБРАТЬ
ЗаказНаВнутреннееПотребление.Ссылка КАК Ссылка,
ЗаказНаВнутреннееПотребление.ДокументОснование КАК ДокументОснование
ПОМЕСТИТЬ ТаблицаЗНВП
ИЗ
Документ.ЗаказНаВнутреннееПотребление КАК ЗаказНаВнутреннееПотребление
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
СТ_РегистрацияНесоответствийТовары.Ссылка КАК Ссылка,
СТ_РегистрацияНесоответствийТовары.Номенклатура КАК Номенклатура,
СТ_РегистрацияНесоответствийТовары.Несоответствие КАК Несоответствие
ПОМЕСТИТЬ ТаблицаРН
ИЗ
ТаблицаЗНВП КАК ТаблицаЗНВП
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СТ_РегистрацияНесоответствий.Товары КАК СТ_РегистрацияНесоответствийТовары
ПО ТаблицаЗНВП.ДокументОснование = СТ_РегистрацияНесоответствийТовары.Ссылка
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВнутреннееПотреблениеТоваровТовары.Номенклатура КАК Номенклатура,
ВнутреннееПотреблениеТоваров.Ссылка КАК Ссылка,
ВнутреннееПотреблениеТоваров.ДокументОснование КАК ДокументОснование
ПОМЕСТИТЬ ТаблицаВП
ИЗ
Документ.ВнутреннееПотреблениеТоваров.Товары КАК ВнутреннееПотреблениеТоваровТовары
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВнутреннееПотреблениеТоваров КАК ВнутреннееПотреблениеТоваров
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаЗНВП КАК ТаблицаЗНВП
ПО ВнутреннееПотреблениеТоваров.ДокументОснование = ТаблицаЗНВП.Ссылка
ПО ВнутреннееПотреблениеТоваровТовары.Ссылка = ВнутреннееПотреблениеТоваров.Ссылка
ГДЕ
ВнутреннееПотреблениеТоваров.Ссылка = &Ссылка
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ТаблицаВП.Номенклатура КАК Номенклатура,
ТаблицаРН.Несоответствие КАК Несоответствие
ИЗ
ТаблицаВП КАК ТаблицаВП
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаРН КАК ТаблицаРН
ПО ТаблицаВП.ДокументОснование = ТаблицаРН.Ссылка
И ТаблицаВП.Номенклатура = ТаблицаРН.Номенклатура,
ТаблицаЗНВП КАК ТаблицаЗНВП
Показать
Не хочу глубоко погружаться, мельком заглянул, чисто советы:
1) если запрос возвращается пустым, то возможно он не сразу стал пустым. Можно "по кускам" последовательно оттрассировать и в какой то момент обнаружить, что куда-то что-то почему-то делось, и понять что к этому привело ), кстати есть удобные запросники (здесь на портале), которыми можно сразу просматривать содержимое временных таблиц, рекомендую.
2)
К чему такие жертвы ? )
3) Чем больше информации на входе, тем меньше напрягаться аудитории вникать, и больше вероятность привлечь больше участников к решению задачи, и как следствие решить задачу )
4) Выкиньте из головы попытки подогнать запрос под что то, не понимая до конца к чему это приводит, просто напишите "простой" запрос первоначально и подумайте, как наложить на него требуемые условия с минимальным количеством обращением к базе )
5) Там выше дали хороший совет, от того что Вам расскажут, в следующий раз повторится скорее всего тоже самое, старайтесь сами решить задачу. Я уверен, что получится, не хотел ничем обидеть и удачи )
1) если запрос возвращается пустым, то возможно он не сразу стал пустым. Можно "по кускам" последовательно оттрассировать и в какой то момент обнаружить, что куда-то что-то почему-то делось, и понять что к этому привело ), кстати есть удобные запросники (здесь на портале), которыми можно сразу просматривать содержимое временных таблиц, рекомендую.
2)
ВЫБРАТЬ
ЗаказНаВнутреннееПотребление.Ссылка КАК Ссылка,
ЗаказНаВнутреннееПотребление.ДокументОснование КАК ДокументОснование
ПОМЕСТИТЬ ТаблицаЗНВП
ИЗ
Документ.ЗаказНаВнутреннееПотребление КАК ЗаказНаВнутреннееПотребление
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
СТ_РегистрацияНесоответствийТовары.Ссылка КАК Ссылка,
СТ_РегистрацияНесоответствийТовары.Номенклатура КАК Номенклатура,
СТ_РегистрацияНесоответствийТовары.Несоответствие КАК Несоответствие
ПОМЕСТИТЬ ТаблицаРН
ИЗ
ТаблицаЗНВП КАК ТаблицаЗНВП
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СТ_РегистрацияНесоответствий.Товары КАК СТ_РегистрацияНесоответствийТовары
ПО ТаблицаЗНВП.ДокументОснование = СТ_РегистрацияНесоответствийТовары.Ссылка
;
ПоказатьК чему такие жертвы ? )
3) Чем больше информации на входе, тем меньше напрягаться аудитории вникать, и больше вероятность привлечь больше участников к решению задачи, и как следствие решить задачу )
4) Выкиньте из головы попытки подогнать запрос под что то, не понимая до конца к чему это приводит, просто напишите "простой" запрос первоначально и подумайте, как наложить на него требуемые условия с минимальным количеством обращением к базе )
5) Там выше дали хороший совет, от того что Вам расскажут, в следующий раз повторится скорее всего тоже самое, старайтесь сами решить задачу. Я уверен, что получится, не хотел ничем обидеть и удачи )
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот