Имя: Пароль:
1C
1С v8
Помогите, запутался в 2х запросах.
0 PuhUfa
 
23.11.17
11:23
Есть запрос №1

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

    Запрос.УстановитьПараметр("ДокументСсылка", ДокументСсылка.Ссылка);
    Запрос.УстановитьПараметр("Организация",    ДокументСсылка.Организация);
    Запрос.УстановитьПараметр("Комиссионер",      Справочники.Контрагенты.ПустаяСсылка());

Результат = Запрос.Выполнить().Выгрузить();

Результат:
Товар А
ДокументКоличество - 1
ОстатокКоличество - 1

Есть Запрос №2 (он одет сразу поле первого в одной процедуре) и представляет из себя кусок первого запроса (левое соединение в первом)

    З = Новый Запрос;
    З.Текст =
        "ВЫБРАТЬ
        |    ТоварыОрганизацийОстатки.Организация,
        |    ТоварыОрганизацийОстатки.Номенклатура,
        |    ТоварыОрганизацийОстатки.КоличествоОстаток
        |ИЗ
        |    РегистрНакопления.ТоварыОрганизаций.Остатки(
        |            ,
        |            Номенклатура В
        |                    (ВЫБРАТЬ РАЗЛИЧНЫЕ
        |                        Документ.РеализацияТоваровУслуг.Товары.Номенклатура
        |                    ИЗ
        |                        Документ.РеализацияТоваровУслуг.Товары
        |                    ГДЕ
        |                        Документ.РеализацияТоваровУслуг.Товары.Ссылка = &ДокументСсылка
        |                        И НЕ Документ.РеализацияТоваровУслуг.Товары.Номенклатура.Комплект
        |                        И НЕ Документ.РеализацияТоваровУслуг.Товары.Номенклатура.Услуга)
        |                И Организация = &Организация
        |                И Комиссионер = &Комиссионер) КАК ТоварыОрганизацийОстатки";
    
    з.УстановитьПараметр("ДокументСсылка", ДокументСсылка.Ссылка);
    з.УстановитьПараметр("Организация",    ДокументСсылка.Организация);
    з.УстановитьПараметр("Комиссионер",     Справочники.Контрагенты.ПустаяСсылка());

    р = з.Выполнить().Выгрузить();

В результате этого запроса я получаю
КоличествоОстаток = 0

Как так? Почему в первом запросе, в результате левого соединения Остаток = 1... а во втором запросе Остаток = 0
1 DrShad
 
23.11.17
11:25
оба запроса в топку
2 PuhUfa
 
23.11.17
11:27
(1) это не ко мне... это типовой из УТ 10
3 DrShad
 
23.11.17
11:27
во втором запросе не выбираются характеристики
4 DrShad
 
23.11.17
11:28
(2) и все равно в топку
5 PuhUfa
 
23.11.17
11:32
(4) второй запрос возвращает пустой результат т.к. остатков нет... и это правильно...
но в первом запросе, когда идет левое соединение вдруг возникает остаток = 1... как может возникнуть остаток = 1 при левом соединение к пустой таблице?
6 DrShad
 
23.11.17
11:32
(5) ты реально не видишь разницы в запросах?
7 PuhUfa
 
23.11.17
11:37
(6) Нет, не вижу. Видел бы не просил помощи.
Проблема эта наблюдается только для 1 накладной... если в качестве параметра запроса указывать другую накладную (в т.ч. которой тоже товар с 0 остатком) то результаты запросов идентичны и правильны.
8 DrShad
 
23.11.17
11:38
(7) читать (3) до просветления
9 dezss
 
23.11.17
11:39
(8) опередил)
10 PuhUfa
 
23.11.17
11:44
З = Новый Запрос;
    З.Текст =
        "ВЫБРАТЬ
        |    ТоварыОрганизацийОстатки.Организация,
        |    ТоварыОрганизацийОстатки.Номенклатура,
        |    ТоварыОрганизацийОстатки.КоличествоОстаток,
        |    ТоварыОрганизацийОстатки.ХарактеристикаНоменклатуры
        |ИЗ
        |    РегистрНакопления.ТоварыОрганизаций.Остатки(
        |            ,
        |            Номенклатура В
        |                    (ВЫБРАТЬ РАЗЛИЧНЫЕ
        |                        Документ.РеализацияТоваровУслуг.Товары.Номенклатура
        |                    ИЗ
        |                        Документ.РеализацияТоваровУслуг.Товары
        |                    ГДЕ
        |                        Документ.РеализацияТоваровУслуг.Товары.Ссылка = &ДокументСсылка
        |                        И НЕ Документ.РеализацияТоваровУслуг.Товары.Номенклатура.Комплект
        |                        И НЕ Документ.РеализацияТоваровУслуг.Товары.Номенклатура.Услуга)
        |                И Организация = &Организация
        |                И Комиссионер = &Комиссионер) КАК ТоварыОрганизацийОстатки";
    
    з.УстановитьПараметр("ДокументСсылка", ДокументСсылка.Ссылка);
    з.УстановитьПараметр("Организация",    ДокументСсылка.Организация);
    з.УстановитьПараметр("Комиссионер",     Справочники.Контрагенты.ПустаяСсылка());

    р = з.Выполнить().Выгрузить();


результат запроса пустой.
т.к. з.УстановитьПараметр("Организация",    ДокументСсылка.Организация);
нет по этой Организации остатков ни с какими характеристиками
11 Torquader
 
23.11.17
11:54
Второй запрос выбирает данные из документов "Поступление" не проверяя проведённость - ну,ну.
12 Torquader
 
23.11.17
12:03
И ещё, по количеству обычно суммируют.
В первом запросе мы получим максимум, а во-втором, несколько записей для одной номенклатуры, т.к. могут быть характеристики и т.п.
13 PuhUfa
 
23.11.17
12:10
"Управление торговлей", редакция 10.3 (10.3.31.2)
Модуль набора записей РН ТоварыОрганизаций
Процедура КонтрольОстатков(ДокументОбъект, ИмяТабличнойЧасти, СтруктураШапкиДокумента, Отказ, Заголовок) Экспорт

И повторю, что косяк для 1 конкретной РТиУ... для других все работает правильно.
Сейчас попробую итоги пересчитать.
14 DrShad
 
23.11.17
12:18
(13) такое написано в модуле набора записей!? ужас
15 yavasya
 
23.11.17
12:18
(3) + серии не учитываются во втором запросе
16 DrShad
 
23.11.17
12:18
интересно откуда в модуле НЗ ссылка на док? )))
17 Torquader
 
23.11.17
12:21
(16) Магическое слово "Экспорт" позволяет творить чудеса, только вот зачем ?
18 DrShad
 
23.11.17
12:22
(17) вот не верю я что это типовой запрос
19 PuhUfa
 
23.11.17
12:29
(18) можешь скачать и проверить -) смысла мне тут что то пидумывать
20 DrShad
 
23.11.17
12:30
(19) потому что в этом запросе нет смысла, т.к. ТО не только РТиУ двигает
21 PuhUfa
 
23.11.17
12:34
(20) так эта процедура не делает движений по регистру. ее с таким же успехом можно в общий модуль вынести... но вот решили в 1С запилить ее в модуль набора записей с "Экспорт"
22 h-sp
 
23.11.17
12:55
(21) открыл этот модуль, там вообще другое. Чего вы тут гоните?
23 PuhUfa
 
23.11.17
13:14
(22) поставьте точку останова во время проведения документа и посмотрите отладчиком собранный запрос.
Смысл суда выкладывать портянку на 3 экрана вида:

    Запрос.Текст = "
    |ВЫБРАТЬ // Запрос, контролирующий остатки на складах
    |    Док.Номенклатура.Представление                         КАК НоменклатураПредставление,
    |    Док.Номенклатура.ЕдиницаХраненияОстатков.Представление КАК ЕдиницаХраненияОстатковПредставление,"
    +?(ЕстьСкладВТабЧасти, "
    |Док.Склад                                                КАК Склад,","")
    + ?(ЕстьХарактеристика, "
    |    Док." + ТекстХарактеристикаНоменклатуры + "           КАК ХарактеристикаНоменклатуры,"
    ,"")
    + ?(ЕстьСерия, "
    |    Док." + ТекстСерияНоменклатуры + "                    КАК СерияНоменклатуры,"
    ,"") + "
    |   &Комиссионер                                           КАК Комиссионер,"
    + ?(ЕстьКоэффициент, "
    |    СУММА(ВЫРАЗИТЬ(Док.Количество * Док.Коэффициент /Док.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК Число(15,3))) КАК ДокументКоличество,", "
    |    СУММА(Док.Количество)                                  КАК ДокументКоличество,") + "
    |    ЕСТЬNULL(МАКСИМУМ(Остатки.КоличествоОстаток), 0)          КАК ОстатокКоличество,
    |    ЕСТЬNULL(МАКСИМУМ(ОстаткиКПередаче.КоличествоОстаток), 0) КАК ОстатокКПередаче,
    |    0                                                      КАК ОстатокКПередачеПоДокументу
    |ИЗ
    |    "+ ТекстЗапросаРеквизитыДокумента + "


Такой текст совершенно нечитабелен на форуме
24 Torquader
 
23.11.17
13:30
(22) Он, скорей всего, его текст через отладчик выдрал, т.к. в типовых просто запросов без сборки текста просто нет.
25 h-sp
 
23.11.17
13:33
(24) там в первом запросе чисто физически нет обращения к регистру
26 PuhUfa
 
23.11.17
13:43
(25) а при чем тут первый запрос который в типовой процедуре? вы процедуру то до конца дочитайте.


зы пересчет итогов не помог. но помогло старое доброе перепроведение ручками документов по этому товару. вечером проверю на рабочей базе.
27 LeReve
 
23.11.17
13:44
(23) Кастрировать тех, кто пишет такие запросы...
28 h-sp
 
23.11.17
13:54
(26) ну вы читайте (0)

Есть Запрос №2 (он одет сразу поле первого в одной процедуре) и представляет из себя кусок первого запроса

сами же написали.

А если открыть типовую, в первом запросе вообще нет обращения к остаткам. Непонятно откуда вы вообще его откопали. Думаю, два раза маханули второй запрос, но с разными данными.
29 PuhUfa
 
23.11.17
14:00
(28) а я где то написал что запрос №2 из (0) есть в типовой? -)
В (0) первый запрос выдранный отладчиком из типовой процедуры и помещен во внешнюю обработку для отладки. второй запрос это часть первого и тоже находиться во внешней обработке сразу за первым... в одной процедуре -)
Если я где то немного не ясно выразился, ну прошу прощения -) Суть то вопроса в (0) была по результатам этих самых запросов.