Имя: Пароль:
1C
 
Вопрос по СКД: как получить количество дней за период?
0 DSSS
 
03.12.09
12:52
Всем доброго дня!
Подскажите, как в СКД получить за период количество дней, когда конечный остаток товара на складе был больше нуля. Т.е нужна таблица с колонками нач. остаток, приход, расход, конечный остаток и колич. дней. Количество дней сейчас пытаюсь получить через вычисляемое поле по формуле:

Выбор когда КоличествоКонечныйОстаток>0 тогда 1 иначе 0 конец

В настройках отчета для колонки "ПериодДень" задан тип дополнения "День", чтобы получить запись для всех дней, если движений по регистру не было. В таком виде отчет работает неправильно.
Запрос:

ВЫБРАТЬ
   ТоварыНаСкладахОстаткиИОбороты.Регистратор,
   ТоварыНаСкладахОстаткиИОбороты.ПериодСекунда,
   ТоварыНаСкладахОстаткиИОбороты.ПериодМинута,
   ТоварыНаСкладахОстаткиИОбороты.ПериодЧас,
   ТоварыНаСкладахОстаткиИОбороты.ПериодДень,
   ТоварыНаСкладахОстаткиИОбороты.ПериодНеделя,
   ТоварыНаСкладахОстаткиИОбороты.ПериодДекада,
   ТоварыНаСкладахОстаткиИОбороты.ПериодМесяц,
   ТоварыНаСкладахОстаткиИОбороты.ПериодКвартал,
   ТоварыНаСкладахОстаткиИОбороты.ПериодПолугодие,
   ТоварыНаСкладахОстаткиИОбороты.ПериодГод,
   ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
   ТоварыНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры,
   ТоварыНаСкладахОстаткиИОбороты.Склад,
   ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток,
   ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток
ИЗ
   РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, , Авто, , ) КАК ТоварыНаСкладахОстаткиИОбороты

Подскажите, куда копать?
Спасибо.
1 DSSS
 
03.12.09
12:59
ап...
2 Икогнито
 
03.12.09
13:02
в наборе данных роль "период" прописана?
3 DSSS
 
03.12.09
13:04
(2) Для какого поля?
4 DSSS
 
03.12.09
13:16
апну еще разок
5 IronDemon
 
03.12.09
13:21
6 DSSS
 
03.12.09
13:29
(5) Сделал такие же настройки. Результат тот же.
как заставить вычисляемое поле считать Выбор когда КоличествоКонечныйОстаток>0 тогда 1 иначе 0 конец ?
7 bvn13
 
03.12.09
13:30
РАЗНОСТЬДАТ() юзай
8 RomaH
 
naïve
03.12.09
13:31
я правильно понимаю - т.е. в таблице запроса мы прото не имеем в наличии записей для определенного условия?

т.е. надо дополнять запрос этими записями внутри его ... тут недавно тема пробегала да и в БЗ есть - как заполнить запрос всеми датами внутри промежутка времени
9 DSSS
 
03.12.09
13:32
(7) причем тут разность дат? мне нужно получить количество дней, когда количество конечный остаток > 0
10 RomaH
 
naïve
03.12.09
13:33
11 Мигрень
 
03.12.09
13:36
12 DSSS
 
03.12.09
13:39
(10) Спасибо, возможно подойдет вот это. Только мне думается можно как-то проще обрулить эту задачу - т.е у меня есть колонка конечныйОстаток, и нужно чтобы рядом была колонка "Колич. дней", в которую всегда подставляется 1 если конечный остаток >0

Допустим перед нами стоит задача, сгенерировать последовательность дат месяца.
В качестве параметра в запрос мы будем передавать первую дату месяца.


ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&МЕСЯЦ, МЕСЯЦ), ДЕНЬ, n) КАК Дата
ИЗ (ВЫБРАТЬ
   5*(a-1)+b-1 КАК n
   ИЗ
   (ВЫБРАТЬ
       1 КАК a ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6) КАК t1
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
       1 КАК b ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6) КАК t2
       ПО (ИСТИНА)) КАК T
   ГДЕ
       n < ДЕНЬ(КОНЕЦПЕРИОДА(&МЕСЯЦ, МЕСЯЦ))

