Имя: Пароль:
1C
1С v8
Как правильно сформировать запрос для прайс листа с иерархией номенклатуры
,
0 Admin_Net_1C
 
25.10.13
12:29
Народ подскажите плиз: имеется УТ 11.1.2.16, необходимо сформировать прайс лист с учетом остатков по иерархии номенклатуры.
Попробовал следующий вариант:



ВЫБРАТЬ
    СвободныеОстаткиОстатки.Номенклатура,
    ЕСТЬNULL(СвободныеОстаткиОстатки.ВНаличииОстаток, 0) - ЕСТЬNULL(СвободныеОстаткиОстатки.ВРезервеОстаток, 0) КАК Остаток
ПОМЕСТИТЬ втОстатки
ИЗ
    РегистрНакопления.СвободныеОстатки.Остатки(&Период, ) КАК СвободныеОстаткиОстатки
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СправочникНоменклатура.Наименование КАК Наименование,
    СправочникНоменклатура.НаименованиеПолное,
    втЦены.Остаток КАК Остаток,
    втЦены.Цена КАК Цена,
    втЦены.Упаковка
ИЗ
   Справочник.Номенклатура КАК СправочникНоменклатура
    ЛЕВОЕ СОЕДИНЕНИЕ втЦены КАК втЦены
    ПО втЦены.Номенклатура = СправочникНоменклатура.Ссылка
    
УПОРЯДОЧИТЬ ПО
    Наименование ИЕРАРХИЯ



В итоговой таблице выводится ВСЯ номенклатура, т.е. по которой даже нет остатков. Как исправить данную ситуацию?
1 MSII
 
25.10.13
12:36
(0) Ну как-то договориться надо с собой и не выбирать в итоговом запросе номенклатуру с нулевым остатком.
2 Admin_Net_1C
 
25.10.13
12:38
(1) не понял...я номенклатуру с 0 остатком убираю еще во 2-ой временной таблице
3 VikingKosmo
 
25.10.13
12:47
(2) а соединение в итоговом запросе у тебя левое... Причем совсем левое...
4 Кир Пластелинин
 
25.10.13
12:51
на кой ляд там "левое" соединение?) 0 и null - разницу чувствуем?
5 Admin_Net_1C
 
25.10.13
12:51
(3) если ставлю другой тип соединения, то не выводится иерархия
6 VikingKosmo
 
25.10.13
12:52
(5) с этого момента по подробнее пожалуйста. Очень хотелось бы понять, каким образом соединение таблиц в запросе влияет на иерархию...
7 VikingKosmo
 
25.10.13
12:53
и да, конфигурация то на УФ, соответственно в отчете используется СКД...
8 Admin_Net_1C
 
25.10.13
12:53
(6) если в последнем запросе вместо ЛЕВОЕ СОЕДИНЕНИ ставлю ПРАВОЕ или ВНУТРЕНЕЕ, то иерархия не выводится
9 VikingKosmo
 
25.10.13
12:54
(8) занятно...
10 Кир Пластелинин
 
25.10.13
12:54
жесть
11 Кир Пластелинин
 
25.10.13
12:55
могу предложить вариант, но "кака-кода", если уж "иерархия не выводится")))
12 Admin_Net_1C
 
25.10.13
12:55
(7) только изучаю 8, поэтому до СКД еще далеко...
13 Admin_Net_1C
 
25.10.13
12:56
(11) всегда готов выслушать конструктивные предложения и подсказки. Свой код идеальным никогда не считал...
14 User_Agronom
 
25.10.13
12:57
Вся им выведется.
Попробуй поставить ГДЕ втЦены.Остаток>0  в последнем запросе
15 Кир Пластелинин
 
25.10.13
12:58
(13) дам подсказку. посмотри пост (4) и проанализируй свой запрос, а точнее что у тебя будет в поле "остаток" во второй вт запроса.
16 User_Agronom
 
25.10.13
12:58
В последнем запросе берется таблица Номенклатуры (вся) и ей что-то слева при соединяется.
Нужно на неё наложить условие.
ГДЕ втЦены.Остаток>0
или
ГДЕ НЕ (втЦены.Остаток есть Нулл)
Что-то вроде этого
17 Admin_Net_1C
 
25.10.13
12:58
(14) в этом случае формируется только таблица с номенклатурой у которой есть остатки и цены, но без иерархии, а мне нужна иерархия для вывода печатной формы
18 User_Agronom
 
25.10.13
13:02
Попробуй
ВЫБРАТЬ
    СправочникНоменклатура.Ссылка КАК Наименование,
    СправочникНоменклатура.НаименованиеПолное,
    втЦены.Остаток КАК Остаток,
    втЦены.Цена КАК Цена,
    втЦены.Упаковка
ИЗ
   Справочник.Номенклатура КАК СправочникНоменклатура
    ЛЕВОЕ СОЕДИНЕНИЕ втЦены КАК втЦены
    ПО втЦены.Номенклатура = СправочникНоменклатура.Ссылка
    
УПОРЯДОЧИТЬ ПО
    Наименование ИЕРАРХИЯ
19 User_Agronom
 
25.10.13
13:02
Ну и где как я писал
20 Admin_Net_1C
 
25.10.13
13:06
(15)(18) сделал



ВЫБРАТЬ
    СвободныеОстаткиОстатки.Номенклатура,
    ЕСТЬNULL(СвободныеОстаткиОстатки.ВНаличииОстаток, 0) - ЕСТЬNULL(СвободныеОстаткиОстатки.ВРезервеОстаток, 0) КАК Остаток
ПОМЕСТИТЬ втОстатки
ИЗ
    РегистрНакопления.СвободныеОстатки.Остатки(КонецПериода(&Период, День), ) КАК СвободныеОстаткиОстатки
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СправочникНоменклатура.Наименование КАК Наименование,
    СправочникНоменклатура.НаименованиеПолное,
    втЦены.Остаток КАК Остаток,
    втЦены.Цена КАК Цена,
    втЦены.Упаковка
ИЗ
   Справочник.Номенклатура КАК СправочникНоменклатура
    ЛЕВОЕ СОЕДИНЕНИЕ втЦены КАК втЦены
    ПО втЦены.Номенклатура = СправочникНоменклатура.Ссылка

УПОРЯДОЧИТЬ ПО
    Наименование ИЕРАРХИЯ



