Добрый день, есть документ "Реализация товара", и есть регистр в котором есть Товар и Степень брака. Нужно сделать так что бы при проведений документа происходила проверка на остатки. Сделал запрос, который отбирает "товары", как мне сюда сделать ещё отбор по 1 измерению (Степени брака), что бы учитывалось какая степень брака? Можно ли вообще так сделать?
Запрос.Текст = "ВЫБРАТЬ
| ОстаткиТовараОстатки.Товар КАК Товар,
| ОстаткиТовараОстатки.КоличествоОстаток КАК Нехватка,
| Док.НомерСтроки КАК НомерСтроки,
| ОстаткиТовараОстатки.СтепениБрака КАК СтепениБрака
|ИЗ
| РегистрНакопления.ОстаткиТовара.Остатки(
| &Момент,
| Товар В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| РеализацияТоваровТорговля.Товар КАК Товар
| ИЗ
| Документ.РеализацияТоваров.Торговля КАК РеализацияТоваровТорговля
| ГДЕ
| РеализацияТоваровТорговля.Ссылка = &Ссылка)) КАК ОстаткиТовараОстатки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| РеализацияТоваровТорговля.Товар КАК Товар,
| МАКСИМУМ(РеализацияТоваровТорговля.НомерСтроки) КАК НомерСтроки
| ИЗ
| Документ.РеализацияТоваров.Торговля КАК РеализацияТоваровТорговля
| ГДЕ
| РеализацияТоваровТорговля.Ссылка = &Ссылка
|
| СГРУППИРОВАТЬ ПО
| РеализацияТоваровТорговля.Товар) КАК Док
| ПО ОстаткиТовараОстатки.Товар = Док.Товар
|ГДЕ
| ОстаткиТовараОстатки.КоличествоОстаток < 0";
Запрос.УстановитьПараметр("Ссылка",Ссылка);
Граница = Новый Граница(МоментВремени(), ВидГраницы.Включая);
Запрос.УстановитьПараметр("Момент", Граница);
Добавить еще одну таблицу в запрос (товар с отбором по браку) и присоединить её к основному набору д
Правильно я вас понял?
Запрос.Текст = "ВЫБРАТЬ
| ОстаткиТовараОстатки.Товар КАК Товар,
| ОстаткиТовараОстатки.КоличествоОстаток КАК Нехватка,
| Док.НомерСтроки КАК НомерСтроки,
| ОстаткиТовараОстатки.СтепениБрака КАК СтепениБрака
|ИЗ
| РегистрНакопления.ОстаткиТовара.Остатки(
| &Момент,
| Товар В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| РеализацияТоваровТорговля.Товар КАК Товар
| ИЗ
| Документ.РеализацияТоваров.Торговля КАК РеализацияТоваровТорговля
| ГДЕ
| РеализацияТоваровТорговля.Ссылка = &Ссылка)) КАК ОстаткиТовараОстатки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| РеализацияТоваровТорговля.Товар КАК Товар,
| МАКСИМУМ(РеализацияТоваровТорговля.НомерСтроки) КАК НомерСтроки
| ИЗ
| Документ.РеализацияТоваров.Торговля КАК РеализацияТоваровТорговля
| ГДЕ
| РеализацияТоваровТорговля.Ссылка = &Ссылка
|
| СГРУППИРОВАТЬ ПО
| РеализацияТоваровТорговля.Товар) КАК Док
| ПО ОстаткиТовараОстатки.Товар = Док.Товар,
| (ВЫБРАТЬ
| РеализацияТоваровТорговля.СтепеньБрака КАК СтепеньБрака
| ИЗ
| Документ.РеализацияТоваров.Торговля КАК РеализацияТоваровТорговля
| ГДЕ
| РеализацияТоваровТорговля.СтепеньБрака = &СтепеньБрака) КАК ВложенныйЗапрос
|ГДЕ
| ОстаткиТовараОстатки.КоличествоОстаток < 0";
Показать
Я не совсем понимаю, какой параметр нужно передать в "Степень Брака", если он может у нас быть разные. Для товара я просто передаю Ссылку на данный документ.
РегистрНакопления.ОстаткиТовара.Остатки( &Дата, Срез1 = &Параметр1 И Срез2 = &Параметр2)
Вы конструктором запрос собираете?
А то прям голова с его оформления разболелась.
КоличествоОстаток - тоже лучше не в "ГДЕ", а непосредственно при получении остатков отсеивать.
Попробуйте как то так:
ВЫБРАТЬ
Остатки.Товар,
Остатки.КоличествоОстаток Нехватка,
Док.НомерСтроки НомерСтроки,
Остатки.СтепениБрака СтепениБрака
ИЗ
РегистрНакопления.ОстаткиТовара.Остатки(
&Момент,
Товар В
(ВЫБРАТЬ РАЗЛИЧНЫЕ Товар
ИЗ Документ.РеализацияТоваров.Торговля
ГДЕ Ссылка = &Ссылка) КАК Остатки
И СтепениБрака = &СтепеньБрака
И КоличествоОстаток < 0)
ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
Товар,
МАКСИМУМ(НомерСтроки) НомерСтроки
ИЗ Документ.РеализацияТоваров.Торговля
ГДЕ Ссылка = &Ссылка
СГРУППИРОВАТЬ ПО Товар) КАК Док
ПО Остатки.Товар = Док.Товар
(1) (4)
Также обратите внимание, вы 2 (а со степенями брака, мб и 3) раза отбираете табличную часть документа.
Возможно более изящным способом будет следующий способ (только проверьте, писал на коленке):
ВЫБРАТЬ Максимум(НомерСтроки) НомерСтроки, Товар
ПОМЕСТИТЬ ВТ
ИЗ Документ.РеализацияТоваров.Торговля
ГДЕ Ссылка = &Ссылка
СГРУППИРОВАТЬ ПО Товар
;
ВЫБРАТЬ
Док.*,
Остатки.КоличествоОстаток Нехватка,
Остатки.СтепениБрака СтепениБрака
ИЗ
ВТ Док
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТовара.Остатки(
&Момент, СтепениБрака = &СтепеньБрака И КоличествоОстаток < 0) Остатки
ПО Док.Товар = Остатки.Товар
Я не пойму, у нас в запросе степень брака может быть разной, какой параметр мы должны туда передать? Или мы можем передать ссылку на справочник где хранятся все показатели брака и оно распределит?
(7) Если вам надо все степени брака - то и отбирать ничего не надо, зачем?
Если надо такието и такието, то параметром можете передать СписокЗначений содержащий ссылки на необходимые.
Скачайте обработку "КонсольЗапросов" если еще не скачали, она поможет вам в этом деле :3
Также для обучения рекомендую видео уроки Павла Чистова, у него вроде ютуб канал есть.
если он может у нас быть разные.
Я правильно понял вашу проблему, что в этом реквизите у вас несколько разных справочников может быть, а вам надо получить только с одним из этих справочников?
ВЫБРАТЬ
РеализацияТоваровТорговля.Товар КАК Товар,
РеализацияТоваровТорговля.Количество КАК Количество
ПОМЕСТИТЬ Торговля
ИЗ
Документ.РеализацияТоваров.Торговля КАК РеализацияТоваровТорговля
ИНДЕКСИРОВАТЬ ПО
Товар
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ОстаткиТовараОстатки.Товар КАК Товар,
ОстаткиТовараОстатки.СтепеньБрака КАК СтепеньБрака,
ОстаткиТовараОстатки.КоличествоОстаток КАК КоличествоОстаток,
ОстаткиТовараОстатки.СтоимостьОстаток КАК СтоимостьОстаток
ПОМЕСТИТЬ Остатки
ИЗ
РегистрНакопления.ОстаткиТовара.Остатки(
,
Товар В
(ВЫБРАТЬ
Торговля.Товар КАК Товар
ИЗ
Торговля КАК Торговля)) КАК ОстаткиТовараОстатки
ИНДЕКСИРОВАТЬ ПО
Товар
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Торговля.Товар КАК Товар,
Остатки.СтепеньБрака КАК СтепеньБрака,
Торговля.Количество КАК Количество,
Остатки.КоличествоОстаток КАК КоличествоОстаток,
Остатки.СтоимостьОстаток КАК СтоимостьОстаток
ИЗ
Торговля КАК Торговля
ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Остатки
ПО Торговля.Товар = Остатки.Товар
УПОРЯДОЧИТЬ ПО
Товар,
Остатки.СтепеньБрака.Степень
ИТОГИ
МАКСИМУМ(Количество),
СУММА(КоличествоОстаток),
СУММА(СтоимостьОстаток)
ПО
Товар,
СтепеньБрака
(15) И вполне можно было обойтись без помещения остатков во временную таблицу)
Это не только дольше выполняться будет, но и будет занимать память до конца жизни процедуры (хотя вроде Выборка = Неопределено может вызвать деструктор и почистить за собой, но в этом на 100% Я не уверен). Жаль, что 1с не догадалась добавить сорт sizeof() - это заметно улучшило бы качество кода.
Также лучше не использовать подзапросы вовсе, ограничиваясь временными таблицами.
Естественно это только придирки и в современных реалиях компухтерной техники ничего страшного не произойдет, не подумайте, что Я большой сторонник байтоебства :3
ЗЫ: постоянно забываю индексировать временные таблицы, за это вот напоминание - большое спасибо.
(16) оч положительно отношусь к критике. Собственно этой заметкой и руководствовался:
Cоединения с виртуальными таблицами
Рекомендации
Если в запросе используется соединение с виртуальной таблицей языка запросов 1С:Предприятия (например, "РегистрНакопления.Товары.Остатки()") и запрос работает с неудовлетворительной производительностью, то рекомендуется вынести обращение к виртуальной таблице в отдельный запрос с сохранением результатов во временной таблице.
Можно конечно удаление ВТ замутить в конце запроса.
Можно конечно удаление ВТ замутить в конце запроса.
Создать лишнее, чтоб потом удалить лишнее?)))
Но вообще Я вроде погнал горячку и после выполнения запроса подобные временные таблицы существуют в очень урезаном состоянии, за это прошу прощения)
Подзапросов же у мну вроде нет.
С ходу не соображу, можно ли было отказаться от этого.
И уж темболее не подскажу как на подобное отзывается транслятор в человеческий запрос :3
Товар В
(ВЫБРАТЬ
Торговля.Товар КАК Товар
ИЗ
Торговля КАК Торговля)) КАК ОстаткиТовараОстатки
Я бы ограничился таким, но думаю, гуру 1с могут меня в чем то поправить:
ВЫБРАТЬ Максимум(НомерСтроки) НомерСтроки, Товар
ПОМЕСТИТЬ ВТ
ИЗ Документ.РеализацияТоваров.Торговля
ГДЕ Ссылка = &Ссылка
СГРУППИРОВАТЬ ПО Товар
ИНДЕКСИРОВАТЬ ПО Товар
;
ВЫБРАТЬ
Док.*,
Остатки.КоличествоОстаток Нехватка,
Остатки.СтепениБрака СтепениБрака
ИЗ
ВТ Док
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТовара.Остатки(
&Момент, СтепениБрака = &СтепеньБрака И КоличествоОстаток < 0) Остатки
ПО Док.Товар = Остатки.Товар
(18) почему поместил виртуальную таблицу остатков во временную я объяснил.
Разве временные таблицы создаются не в TempDB?
Если в параметрах виртуальной таблицы установить отбор по значению ресурса, то на выходе будет совсем не то, что ожидается.
Почему ставишь отбор по конкретной степени брака? Ведь нужно списывать в порядке её возрастания (убывания). Один товар может быть с разной степенью брака на остатке.
(19) Из Расходной накладной необходимо количество получить. Так что ВЫБРАТЬ РАЗЛИЧНЫЕ не прокатит.
Ведь нужно списывать в порядке её возрастания (убывания). Один товар может быть с разной степенью брака на остатке.
Этой строчкой ответил на вопрос автора, а как ему надо там отбирать - Я не знаю :3
как мне сюда сделать ещё отбор по 1 измерению (Степени брака)?
Алсо, если Максимум(НомерСтроки) как то в дальнейшем завязан в отборе, то лучше подобные вещи делать через "ИМЕЮЩИЕ". Про него частенько напрасно забывают :3
С ходу не соображу, можно ли было отказаться от этого.
И уж темболее не подскажу как на подобное отзывается транслятор в человеческий запрос :3
Товар В
(ВЫБРАТЬ
Торговля.Товар КАК Товар
ИЗ
Торговля КАК Торговля)) КАК ОстаткиТовараОстатки