Во вложенном запросе мы формируем числовую последовательность от 0 до 35, далее в запросе верхнего уровня мы генерируем последовательность дат, ограничивая её последним числом месяца.

(11) как в разность дат добавить условие КонечныйОстаток>0?
13 RomaH
 
naïve
03.12.09
13:40
14 Мигрень
 
03.12.09
13:43
(12)->(11)Запрос вычисляет интервалы. Вышестоящий запрос вычисляет количество дней в интервале и суммирует результат.
15 DSSS
 
03.12.09
13:46
(13) Видимо то что нужно. Благодарю.
16 DSSS
 
04.12.09
10:38
Пытаюсь использовать запрос, указанный в (13), но работает не совсем правильно.
Может все-таки кто-нить знает другой способ получения количества дней, когда товар был на складе используя возможности СКД?
17 DSSS
 
04.12.09
10:59
ап
18 DSSS
 
04.12.09
11:15
Апну еще раз
19 TormozIT
 
гуру
04.12.09
11:17
(16) Что значит "не совсем правильно"?
20 DSSS
 
04.12.09
11:24
(19)

Вот текст запроса:

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

СГРУППИРОВАТЬ ПО
   ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
   ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток,
   ТоварыНаСкладахОстаткиИОбороты.Период,
   ВЫБОР
       КОГДА ТоварыНаСкладахОстаткиИОбороты.Период = НАЧАЛОПЕРИОДА(&КонецПериода, ДЕНЬ)
           ТОГДА ВЫБОР
                   КОГДА ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстатокПредыдущий > 0
                       ТОГДА ВЫБОР
                               КОГДА ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток <= 0
                                   ТОГДА РАЗНОСТЬДАТ(ТоварыНаСкладахОстаткиИОбороты.ПредыдущийПериод, ТоварыНаСкладахОстаткиИОбороты.Период, ДЕНЬ)
                               ИНАЧЕ РАЗНОСТЬДАТ(ТоварыНаСкладахОстаткиИОбороты.ПредыдущийПериод, &КонецПериода, ДЕНЬ) + 1
                           КОНЕЦ
                   ИНАЧЕ ВЫБОР
                           КОГДА ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток > 0
                               ТОГДА РАЗНОСТЬДАТ(ТоварыНаСкладахОстаткиИОбороты.Период, &КонецПериода, ДЕНЬ) + 1
                           ИНАЧЕ 0
                       КОНЕЦ
               КОНЕЦ
       ИНАЧЕ ВЫБОР
               КОГДА ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстатокПредыдущий > 0
                   ТОГДА РАЗНОСТЬДАТ(ТоварыНаСкладахОстаткиИОбороты.ПредыдущийПериод, ТоварыНаСкладахОстаткиИОбороты.Период, ДЕНЬ)
               ИНАЧЕ 0
           КОНЕЦ
   КОНЕЦ

Результат:


Номенклатура    КоличествоДнейНаСкладе    КоличествоКонечныйОстаток    Период
Товар А        1    03.03.2009 0:00:00
Товар А        1    06.03.2009 0:00:00
Товар А    3        06.03.2009 0:00:00
Товар А    6        12.03.2009 0:00:00
Товар А        10    23.03.2009 0:00:00
Товар А        1    25.03.2009 0:00:00
Товар А    2    9    25.03.2009 0:00:00
Товар А    1    2    26.03.2009 0:00:00
Товар А    1    8    26.03.2009 0:00:00
Товар А    1    1    27.03.2009 0:00:00
Товар А    1    7    27.03.2009 0:00:00
Товар А    5    1    31.03.2009 0:00:00
Товар А    5    7    31.03.2009 0:00:00

Дублируются некоторые строки: 27.03.2009 31.03.2009,
21 DSSS
 
04.12.09
11:42
(19) TormozIT, Подскажи, плиз, что нужно изменить в запросе?
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн