Имя: Пароль:
1C
1С v8
Добавить параметр отбора в СКД
0 al_zzz
 
29.05.12
06:25
Есть запрос для СКД:

ВЫБРАТЬ
   ВложенныйЗапрос.Номенклатура КАК Номенклатура,
   СУММА(ВложенныйЗапрос.КоличествоОстаток - ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток, 0)) КАК Количество
ПОМЕСТИТЬ _1_ОстаткиТекущие
ИЗ
   (ВЫБРАТЬ
       ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
       ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток
   ИЗ
       РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
   {ГДЕ
       ТоварыНаСкладахОстатки.Склад.*}
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       ТоварыВРозницеОстатки.Номенклатура,
       ТоварыВРозницеОстатки.КоличествоОстаток
   ИЗ
       РегистрНакопления.ТоварыВРознице.Остатки КАК ТоварыВРозницеОстатки
   {ГДЕ
       ТоварыВРозницеОстатки.Склад.*}) КАК ВложенныйЗапрос
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки КАК ТоварыВРезервеНаСкладахОстатки
       ПО ВложенныйЗапрос.Номенклатура = ТоварыВРезервеНаСкладахОстатки.Номенклатура
ГДЕ
   ВложенныйЗапрос.КоличествоОстаток - ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток, 0) > 0
{ГДЕ
   ВложенныйЗапрос.Номенклатура.*,
   ТоварыВРезервеНаСкладахОстатки.Склад.*}

СГРУППИРОВАТЬ ПО
   ВложенныйЗапрос.Номенклатура
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   _2_БезПродаж.Номенклатура,
   ВложенныйЗапрос.Дата
ПОМЕСТИТЬ _4_НоменклатураДата
ИЗ
   _2_БезПродаж КАК _2_БезПродаж,
   (ВЫБРАТЬ
       ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d) КАК Дата
   ИЗ
       (ВЫБРАТЬ
           0 КАК a
       
       ОБЪЕДИНИТЬ
       
       ВЫБРАТЬ
           1
       
       ОБЪЕДИНИТЬ
       
       ВЫБРАТЬ
           2
       
       ОБЪЕДИНИТЬ
       
       ВЫБРАТЬ
           3
       
       ОБЪЕДИНИТЬ
       
       ВЫБРАТЬ
           4
       
       ОБЪЕДИНИТЬ
       
       ВЫБРАТЬ
           5
       
       ОБЪЕДИНИТЬ
       
       ВЫБРАТЬ
           6
       
       ОБЪЕДИНИТЬ
       
       ВЫБРАТЬ
           7
       
       ОБЪЕДИНИТЬ
       
       ВЫБРАТЬ
           8
       
       ОБЪЕДИНИТЬ
       
       ВЫБРАТЬ
           9) КАК aa
           ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
               0 КАК b
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               1
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               2
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               3
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               4
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               5
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               6
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               7
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               8
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               9) КАК bb
           ПО (ИСТИНА)
           ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
               0 КАК c
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               1
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               2
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               3
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               4
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               5
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               6
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               7
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               8
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               9) КАК cc
           ПО (ИСТИНА)
           ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
               0 КАК d
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               1
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               2
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               3
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               4
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               5
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               6
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               7
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               8
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               9) КАК dd
           ПО (ИСТИНА)
   ГДЕ
       aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ)) КАК ВложенныйЗапрос
;

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

СГРУППИРОВАТЬ ПО
   ВложенныйЗапрос.НачалоПериода,
   ВложенныйЗапрос.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   _4_Остатки.НачалоПериода,
   МИНИМУМ(ДОБАВИТЬКДАТЕ(ЕСТЬNULL(ОстаткиКонец.НачалоПериода, ДОБАВИТЬКДАТЕ(&КонецПериода, СЕКУНДА, 1)), СЕКУНДА, -1)) КАК КонецПериода,
   _4_Остатки.Номенклатура,
   СУММА(_4_Остатки.Количество) КАК Количество
ПОМЕСТИТЬ _5_ОстаткиПериодами
ИЗ
   _4_Остатки КАК _4_Остатки
       ЛЕВОЕ СОЕДИНЕНИЕ _4_Остатки КАК ОстаткиКонец
       ПО _4_Остатки.Номенклатура = ОстаткиКонец.Номенклатура
           И _4_Остатки.НачалоПериода < ОстаткиКонец.НачалоПериода

СГРУППИРОВАТЬ ПО
   _4_Остатки.НачалоПериода,
   _4_Остатки.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
   _3_НоменклатураДата.Номенклатура КАК Номенклатура,
   СУММА(ВЫБОР
           КОГДА ЕСТЬNULL(_5_ОстаткиПериодами.Количество, 0) > 0
               ТОГДА 1
           ИНАЧЕ 0
       КОНЕЦ) КАК Количество
ПОМЕСТИТЬ _6_ВНаличии
ИЗ
   _4_НоменклатураДата КАК _3_НоменклатураДата
       ЛЕВОЕ СОЕДИНЕНИЕ _5_ОстаткиПериодами КАК _5_ОстаткиПериодами
       ПО _3_НоменклатураДата.Номенклатура = _5_ОстаткиПериодами.Номенклатура
           И (_3_НоменклатураДата.Дата МЕЖДУ _5_ОстаткиПериодами.НачалоПериода И _5_ОстаткиПериодами.КонецПериода)

СГРУППИРОВАТЬ ПО
   _3_НоменклатураДата.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   _1_ОстаткиТекущие.Номенклатура КАК Номенклатура,
   _1_ОстаткиТекущие.Количество КАК Количество,
   _6_ВНаличии.Количество КАК БылВНаличии
{ВЫБРАТЬ
   Номенклатура.*,
   Количество,
   БылВНаличии}
ИЗ
   _1_ОстаткиТекущие КАК _1_ОстаткиТекущие
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ _2_БезПродаж КАК _2_БезПродаж
       ПО _1_ОстаткиТекущие.Номенклатура = _2_БезПродаж.Номенклатура
       ЛЕВОЕ СОЕДИНЕНИЕ _6_ВНаличии КАК _6_ВНаличии
       ПО _1_ОстаткиТекущие.Номенклатура = _6_ВНаличии.Номенклатура
{ГДЕ
   _1_ОстаткиТекущие.Номенклатура.*,
   _6_ВНаличии.Количество КАК БылВНаличии}

Как добавить новый параметр отбора СКД склад?
1 Defender aka LINN
 
29.05.12
06:50
Ты что думаешь, эту простыню и правда кто-то читать будет? {} тебе в помощь и вперед
2 al_zzz
 
29.05.12
07:27
(1) Согласен. Попробую сформулировать вопрос:
 Требуется получить список товаров, имеющих остатки, у которых не было продаж за некоторый период. Остаток = ТоварыНаСкладах + ТоварыВРознице - ТоварыВРезерве.
 Если делаю по всем складам, без отбора, всё отрабатывается корректно. Если добавляю в каждый регистр конструкцию
       {ГДЕ
       <НазваниеРегистра>.Склад.*}, получаю в качестве результата пустую таблицу, если делаю по складу, несколько строк - если делаю по группе складов.
Не могу понять, почему неправильно фильтруется...
3 al_zzz
 
29.05.12
08:04
Если выполняю запрос в консоли и задаю параметры явно, результат корректен.
4 Пеппи
 
29.05.12
08:20
(3)значит проблема с параметрами не в консоли.
5 Defender aka LINN
 
29.05.12
08:32
(2) Я тебе открою тайну, если скажу, что {} можно и параметрах таблиц использовать?
6 al_zzz
 
29.05.12
08:35
(5) Т.е. не  {ГДЕ
      <НазваниеРегистра>.Склад.*} а {ИЗ <НазваниеРегистра>(,{Склад.*})} - об этом речь?
7 Пеппи
 
29.05.12
08:37
(6) да
8 al_zzz
 
29.05.12
09:16
Спасибо, всё получилось!
Подскажите ещё по одной теме.
Как сделать такую вещь: Вот у меня сейчас отчет, реализованный на СКД, выводит список товаров, которые есть на остатках, но по которым нет продаж.
А как его переделать так, чтобы если склад не выбран, он работал так же,
если склад выбран(или группа складов), была возможность отобрать товар(включалась/выключалась), который не продавался в конкретном магазине, но по фирме в целом есть продажи?
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс