Имя: Пароль:
1C
 
помогите с запросом
0 ded20ded
 
03.12.21
09:54
Добрый день, всем!
Мне нужно получить все мин и макс запасы, если РС нет данных, тогда по этому складу мин = макс =0

ВЫБРАТЬ
    Номенклатура.Ссылка КАК Номенклатура
ПОМЕСТИТЬ спрНоменклатура
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    НЕ Номенклатура.ЭтоГруппа
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    спрСклады.Склады КАК Склады,
    спрНоменклатура.Номенклатура КАК Номенклатура,
    ВЫБОР
        КОГДА ДополнительныеРеквизитыНоменклатурыСрезПоследних.ДополнительныйРеквизит.Ссылка = ЗНАЧЕНИЕ(Перечисление.ДополнительныеРеквизитыНоменклатуры.МаксимальныйЗапас)
            ТОГДА ДополнительныеРеквизитыНоменклатурыСрезПоследних.ЗначениеРеквизита
        ИНАЧЕ 0
    КОНЕЦ КАК МаксЗапас,
    ВЫБОР
        КОГДА ДополнительныеРеквизитыНоменклатурыСрезПоследних.ДополнительныйРеквизит.Ссылка = ЗНАЧЕНИЕ(Перечисление.ДополнительныеРеквизитыНоменклатуры.МинимальныйОстаток)
            ТОГДА ДополнительныеРеквизитыНоменклатурыСрезПоследних.ЗначениеРеквизита
        ИНАЧЕ 0
    КОНЕЦ КАК МинЗапас
ИЗ
    спрНоменклатура КАК спрНоменклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеРеквизитыНоменклатуры.СрезПоследних(&Data, ) КАК ДополнительныеРеквизитыНоменклатурыСрезПоследних
            ПРАВОЕ СОЕДИНЕНИЕ спрСклады КАК спрСклады
            ПО (спрСклады.Подразделение = ДополнительныеРеквизитыНоменклатурыСрезПоследних.ПодразделениеКомпании)
        ПО спрНоменклатура.Номенклатура = ДополнительныеРеквизитыНоменклатурыСрезПоследних.Номенклатура
ГДЕ
    спрНоменклатура.Номенклатура = &Номенклатура
1 Chameleon1980
 
03.12.21
09:59
а склады у тебя как доп. реквизит чего?
2 ded20ded
 
03.12.21
10:03
в РС - подразделение а от туда уже получаю склад
3 ded20ded
 
03.12.21
10:05
В РС номенклатура, подразделение, допРеквизит и значение
в спрСклады склад и подразделение
4 lubitelxml
 
03.12.21
10:08
Помогите развидеть ПРАВОЕ СОЕДИНЕНИЕ :)
5 ded20ded
 
03.12.21
10:13
(4) если левое тогда ерунда получается, склады заполнены, а номенклатура пустая
6 ded20ded
 
03.12.21
10:13
ИЗ
    спрСклады КАК спрСклады
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеРеквизитыНоменклатуры.СрезПоследних(&Data, ) КАК ДополнительныеРеквизитыНоменклатурыСрезПоследних
            ЛЕВОЕ СОЕДИНЕНИЕ спрНоменклатура КАК спрНоменклатура
            ПО спрНоменклатура.Номенклатура = ДополнительныеРеквизитыНоменклатурыСрезПоследних.Номенклатура
        ПО спрСклады.Подразделение = ДополнительныеРеквизитыНоменклатурыСрезПоследних.ПодразделениеКомпании
7 ded20ded
 
03.12.21
10:15
ИЗ
    спрСклады КАК спрСклады
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеРеквизитыНоменклатуры.СрезПоследних(&Data, ) КАК ДополнительныеРеквизитыНоменклатурыСрезПоследних
            ПРАВОЕ СОЕДИНЕНИЕ спрНоменклатура КАК спрНоменклатура
            ПО спрНоменклатура.Номенклатура = ДополнительныеРеквизитыНоменклатурыСрезПоследних.Номенклатура
        ПО спрСклады.Подразделение = ДополнительныеРеквизитыНоменклатурыСрезПоследних.ПодразделениеКомпании
8 ded20ded
 
03.12.21
10:15
(7) так ближе к сути, но номенклатура пустая
9 ded20ded
 
03.12.21
10:15
ВЫБРАТЬ
    Номенклатура.Ссылка КАК Номенклатура
ПОМЕСТИТЬ спрНоменклатура
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    НЕ Номенклатура.ЭтоГруппа
    И Номенклатура.Ссылка = &Номенклатура
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    спрСклады.Склады КАК Склады,
    спрНоменклатура.Номенклатура КАК Номенклатура,
    ВЫБОР
        КОГДА ДополнительныеРеквизитыНоменклатурыСрезПоследних.ДополнительныйРеквизит.Ссылка = ЗНАЧЕНИЕ(Перечисление.ДополнительныеРеквизитыНоменклатуры.МаксимальныйЗапас)
            ТОГДА ДополнительныеРеквизитыНоменклатурыСрезПоследних.ЗначениеРеквизита
        ИНАЧЕ 0
    КОНЕЦ КАК МаксЗапас,
    ВЫБОР
        КОГДА ДополнительныеРеквизитыНоменклатурыСрезПоследних.ДополнительныйРеквизит.Ссылка = ЗНАЧЕНИЕ(Перечисление.ДополнительныеРеквизитыНоменклатуры.МинимальныйОстаток)
            ТОГДА ДополнительныеРеквизитыНоменклатурыСрезПоследних.ЗначениеРеквизита
        ИНАЧЕ 0
    КОНЕЦ КАК МинЗапас
ИЗ
    спрСклады КАК спрСклады
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеРеквизитыНоменклатуры.СрезПоследних(&Data, ) КАК ДополнительныеРеквизитыНоменклатурыСрезПоследних
            ПРАВОЕ СОЕДИНЕНИЕ спрНоменклатура КАК спрНоменклатура
            ПО спрНоменклатура.Номенклатура = ДополнительныеРеквизитыНоменклатурыСрезПоследних.Номенклатура
        ПО спрСклады.Подразделение = ДополнительныеРеквизитыНоменклатурыСрезПоследних.ПодразделениеКомпании
10 Dmitrii
 
гуру
03.12.21
10:46
Бред какой-то.
По логике у тебя должно быть три отдельных левых соединения с РС.
Одно для получения МинЗапас, второе для получения МаксЗапас, третье для получения склада.
А у тебя всё в одной куче. В каждой строке результата (даже если напишешь правильно условие соединения) ты будешь получать либо одно, либо второе, либо третье. В одной строке все три поля ты не увидишь никогда.
11 Малыш Джон
 
03.12.21
10:49
(0) так а что нужно то в итоге? по всем складам и по всей номенклатуре - подтянуть остатки из рс?
12 Dmitrii
 
гуру
03.12.21
10:54
(11) Он походу сам не знает что ему нужно.
В первом запросе пакета он отбирает весь справочник, в в последнем лепит условие ГДЕ спрНоменклатура.Номенклатура = &Номенклатура. Вот и поди догадайся - что ему нужно.
В любом случае в тексте запроса какой-то бред. Автор совершенно не понимает - как получить нужные данные.
13 ded20ded
 
03.12.21
11:06
(11) по всем складам, по всей номенклатуре, если в РС нет тогда мин = макс запас и равно 0
14 ded20ded
 
03.12.21
11:06
если в РС нет данных по этим складам тогда мин и макс =0
15 youalex
 
03.12.21
11:12
(13) По всем, даже если у них нет связи по спрСклады.Подразделение = ДополнительныеРеквизитыНоменклатурыСрезПоследних.ПодразделениеКомпании  ?
16 ded20ded
 
03.12.21
11:18
(15) да
17 ded20ded
 
03.12.21
11:19
ВЫБРАТЬ
    Номенклатура.Ссылка КАК Номенклатура
ПОМЕСТИТЬ спрНоменклатура
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    НЕ Номенклатура.ЭтоГруппа
    И Номенклатура.Ссылка = &Номенклатура
;

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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    спрНоменклатура.Номенклатура КАК Номенклатура,
    спрСклады.Склады КАК Склады,
    МинИМаксЗапас.МаксЗапас КАК МаксЗапас,
    МинИМаксЗапас.МинЗапас КАК МинЗапас
ИЗ
    МинИМаксЗапас КАК МинИМаксЗапас
        ЛЕВОЕ СОЕДИНЕНИЕ спрСклады КАК спрСклады
        ПО (спрСклады.Склады = МинИМаксЗапас.Склады)
        Правое СОЕДИНЕНИЕ спрНоменклатура КАК спрНоменклатура
        ПО спрНоменклатура.Номенклатура = МинИМаксЗапас.Номенклатура
18 Малыш Джон
 
03.12.21
11:19
(13) ну значит сначала надо делать полное соединение складов и номенклатуры по ИСТИНА, чтобы получить матрицу склады-номенклатура, а потом к ней левым соединением присоединять два раза РС, одно соединение на макс запса, другое - на мин запас
19 ded20ded
 
03.12.21
11:19
(17) делаю так показывает только что есть в РС
20 ded20ded
 
03.12.21
11:21
ВЫБРАТЬ
    Номенклатура.Ссылка КАК Номенклатура
ПОМЕСТИТЬ спрНоменклатура
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    НЕ Номенклатура.ЭтоГруппа
    И Номенклатура.Ссылка = &Номенклатура
;

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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    спрНоменклатура.Номенклатура КАК Номенклатура,
    спрСклады.Склады КАК Склады,
    МинИМаксЗапас.МаксЗапас КАК МаксЗапас,
    МинИМаксЗапас.МинЗапас КАК МинЗапас
ИЗ
    МинИМаксЗапас КАК МинИМаксЗапас
        ЛЕВОЕ СОЕДИНЕНИЕ спрСклады КАК спрСклады
        ПО (спрСклады.Склады = МинИМаксЗапас.Склады)
        Левое СОЕДИНЕНИЕ спрНоменклатура КАК спрНоменклатура
        ПО спрНоменклатура.Номенклатура = МинИМаксЗапас.Номенклатура
21 ded20ded
 
03.12.21
11:22
(20) склады есть номенклатуры нет, и список слишком большой
22 Малыш Джон
 
03.12.21
11:24
(21) если у тебя N складов и M номенклатуры, то строк у тебя в любом случае будет N*M, потому что ты, даже если сочетания склад-номенклатура в РС нет, все равно хочешь туда подтягивать 0. Т.е. все строки в любом случае будут присутствовать.
23 youalex
 
03.12.21
11:27
(16) тогда зачем тебе эта связь, делай как в (18), СОЕДИНЕНИЕ ПО ИСТИНА, без всяких временных таблиц.
Единственно, значения НУЖНЫХ доп. реквизитов из среза можно предварительно запихать в вт
24 Dmitrii
 
гуру
03.12.21
12:59
Что-то  типа такого должно быть.
Могут быть синтаксические ошибки, т.к. частично писал текст вручную.

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


ВЫБРАТЬ Номенклатура,  ПодразделениеКомпании, ДополнительныйРеквизит, ЗначениеРеквизита
    ПОМЕСТИТЬ ВТ_ЗначенияДопРеквизитов
    ИЗ РегистрСведений.ДополнительныеРеквизитыНоменклатуры.СрезПоследних(&Data, ДополнительныйРеквизит В (ЗНАЧЕНИЕ(Перечисление.ДополнительныеРеквизитыНоменклатуры.МаксимальныйЗапас),     ЗНАЧЕНИЕ(Перечисление.ДополнительныеРеквизитыНоменклатуры.МинимальныйОстаток)))
    ;
    ВЫБРАТЬ СпрНоменклатура.Ссылка КАК Номенклатура, СпрСклады.Ссылка КАК Склад,
        ISNULL(ВТ_МаксЗапас.ЗначениеРеквизита, 0) КАК МаксимальныйЗапас,
        ISNULL(ВТ_МинОстаток.ЗначениеРеквизита, 0) КАК МинимальныйОстаток
    ИЗ Справочник.Номенклатура КАК СпрНоменклатура
        СОЕДИНЕНИЕ Справочник.СкладыКомпании КАК СпрСклады
            ПО ИСТИНА
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ЗначенияДопРеквизитов  ВТ_МаксЗапас
            ПО СпрНоменклатура.Ссылка = ВТ_МаксЗапас.Номенклатура
                И СпрСклады.Подразделение = ВТ_МаксЗапас.ПодразделениеКомпании
                И ВТ_МаксЗапас.ДополнительныйРеквизит = ЗНАЧЕНИЕ(Перечисление.ДополнительныеРеквизитыНоменклатуры.МаксимальныйЗапас)
                
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ЗначенияДопРеквизитов  ВТ_МинОстаток
            ПО СпрНоменклатура.Ссылка = ВТ_МинОстаток.Номенклатура
                И СпрСклады.Подразделение = ВТ_МинОстаток.ПодразделениеКомпании
                И ВТ_МинОстаток.ДополнительныйРеквизит = ЗНАЧЕНИЕ(Перечисление.ДополнительныеРеквизитыНоменклатуры.МинимальныйОстаток)