во второй втЦены сейчас попадют только позиции с остатком, но итоговый запрос выводит все равно всю иерархию (
21 VikingKosmo
 
25.10.13
13:10
(20) потому что итоговый запрос выбирает ВСЕ записи из справочника Номенклатура и добавляет к ним записи с ценами, в случае, если Номенклатура из временной таблицы = Номенклатуре из справочника. Попробуй в условии соединения написать
И НЕ втЦены.Остаток ЕСТЬ NULL
22 Admin_Net_1C
 
25.10.13
13:19
(21) понял. Так тоже не получается. Попробовал в конечном запросе:


ВЫБРАТЬ
    СправочникНоменклатура.Наименование КАК Наименование,
    СправочникНоменклатура.НаименованиеПолное,
    втЦены.Остаток КАК Остаток,
    втЦены.Цена КАК Цена,
    втЦены.Упаковка
ИЗ
   втЦены КАК втЦены
   ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СправочникНоменклатура
   ПО СправочникНоменклатура.Ссылка = втЦены.Номенклатура
   И НЕ (втЦены.Остаток ЕСТЬ NULL)
  
УПОРЯДОЧИТЬ ПО
    Наименование ИЕРАРХИЯ


вообще ерунду выводит (
23 VikingKosmo
 
25.10.13
13:37
Ну тогда у меня осталась только одна идея. Получай иерархию не в секции УПОРЯДОЧИТЬ, а в секции ИТОГИ ПО.
24 Admin_Net_1C
 
25.10.13
13:45
(23) попробовал, тоже ерунду выводит (
25 Кир Пластелинин
 
25.10.13
14:25
чудес не бывает
26 Admin_Net_1C
 
25.10.13
14:27
(25) согласен. Еще раз посмотрел твои посты, решения не увидел, может еще раз доступнее подскажешь?
27 Кир Пластелинин
 
25.10.13
14:48
ты лучше весь код приведи и покажи, где у тебя "нет" иерархии
28 Admin_Net_1C
 
25.10.13
14:59
(27) ирерахия есть...только мне нужен список номенклатуры с иерархией, НО только по тем позициям, у которых есть остаток и цена на заданную дату. А мой текущий запрос:



ВЫБРАТЬ
    СвободныеОстаткиОстатки.Номенклатура,
    ЕСТЬNULL(СвободныеОстаткиОстатки.ВНаличииОстаток, 0) - ЕСТЬNULL(СвободныеОстаткиОстатки.ВРезервеОстаток, 0) КАК Остаток
ПОМЕСТИТЬ втОстатки
ИЗ
    РегистрНакопления.СвободныеОстатки.Остатки(КОНЕЦПЕРИОДА(&Период, ДЕНЬ), ) КАК СвободныеОстаткиОстатки
;

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



выводит в конечном запросе ВЕСЬ список номенклатуры с иерархией (т.е. все элементы, даже у которых нет цены и остатка)
29 Admin_Net_1C
 
25.10.13
15:02
(28) извиняюсь, неправильно всавил запрос, вот правильный вариант:



ВЫБРАТЬ
    СвободныеОстаткиОстатки.Номенклатура,
    ЕСТЬNULL(СвободныеОстаткиОстатки.ВНаличииОстаток, 0) - ЕСТЬNULL(СвободныеОстаткиОстатки.ВРезервеОстаток, 0) КАК Остаток
ПОМЕСТИТЬ втОстатки
ИЗ
    РегистрНакопления.СвободныеОстатки.Остатки(КОНЕЦПЕРИОДА(&Период, ДЕНЬ), ) КАК СвободныеОстаткиОстатки
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СправочникНоменклатура.Ссылка КАК Ссылка,
    СправочникНоменклатура.Наименование КАК Наименование,
    СправочникНоменклатура.НаименованиеПолное КАК НаименованиеПолное,
    СправочникНоменклатура.ЭтоГруппа КАК ЭтоГруппа,
    втЦены.Остаток КАК Остаток,
    втЦены.Цена КАК Цена,
    втЦены.Упаковка КАК Единица
ИЗ
    Справочник.Номенклатура КАК СправочникНоменклатура
        ЛЕВОЕ СОЕДИНЕНИЕ втЦены КАК втЦены
        ПО (втЦены.Номенклатура = СправочникНоменклатура.Ссылка)
ГДЕ
    НЕ СправочникНоменклатура.ПометкаУдаления

УПОРЯДОЧИТЬ ПО
    Наименование ИЕРАРХИЯ

30 Кир Пластелинин
 
25.10.13
15:03
уточню. у вас иерархия элементов что ли используется? или только иерархия групп?
31 Admin_Net_1C
 
25.10.13
15:10
(30) у справочника стоит Вид иерархии = "Иерархия групп и элементов", но мне нужно выводить только иерархию групп с элементами внутри, т.е.

Группа1
  Элемент11 Цена (Есть) Остаток (Есть)  --- выводим
  Элемент12 Цена (Нет) Остаток (Есть) --- не выводим
  Элемент13 Цена (Есть) Остаток (Нет) --- не выводим
  Элемент14 Цена (Есть) Остаток (Есть) --- выводим
  ...
  Элемент1N
Группа2
  Элемент21
  ...
  Элемент2N
32 Кир Пластелинин
 
25.10.13
15:17
пришли свою обработку/отчет или выложи куда-нибудь
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший