Имя: Пароль:
1C
1С v8
Запрос для вывода нулевых остатков
,
0 antihacker
 
29.12.14
16:46
Вот запрос.

    выбСписСклады=новый списокзначений;
    выбСписСклады.Добавить(справочники.Склады.НайтиПоКоду("000000001"));
    выбСписСклады.Добавить(справочники.Склады.НайтиПоКоду("00000001t"));
    выбСписСклады.Добавить(справочники.Склады.НайтиПоКоду("000000098"));
    выбСписСклады.Добавить(справочники.Склады.НайтиПоКоду("000000091"));
    
ДЛЯ КАЖДОГО склад ИЗ выбСписСклады ЦИКЛ
    
    запрос=новый запрос;
    запрос.Текст="ВЫБРАТЬ
    |    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
    |    СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК КоличествоОстаток
    |ИЗ
    |    РегистрНакопления.ТоварыНаСкладах.Остатки(
    |            &ДатаОст,
    |            Склад В (&выбСписСклады)
    |                И Номенклатура.Монолит = ИСТИНА) КАК ТоварыНаСкладахОстатки
    |
    |СГРУППИРОВАТЬ ПО
    |    ТоварыНаСкладахОстатки.Номенклатура
    |ИТОГИ
    |    СУММА(КоличествоОстаток)
    |ПО
    |    Номенклатура";
        
        
        выборкаТовар=запрос.Выполнить().Выбрать(обходрезультатазапроса.ПоГруппировкам,"Номенклатура");


КОНЕЦЦИКЛА

Работает правильно. Но не выводит нулевые остатки. Полчему и как сделать что бы получить нулевые и не нулевые остатки.

Спасибо.
7 asady
 
29.12.14
18:49
(0) тебе нужно по всей номенклатуре которая есть в справочнике?
а если у тебя там тыщи миллионов элементов - по всем бублик рисовать что-ли?
8 antihacker
 
29.12.14
19:51
В запросе есть строка
Номенклатура.Монолит = ИСТИНА
По идее она должна вытащить те номенклатуры у которых есть этот признак.
9 GROOVY
 
29.12.14
19:54
Сгруппировать - нафиг? Там нет повторяющихся значений.
Итоги нафига? Колбасу и Отвертки складывать?
Цикл вообще зачем?
10 GROOVY
 
29.12.14
19:54
"В запросе есть строка
Номенклатура.Монолит = ИСТИНА
По идее она должна вытащить те номенклатуры у которых есть этот признак."

Эта строка должна ограничить выбор записей по этому признаку.
11 antihacker
 
29.12.14
20:07
GROOVY, не усложняй и не отвлекай. Пожалуйста по теме. Можешь предложить вариант ?
12 antihacker
 
29.12.14
20:07
Как надо писать запрос ?
13 GROOVY
 
29.12.14
20:12
Могу.

Убираем группировки, цикл и итоги, делаем левое соединение справочника с регистром накопления.
Причем сначала выбираем из справочника всех Монолист, а потом этот результат используем и как таблицу справочника и как значение фильтра для расчета виртуальной таблицы. Думаю тут хорошо впишется использование временной таблицы. И надеюсь Монолист - проиндексированный реквизит!
14 antihacker
 
30.12.14
06:04
Ну в теории я так и понял ) А примерчик ?
15 SeraFim
 
30.12.14
06:07
(14)а зарплату тоже GROOVY за тебя будет получать?
Если понял, поправь сам. Если не получилось - покажи что же в итоге ты сделал.
16 Oleg_ka
 
30.12.14
06:13
Вот пример http:// infostart.ru/public/153851/ (пробел убери после http://)
17 antihacker
 
30.12.14
07:34
Вот так


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


но ошибка

{ВнешняяОбработка.Монолит21(682)}: Ошибка при вызове метода контекста (Выполнить): {(13, 1)}: Ожидается имя таблицы
<<?>>СГРУППИРОВАТЬ ПО
    выборкаСклад=запрос.Выполнить().Выбрать(обходрезультатазапроса.ПоГруппировкам,"Склад");
18 antihacker
 
30.12.14
07:38
Исправил вот так.

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


но

{ВнешняяОбработка.Монолит21(682)}: Ошибка при вызове метода контекста (Выполнить): {(11, 69)}: Поле не найдено "Справочник.Номенклатура"
И Номенклатура.Монолит = ИСТИНА ) КАК ТоварыНаСкладахОстатки по <<?>>Справочник.Номенклатура=Номенклатура
    выборкаСклад=запрос.Выполнить().Выбрать(обходрезультатазапроса.ПоГруппировкам,"Склад");
19 GenAcid
 
30.12.14
07:42
по СпрНоменклатура.Номенклатура=ТоварыНаСкладахОстатки .Номенклатура
20 antihacker
 
30.12.14
07:42
Исправил вот так

    |    ТоварыНаСкладахОстатки.Склад КАК Склад,
    |    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
    |    СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК КоличествоОстаток
    |ИЗ
    |   Справочник.Номенклатура КАК СпрНоменклатура
    |        ЛЕВОЕ СОЕДИНЕНИЕ     
    |    РегистрНакопления.ТоварыНаСкладах.Остатки(
    |            &ДатаОст,
    |            Склад В (&выбСписСклады)
    |                И Номенклатура.Монолит = ИСТИНА ) КАК ТоварыНаСкладахОстатки по СпрНоменклатура.Наименование=Номенклатура
    |
    |СГРУППИРОВАТЬ ПО
    |    ТоварыНаСкладахОстатки.Склад,
    |    ТоварыНаСкладахОстатки.Номенклатура
    |ИТОГИ
    |    СУММА(КоличествоОстаток)
    |ПО
    |    Склад,
    |    Номенклатура";
21 GenAcid
 
30.12.14
07:43
Скорее всего даже так
по СпрНоменклатура.Ссылка=ТоварыНаСкладахОстатки .Номенклатура
22 patria0muerte
 
30.12.14
07:43
.Наименование то зачем? facepalm.jpg
23 patria0muerte
 
30.12.14
07:44
Чего вообще с результатом запроса делать собираешься?
24 antihacker
 
30.12.14
07:47
Запрос вроде выполняется но далее вот так

    выборкаСклад=запрос.Выполнить().Выбрать(обходрезультатазапроса.ПоГруппировкам,"Склад");
    пока выборкаСклад.Следующий()цикл
        Файл.ЗаписатьНачалоЭлемента("r");
        Файл.ЗаписатьНачалоЭлемента("f");
        файл.ЗаписатьТекст(выборкаСклад.склад.код);
        Файл.ЗаписатьКонецЭлемента();
        Файл.ЗаписатьНачалоЭлемента("f");

И тут ошибка

{ВнешняяОбработка.Монолит21(686)}: Значение не является значением объектного типа (код)
        файл.ЗаписатьТекст(выборкаСклад.склад.код);
25 Peltzer
 
30.12.14
07:48
Потому что Null
26 Любопытная
 
30.12.14
07:49
(24) Номенклатуру выбирай из справочника, а не из регистра
27 antihacker
 
30.12.14
07:53
Это где я выбираю из регистра ?
28 antihacker
 
30.12.14
07:53
Peltze,

пробовал вот так
    СУММА(ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0))  КАК КоличествоОстаток

не помог
29 Любопытная
 
30.12.14
07:54
(27)   |    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура, - Это вот здесь ты выбираешь из регистра. А надо из справочника
30 Peltzer
 
30.12.14
07:58
Да бесполезно лечить усопшего...
И помогать тебе тоже бесполезно.

ВЫБРАТЬ
ТоварыНаСкладахОстатки.Склад,
ВЫБОР КОГДА ТоварыНаСкладахОстатки.Склад ЕСТЬ NULL
       ТОГДА ""
       ИНАЧЕ ТоварыНаСкладахОстатки.Склад.Код
КОНЕЦ КАК КодСклада,
СпрНоменклатура.Номенклатура,
ISNULL(ТоварыНаСкладахОстатки.КоличествоОстаток,0) КАК КоличествоОстаток
ИЗ
Справочники.Номенклатура КАК СпрНоменклатура
  ЛЕВОЕ СОЕДИНЕНИЕ
         (ВЫБРАТЬ ТоварыНаСкладахОстатки.Склад,
ТоварыНаСкладахОстатки.Номенклатура,
ТоварыНаСкладахОстатки.КоличествоОстаток
РегистрНакопления.ТоварыНаСкладах.Остатки(
                &ДатаОст,
                Склад В (&выбСписСклады)) КАК ТоварыНаСкладахОстатки)КАК ТоварыНаСкладахОстатки ПО СпрНоменклатура.Ссылка = ТоварыНаСкладахОстатки.Номенклатура
ГДЕ СпрНоменклатура.Монолит = ИСТИНА
31 Peltzer
 
30.12.14
08:00
Но и это не даст решения - надо ещё полное соединение по складам до левого соединения с остатками
32 Любопытная
 
30.12.14
08:04
А вложенный запрос зачем?
33 Любопытная
 
30.12.14
08:05
Чего надо-то изначально?
34 Любопытная
 
30.12.14
08:06
Ему нужны остатки общие по всем указанным складам, в том числе нулевые, судя по запросу в (0), зачем тащить склад и усложнять все?
35 Peltzer
 
30.12.14
08:10
Ну, если остатка по данному складу вообще не будет, то в результате запроса не будет записей с нулевыми остатками, потому что их просто нет в вирт.таблице
36 Peltzer
 
30.12.14
08:11
(34) А, ну да, тогда достаточно сгруппировать запрос из (30)
37 Peltzer
 
30.12.14
08:12
А в (24) он обходит по складам и пытается вывести остатки.
38 patria0muerte
 
30.12.14
08:18
Его конечно хрен разберешь, но походу что то типа:

ВЫБРАТЬ
    Номенклатура.Ссылка
ПОМЕСТИТЬ ВТНоменклатура
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Монолит
;
ВЫБРАТЬ
    Склады.Ссылка,
    Склады.Код
ПОМЕСТИТЬ ВТСклады
ИЗ
    Справочник.Склады КАК Склады
ГДЕ
    Склады.Ссылка В(&СписокСкладов)
;
ВЫБРАТЬ
    ВТНоменклатура.Ссылка КАК Номенклатура,
    ВТСклады.Ссылка КАК Склад,
    ВТСклады.Код КАК КодСклада
ПОМЕСТИТЬ ВТНоменклатураСклад
ИЗ
    ВТНоменклатура КАК ВТНоменклатура
        ПОЛНОЕ СОЕДИНЕНИЕ ВТСклады КАК ВТСклады
        ПО (ИСТИНА)
;
ВЫБРАТЬ
    ВТНоменклатураСклад.Номенклатура,
    ВТНоменклатураСклад.Склад,
    ВТНоменклатураСклад.КодСклада,
    ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК Остаток
ИЗ
    ВТНоменклатураСклад КАК ВТНоменклатураСклад,
    РегистрНакопления.ТоварыНаСкладах.Остатки(
            &Период,
            (Номенклатура, Склад) В
                (ВЫБРАТЬ
                    ВТ.Номенклатура,
                    ВТ.Склад
                ИЗ
                    ВТНоменклатураСклад КАК ВТ)) КАК ТоварыНаСкладахОстатки
39 patria0muerte
 
30.12.14
08:19
+(38)При условии, что необходима информация о том, на каком складе чего нет (Хотя нафиг это надо - непонятно)
40 antihacker
 
30.12.14
08:31
Любопытна,

по поводу ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,

это я потом буду сравнивать с тем же справочником вот здесь ?

СпрНоменклатура.Наименование=Номенклатура
41 Любопытная
 
30.12.14
08:38
(40) зачем?
42 antihacker
 
30.12.14
08:39
Ну как  ? Запрос посмотри. Я из справочника беру через

    |   Справочник.Номенклатура КАК СпрНоменклатура
    |        ЛЕВОЕ СОЕДИНЕНИЕ
43 Любопытная
 
30.12.14
08:40
(42) ты ничего не берешь из справочника, ты только соединяешь с ним
44 antihacker
 
30.12.14
08:44
Соединить справочник с тем же справочником ?
45 Любопытная
 
30.12.14
08:45
(44) выбрать номенклатуру из справочника!
46 antihacker
 
30.12.14
08:47
В чем прикол ? Выбрать  из справочника и и еще раз выбрать из справочника потом с ними что делать.
47 Oleg_ka
 
30.12.14
08:49
(46)
Вместо

|    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,

напиши

|    СпрНоменклатура.Номенклатура КАК Номенклатура,
48 antihacker
 
30.12.14
08:54
СпрНоменклатура уже Справочник.Номенклатура. От туда еще раз номенклатуру ?
49 katc
 
30.12.14
08:58
Попахивает феерическим кретинизмом.
50 SeraFim
 
30.12.14
08:58
(48) читай (38)
51 antihacker
 
30.12.14
09:03
Ну написал. Получил то что ожидал.

{ВнешняяОбработка.Монолит21(683)}: Ошибка при вызове метода контекста (Выполнить): {(3, 18)}: Поле не найдено "СпрНоменклатура.Номенклатура"
СпрНоменклатура.<<?>>Номенклатура КАК Номенклатура,
    выборкаСклад=запрос.Выполнить().Выбрать(обходрезультатазапроса.ПоГруппировкам,"Склад");
52 Любопытная
 
30.12.14
09:06
(51) Вы че там, уже праздновать начали?
53 Любопытная
 
30.12.14
09:06
|    СпрНоменклатура.Ссылка КАК Номенклатура,
54 patria0muerte
 
30.12.14
09:07
(52) Походу и не заканчивали...
55 antihacker
 
30.12.14
09:10
{ВнешняяОбработка.Монолит21(683)}: Ошибка при вызове метода контекста (Выполнить): {(3, 2)}: Поле не входит в группу "СпрНоменклатура.Ссылка"
<<?>>СпрНоменклатура.Ссылка КАК Номенклатура,
    выборкаСклад=запрос.Выполнить().Выбрать(обходрезультатазапроса.ПоГруппировкам,"Склад");
по причине:
{(3, 2)}: Поле не входит в группу "СпрНоменклатура.Ссылка"
<<?>>СпрНоменклатура.Ссылка КАК Номенклатура,
56 Любопытная
 
30.12.14
09:15
о боги...
(55) Может пора включить голову, а не тупо копипастить с форума?
57 patria0muerte
 
30.12.14
09:16
(55) Не тупи, возьми запрос из (38) и обходи как тебе надо... Или позови кого нибудь из взрослых, коли сам читать ошибки не умеешь...
58 antihacker
 
30.12.14
09:20
Ну сделал так

    |
    |СГРУППИРОВАТЬ ПО
    |    ТоварыНаСкладахОстатки.Склад,
    |     СпрНоменклатура.Ссылка
Все равно здесь ошибка

    
    выборкаСклад=запрос.Выполнить().Выбрать(обходрезультатазапроса.ПоГруппировкам,"Склад");
    пока выборкаСклад.Следующий()цикл
        Файл.ЗаписатьНачалоЭлемента("r");
        Файл.ЗаписатьНачалоЭлемента("f");
        файл.ЗаписатьТекст(выборкаСклад.склад.код);

Такая ошибка. Выше писал

{ВнешняяОбработка.Монолит21(687)}: Значение не является значением объектного типа (код)
        файл.ЗаписатьТекст(выборкаСклад.склад.код);
59 patria0muerte
 
30.12.14
09:22
(58) Сам угадаешь почему ошибка?
60 Любопытная
 
30.12.14
09:22
(59) Мне кажется - он прикалывается.
61 patria0muerte
 
30.12.14
09:23
(60) Тогда талант. Я бы так при желании не смог.
62 antihacker
 
30.12.14
09:23
А ХЗ. Не стал бы спрашивать если знал.
63 patria0muerte
 
30.12.14
09:24
(62) А че взялся, если не знаешь?
64 antihacker
 
30.12.14
09:25
А ты родился сразу вундеркиндом ? Ни изучал и ни кто не помогал ?
65 Любопытная
 
30.12.14
09:26
(62) Судя по вопросам, ты даже не пытаешься понять, а это самое плохое. Попроси кого-нить написать это за тебя и не мучайся
66 antihacker
 
30.12.14
09:26
Так вед он код видел до левого соединения.
67 antihacker
 
30.12.14
09:27
Что тут изменилось. Вот что не могу понять.
68 ktvladimir
 
30.12.14
09:27
ыыы). смысл человеку объяснять? он не хочет понимать он хочет чтоб за него сделали. бог с ним с группировками и циклом, но чел тупо не хочет даже понимать что он делает.
69 Любопытная
 
30.12.14
09:27
(66) Еще раз: левое соединение у тебя со справочником Номенклатура, а ругается на поле Склад.Код. А склада нет, судя по всему.
70 Любопытная
 
30.12.14
09:28
(67) консоль запросов возьми, и посмотри, что у тебя выбирается в запросе, какие поля получаются, какие данные. Тогда станет понятнее, как их обрабатывать дальше
71 antihacker
 
30.12.14
09:29
Я хочу остатки нулевые и не нулевые. Сказали через левое соединения с справочником номенклатуры. Написал. Код не видит. Вот спрашиваю почему ? Если подсказали значить подскажите до конца.
72 Любопытная
 
30.12.14
09:30
(71) ПОТОМУ ЧТО КОД СКЛАДА, А НЕ НОМЕНКЛАТУРЫ!!!!!!!!!
73 SeraFim
 
30.12.14
09:32
(57) только ты там забыл соединение прописать. Опять тупизма на 50 постов будет...
74 patria0muerte
 
30.12.14
09:34
(73) О, кстати точно, не заметил...
75 antihacker
 
30.12.14
09:51
Любопытна, я там хочу видеть КОД склада. При чем тут номенклатура ?

И где я не написал соединение ?

Вот код. Повторяю

    запрос=новый запрос;
    запрос.Текст="ВЫБРАТЬ

    |    ТоварыНаСкладахОстатки.Склад КАК Склад,
    |    СпрНоменклатура.Ссылка КАК Номенклатура,
    |    СУММА(ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0))  КАК КоличествоОстаток
    //|    СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК КоличествоОстаток    
    |ИЗ
    |   Справочник.Номенклатура КАК СпрНоменклатура
    |        ЛЕВОЕ СОЕДИНЕНИЕ     
    |    РегистрНакопления.ТоварыНаСкладах.Остатки(
    |            &ДатаОст,
    |            Склад В (&выбСписСклады)
    |                И Номенклатура.Монолит = ИСТИНА ) КАК ТоварыНаСкладахОстатки по СпрНоменклатура.Ссылка=Номенклатура
    |
    |СГРУППИРОВАТЬ ПО
    |    ТоварыНаСкладахОстатки.Склад,
    |     СпрНоменклатура.Ссылка
    |ИТОГИ
    |    СУММА(КоличествоОстаток)
    |ПО
    |    Склад,
    |    Номенклатура";
    
    
    датаост=конецдня(ДатаСозданияЗаказов);
    запрос.УстановитьПараметр("ДатаОст",датаост);
    выбСписСклады=новый списокзначений;
    выбСписСклады.Добавить(справочники.Склады.НайтиПоКоду("000000001"));
    выбСписСклады.Добавить(справочники.Склады.НайтиПоКоду("00000001t"));
    выбСписСклады.Добавить(справочники.Склады.НайтиПоКоду("000000098"));
    выбСписСклады.Добавить(справочники.Склады.НайтиПоКоду("000000091"));
    запрос.УстановитьПараметр("выбСписСклады",выбСписСклады);
    
    
    выборкаСклад=запрос.Выполнить().Выбрать(обходрезультатазапроса.ПоГруппировкам,"Склад");
    пока выборкаСклад.Следующий()цикл
        Файл.ЗаписатьНачалоЭлемента("r");
        Файл.ЗаписатьНачалоЭлемента("f");
        файл.ЗаписатьТекст(выборкаСклад.склад.код);
        Файл.ЗаписатьКонецЭлемента();
        Файл.ЗаписатьНачалоЭлемента("f");
76 SeraFim
 
30.12.14
09:58
(75) Ну нету у тебя склада!
На пальцах объясняю: Есть справочник номенклатуры:
Колбаса
Печеньки
Тортик
Остатки:
Колбаса Склад 1 - 10
Колбаса Склад 2 - 15
Тортик Склад 2 - 7
А печенек нету нигде!

Левое соединение означает, что нужно выбрать ВСЕ записи из первой таблицы и только НЕКОТОРЫЕ (удовлетворяющие условию соединения) из второй.
То есть у тебя получается:
Колбаса             Колбаса Склад 1 - 10
Колбаса             Колбаса Склад 2 - 15
Печеньки            --------------------
Тортик              Тортик Склад 2 - 7
77 Бертыш
 
30.12.14
10:20
Талант
78 Peltzer
 
30.12.14
10:24
в (25) я уже отвечал, почему ошибка, не пробил, нужно калибр побольше или бронепробитие повыше.
79 antihacker
 
30.12.14
11:15
Мало того что я не могу вытащить товар с нулевыми остатками а теперь еще и склад исчез ?
80 hhhh
 
30.12.14
11:24
(79) ну так

   |ИЗ
    |   Справочник.Номенклатура КАК СпрНоменклатура
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Склады КАК СпрСклады ПО ИСТИНА
81 antihacker
 
30.12.14
12:01
Мдяяяя по п*****ли по п*****ли  в итоге в все запросе увидели то чего хотят сами , а не то что хочу. Спасибо помогли )
82 GROOVY
 
30.12.14
12:56
antihacker, ну ты обращайся если что! С наступающим!
83 Peltzer
 
30.12.14
12:59
(81) у тебя талант не видеть решения, или ты сам не знаешь чего хочешь, с новым годом
84 antihacker
 
30.12.14
13:02
Ну япросил добить запрос. Там не выодит нулевые остатки. В и тоге ваш запрос не выводит и склад тоже. Вот результат.

тебя так же
85 Peltzer
 
30.12.14
13:03
Слушай, а ты случайно не программист? А то мне тут надо отчетик написать, не поможешь?
86 antihacker
 
30.12.14
13:06
Надеюсь там не нужны нулевые остатки
87 Peltzer
 
30.12.14
13:08
Да не, просто тыща строчек кода забесплатно
88 GROOVY
 
модератор
30.12.14
13:11
(87) Заканчивай стебатся.
89 antihacker
 
30.12.14
13:11
Вроде я не просил за меня написать. Решение свой показал. Не на голом месте. Ну ребята не смогли значит не смогли. Зачем теперь отмазки какие то. Вопрос простой был.
90 Black Dragon
 
30.12.14
13:56
так консоль запросов то есть?
91 ktvladimir
 
30.12.14
14:35
(89) Смешно.
92 antihacker
 
31.12.14
09:08
Всем привет !

Все таки добил эту суку.

    выбСписСклады=новый списокзначений;
    выбСписСклады.Добавить(справочники.Склады.НайтиПоКоду("000000001"));
    выбСписСклады.Добавить(справочники.Склады.НайтиПоКоду("00000001t"));
    выбСписСклады.Добавить(справочники.Склады.НайтиПоКоду("000000098"));
    выбСписСклады.Добавить(справочники.Склады.НайтиПоКоду("000000091"));
    запрос.УстановитьПараметр("выбСписСклады",выбСписСклады);
    
ДЛЯ КАЖДОГО склад ИЗ выбСписСклады ЦИКЛ
    
        // запрос по элементам
    запрос=новый запрос;
    запрос.Текст=
    "ВЫБРАТЬ

    |   СпрНоменклатура.Ссылка КАК Номенклатура ,

    | ЕСТЬNULL(СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток),0) КАК КоличествоОстаток
    
КоличествоОстаток
    |ИЗ
    |    Справочник.Номенклатура КАК СпрНоменклатура
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(    
    |            &ДатаОст,
    |            Склад В (&выбСписСклады)
    |                И Номенклатура.Монолит = ИСТИНА) КАК ТоварыНаСкладахОстатки
    |        ПО  СпрНоменклатура.Ссылка = Номенклатура ГДЕ СпрНоменклатура.Монолит = ИСТИНА
СпрСклады ПО ИСТИНА
    
выбСписСклады  И  СпрНоменклатура.Монолит=ИСТИНА   И   ТоварыНаСкладахОстатки.Период=&ДатаОст
    |СГРУППИРОВАТЬ ПО
    | СпрНоменклатура.Ссылка,    
    |    ТоварыНаСкладахОстатки.Номенклатура ";
93 ktvladimir
 
31.12.14
09:31
из минусов не нужная группировка, запрос в цикле конструкция Номенклатура.Монолит = Истина (Если Монолит это булевый Тип то лучше было бы указать просто Номенклатура.Монолит)
94 ktvladimir
 
31.12.14
09:34
"ВЫБРАТЬ
|    Спр.Ссылка КАК Номенклатура
|ПОМЕСТИТЬ
|    втНоменклатура
|ИЗ
|    Справочник.Номенклатура КАК Спр
|ГДЕ
|    Спр.Монолит
|
|;
|
|ВЫБРАТЬ
|    СкладыНоменклатура.Номенклатура,
|    СкладыНоменклатура.Склад,
|    ЕСТЬNULL(Остатки.КоличествоОстаток,0) КАК КоличествоОстаток
|ИЗ
|    (ВЫБРАТЬ
|        втНоменклатура.Номенклатура,
|        Спр.Склад,
|    ИЗ
|        втНоменклатура КАК втНоменклатура
|            ПОЛНОЕ СОЕДИНЕНИЕ Справочник.Склады КАК Спр
|            ПО ИСТИНА
|    ГДЕ
|        Спр.Ссылка В (&выбСписСклады)) КАК СкладыНоменклатура
|        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(    
|            &ДатаОст,
|            Склад В (&выбСписСклады)
|                И Номенклатура В (ВЫБРАТЬ
|                                        Номенклатура
|                                    ИЗ
|                                        втНоменклатура))  КАК Остатки
|        ПО
|            СкладыНоменклатура.Номенклатура = Остатки.Номенклатура
|            И СкладыНоменклатура.Склад = Остатки.Склад
|ИТОГИ ПО
|    Склад";
ВыборкаСклада = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаСклада.Следующий() Цикл
    //Вывод склада
    Выборка = ВыборкаСклада.Выбрать();
    Пока Выборка.Следующий() Цикл
        //Вывод номенклатуры и остатков
    КонецЦикла;
КонецЦикла;
95 antihacker
 
31.12.14
09:50
Зачем так усложнять ?
И если убрать группировку то

{ВнешняяОбработка.Монолит21(719)}: Ошибка при вызове метода контекста (Выполнить): {(2, 4)}: Поле не входит в группу "СпрНоменклатура.Ссылка"
<<?>>СпрНоменклатура.Ссылка КАК Номенклатура ,
        выборкаТовар=запрос.Выполнить().Выбрать();//(обходрезультатазапроса.ПоГруппировкам,"СпрНоменклатура.Ссылка");
по причине:
{(2, 4)}: Поле не входит в группу "СпрНоменклатура.Ссылка"
<<?>>СпрНоменклатура.Ссылка КАК Номенклатура ,
96 ktvladimir
 
31.12.14
09:57
в твоем случае сервер будет дергаться н раз Н это количество складов. те ресурсов будет потрачен в н раз больше. если ты убираешь группировку то нужно убрать и конструкцию сумма.
в данном случае остатки тебе и так выдадут в единичном экземпляре и группировка бессмысленна, те в твоем коде
    | ЕСТЬNULL(СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток),0) КАК КоличествоОстаток
заменить на
    | ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток,0) КАК КоличествоОстаток
и убрать строки
|СГРУППИРОВАТЬ ПО
    | СпрНоменклатура.Ссылка,    
    |    ТоварыНаСкладахОстатки.Номенклатура
97 antihacker
 
31.12.14
10:02
{ВнешняяОбработка.Монолит21(718)}: Ошибка при вызове метода контекста (Выполнить): {(3, 4)}: Поле не входит в группу "ТоварыНаСкладахОстатки.КоличествоОстаток"
<<?>>ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток
        выборкаТовар=запрос.Выполнить().Выбрать();//(обходрезультатазапроса.ПоГруппировкам,"СпрНоменклатура.Ссылка");
98 ktvladimir
 
31.12.14
10:09
сделай проще верни как было открой конструктором и удали строки с двух окошек справа на закладке Группировка "Групповое поле" и "Суммируемое поле". а так я вижу что ты что то не очистил, но что именно сказать не могу так как не вижу запроса. скопировать твой запрос тоже не могу так как у меня нет типовых баз)
99 ktvladimir
 
31.12.14
10:12
ну а вообще если ты убрал сумму в ЕСТЬNULL(СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток),0) КАК КоличествоОстаток
и удалил все группировки включая команду СГРУППИРОВАТЬ ВСЕ то все должно было работать.. что то не очистил
100 antihacker
 
31.12.14
10:12
Да нет
Исправил. Тока вот пока что и склад тоже брать одним запросом потом обхдить по его группировке мозгов не хватает. Пробовал. Опять нулевые остатки исчезают.
    "ВЫБРАТЬ
    |   СпрНоменклатура.Ссылка КАК Номенклатура ,
    |   ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток
    |ИЗ
    |    Справочник.Номенклатура КАК СпрНоменклатура
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(    
    |            &ДатаОст,
    |            Склад В (&выбСписСклады)
    |                И Номенклатура.Монолит = ИСТИНА) КАК ТоварыНаСкладахОстатки
    |        ПО  СпрНоменклатура.Ссылка = Номенклатура ГДЕ СпрНоменклатура.Монолит = ИСТИНА ";
101 antihacker
 
31.12.14
10:14
А вообще не знаю как писать два соединения в одном запросе
102 ktvladimir
 
31.12.14
10:26
ты убрал естьNULL

ТоварыНаСкладахОстатки.КоличествоОстаток

должно быть ЕстьNULL(ТоварыНаСкладахОстатки.КоличествоОстаток,0) КАК КоличествоОстаток
103 ktvladimir
 
31.12.14
10:34
(100, 101) я привел пример кода в (94)
Сперва мы получаем таблицу необходимой нам номенклатуры с отбором по монолитом
далее мы делаем декартово произведение номенклатур и складов те для каждой номенклатуры приделываем склад из спсика, потом к этой таблицы левым соединением цепляем остатки, таким образом получаем для КАЖДОЙ номенклатуры и склада остаток. 0 Если такого остатка нет (конструкция естьNULL)
104 ktvladimir
 
31.12.14
10:40
далее я описал как делать выборку

ВыборкаСклада = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаСклада.Следующий() Цикл
    те тут мы получаем информацию о складе ВыборкаСклада.Склад

    Выборка = ВыборкаСклада.Выбрать();
    Пока Выборка.Следующий() Цикл
        // тут уже доступ ко всей остальной информации
через выборка.

    КонецЦикла;
КонецЦикла;
это мы получили исходя из
ИТОГИ ПО
|    Склад

те у нас есть группировка склад и вторая это детальные записи те все поля

если бы у нас было скажем
ИТОГИ ПО
|    Склад, Номенклатура
то было бы

ВыборкаСклада = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаСклада.Следующий() Цикл
    //Склад ВыборкаСклада.Склад

    ВыборкаНоменклатуры = ВыборкаСклада.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаНоменклатуры .Следующий() Цикл
        // Номенклатура ВыборкаНоменклатуры .Номенклатура
        Выборка = ВыборкаНоменклатуры.Выбрать();
            Пока Выборка.Следующий().... КонецЦикла;
    КонецЦикла;
КонецЦикла;
105 antihacker
 
31.12.14
12:08
Брат, спасибо что так стараешься !
106 tank68
 
31.12.14
13:09
http://1c-wiki.ru/wiki/Ежедневные_остатки