Имя: Пароль:
1C
1С v8
Получить количество дней без продаж
, ,
0 Karambol
 
19.06.13
11:07
Добрый день!
УТ 10.3.
Как получить максимальное количество дней без продаж по конкретному товару.
Я вижу только такой вариант: сформировать таблицу с поступлениями/продажами и ее обрабатывать программно.
Можно ли прямо в запросе рассчитать?
1 Deon
 
19.06.13
11:10
посчитать кол-во дней, когда товар продавался
2 Рэйв
 
19.06.13
11:17
(0)Как вариант

Получи запросом дни когда были продажи товара, закинь в  тз. Потом добавь колонку, пройдись по тз и для каждой строки получи разницу в днях между тек. строкой и следующей. Потом стсортируешь по убыванию и в первой строке получишь максимум
3 ukolabrother
 
19.06.13
11:19
выбрать из графика все дни, убрать дни с продажами
4 Нуф-Нуф
 
19.06.13
11:29
ВЫБРАТЬ
   ПродажиОбороты.Номенклатура КАК Номенклатура,
   НАЧАЛОПЕРИОДА(ПродажиОбороты.Период, ДЕНЬ) КАК Период,
   ПродажиОбороты.КоличествоОборот КАК Количество
ПОМЕСТИТЬ ТаблицаПродаж
ИЗ
   РегистрНакопления.Продажи.Обороты(, , День, Номенклатура = &Номенклатура) КАК ПродажиОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТаблицаПродаж.Номенклатура,
   ТаблицаПродаж.Период,
   МИНИМУМ(ВЫБОР
           КОГДА РАЗНОСТЬДАТ(ТаблицаПродаж.Период, ТаблицаПродажДляСоединения.Период, ДЕНЬ) >= 0
               ТОГДА РАЗНОСТЬДАТ(ТаблицаПродаж.Период, ТаблицаПродажДляСоединения.Период, ДЕНЬ)
           ИНАЧЕ РАЗНОСТЬДАТ(ТаблицаПродажДляСоединения.Период, ТаблицаПродаж.Период, ДЕНЬ)
       КОНЕЦ) КАК Разница
ПОМЕСТИТЬ ТаблицаРазницыДней
ИЗ
   ТаблицаПродаж КАК ТаблицаПродаж,
   ТаблицаПродаж КАК ТаблицаПродажДляСоединения
ГДЕ
   ВЫБОР
           КОГДА РАЗНОСТЬДАТ(ТаблицаПродаж.Период, ТаблицаПродажДляСоединения.Период, ДЕНЬ) >= 0
               ТОГДА РАЗНОСТЬДАТ(ТаблицаПродаж.Период, ТаблицаПродажДляСоединения.Период, ДЕНЬ)
           ИНАЧЕ РАЗНОСТЬДАТ(ТаблицаПродажДляСоединения.Период, ТаблицаПродаж.Период, ДЕНЬ)
       КОНЕЦ > 0

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТаблицаРазницыДней.Номенклатура,
   МАКСИМУМ(ТаблицаРазницыДней.Разница) КАК Разница
ИЗ
   ТаблицаРазницыДней КАК ТаблицаРазницыДней

СГРУППИРОВАТЬ ПО
   ТаблицаРазницыДней.Номенклатура
5 Нуф-Нуф
 
19.06.13
11:29
с вас 2000 руб.
6 zak555
 
19.06.13
11:34
(4) это если товар хоть один раз продавался за период
7 Нуф-Нуф
 
19.06.13
11:39
(6)

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

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   &Номенклатура,
   НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ),
   1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   &Номенклатура,
   НАЧАЛОПЕРИОДА(&ОкончаниеПериода, ДЕНЬ),
   1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТаблицаПродаж.Номенклатура,
   ТаблицаПродаж.Период,
   МИНИМУМ(ВЫБОР
           КОГДА РАЗНОСТЬДАТ(ТаблицаПродаж.Период, ТаблицаПродажДляСоединения.Период, ДЕНЬ) >= 0
               ТОГДА РАЗНОСТЬДАТ(ТаблицаПродаж.Период, ТаблицаПродажДляСоединения.Период, ДЕНЬ)
           ИНАЧЕ РАЗНОСТЬДАТ(ТаблицаПродажДляСоединения.Период, ТаблицаПродаж.Период, ДЕНЬ)
       КОНЕЦ) КАК Разница
ПОМЕСТИТЬ ТаблицаРазницыДней
ИЗ
   ТаблицаПродаж КАК ТаблицаПродаж,
   ТаблицаПродаж КАК ТаблицаПродажДляСоединения
ГДЕ
   ВЫБОР
           КОГДА РАЗНОСТЬДАТ(ТаблицаПродаж.Период, ТаблицаПродажДляСоединения.Период, ДЕНЬ) >= 0
               ТОГДА РАЗНОСТЬДАТ(ТаблицаПродаж.Период, ТаблицаПродажДляСоединения.Период, ДЕНЬ)
           ИНАЧЕ РАЗНОСТЬДАТ(ТаблицаПродажДляСоединения.Период, ТаблицаПродаж.Период, ДЕНЬ)
       КОНЕЦ > 0

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТаблицаРазницыДней.Номенклатура,
   МАКСИМУМ(ТаблицаРазницыДней.Разница) КАК Разница
ИЗ
   ТаблицаРазницыДней КАК ТаблицаРазницыДней

СГРУППИРОВАТЬ ПО
   ТаблицаРазницыДней.Номенклатура
8 Csar
 
19.06.13
11:40
Можно пояснить раздел?
ВЫБРАТЬ
   ТаблицаПродаж.Номенклатура,
   ТаблицаПродаж.Период,
   МИНИМУМ(ВЫБОР
           КОГДА РАЗНОСТЬДАТ(ТаблицаПродаж.Период, ТаблицаПродажДляСоединения.Период, ДЕНЬ) >= 0
               ТОГДА РАЗНОСТЬДАТ(ТаблицаПродаж.Период, ТаблицаПродажДляСоединения.Период, ДЕНЬ)
           ИНАЧЕ РАЗНОСТЬДАТ(ТаблицаПродажДляСоединения.Период, ТаблицаПродаж.Период, ДЕНЬ)
       КОНЕЦ) КАК Разница
ПОМЕСТИТЬ ТаблицаРазницыДней
ИЗ
   ТаблицаПродаж КАК ТаблицаПродаж,
   ТаблицаПродаж КАК ТаблицаПродажДляСоединения

Тут из ВТ ТаблицаПродаж перебираются все даты и создается выборка с минимумом дней простоя по отношению к каждому дня продажи?
9 Нуф-Нуф
 
19.06.13
11:50
(8) да. мы для каждой даты продажи получаем варианты со всеми датами, получаем разницу с этими вариантами, и выбираем минимальную (т.е. для каждой даты продажи получаем разницу дней до ближайшей к ней дате продажи)
10 Csar
 
19.06.13
12:02
(9) оригинально
11 IamAlexy
 
19.06.13
12:02
(0) найти последнюю дату продажи и посчитать количество дней между оной и нужной ?
12 Csar
 
19.06.13
12:04
(11) так это ты ерунду получишь
13 zak555
 
19.06.13
12:17
(4) зачем тебе выбор в выборке и в условии ?
14 Нуф-Нуф
 
19.06.13
12:19
(13) потому что мне нужно получить разницу для каждой записи. и получить только те записи, для которой разница больше 0.
хотя при умножении таблиц можно было поставить условие по неравенству дат (чтобы избежать 0 в принципе). хз что лучше
15 zak555
 
19.06.13
12:20
(14) достаточно было бы
указать


ВЫБРАТЬ
  РАЗНОСТЬДАТ(ТаблицаПродаж.Период, ТаблицаПродажДляСоединения.Период, ДЕНЬ)

....


ГДЕ

РАЗНОСТЬДАТ(ТаблицаПродаж.Период, ТаблицаПродажДляСоединения.Период, ДЕНЬ) > 0
16 zak555
 
19.06.13
12:22
хотя равесто лучше отсевать в соединении

ТаблицаПродаж
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаПродажДляСоединения
ПО ТаблицаПродаж.Период <> ТаблицаПродажДляСоединения.Период
17 Нуф-Нуф
 
19.06.13
12:30
(15) ты получишь не все разницы дат. так как разница может быть и отрицательно

(16) если таблица будет большая, то условие на неравенство при умножении таблиц возможно будет не самым лучшим вариантом
18 zak555
 
19.06.13
12:32
(17)

1. я их отсеиваю, т.к. они мне не интересны
2. это надо проверять
19 Нуф-Нуф
 
19.06.13
12:34
(18) кстати да. точно. отрицательные даты - это тоже самое что и положительные :)))) только полученные другим вычислением Большее-Меньшее и Меньшее-Большее.
Да, ты прав. можно выбор убрать и в условии просто >0
20 zak555
 
19.06.13
12:44
(7) смотри товар, который не продавался
с 01.01 по 31.01

=> у тебя выведет количество 30 дней, что неправильно =)))
21 Нуф-Нуф
 
19.06.13
12:58
(20) почему?
22 zak555
 
19.06.13
13:13
(21) сколько будет по-твоему ?
23 zak555
 
19.06.13
16:41
вот надо было


ВЫБРАТЬ
   ПродажиОбороты.Номенклатура,
   НАЧАЛОПЕРИОДА(ПродажиОбороты.Период, ДЕНЬ) КАК ДеньПродажи
ПОМЕСТИТЬ ТаблицаПродаж
ИЗ
   РегистрНакопления.Продажи.Обороты(&Дата1, &Дата2, День, Номенклатура В (&Номенклатура)) КАК ПродажиОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТаблицаПродаж.Номенклатура КАК Номенклатура,
   НАЧАЛОПЕРИОДА(&Дата1, ДЕНЬ) КАК ДеньПродажи
ПОМЕСТИТЬ ТаблицаПродажПолная
ИЗ
   ТаблицаПродаж КАК ТаблицаПродаж

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   ТаблицаПродаж.Номенклатура,
   ТаблицаПродаж.ДеньПродажи
ИЗ
   ТаблицаПродаж КАК ТаблицаПродаж

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   ТаблицаПродаж.Номенклатура,
   НАЧАЛОПЕРИОДА(&Дата2, ДЕНЬ)
ИЗ
   ТаблицаПродаж КАК ТаблицаПродаж

ИНДЕКСИРОВАТЬ ПО
   Номенклатура,
   ДеньПродажи
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТаблицаПродажПолная1.Номенклатура,
   МАКСИМУМ(РАЗНОСТЬДАТ(ТаблицаПродажПолная1.ДеньПродажи, ТаблицаПродажПолная2.ДеньПродажи, ДЕНЬ)) КАК КоличествоДнейМеждуПродажами
ИЗ
   ТаблицаПродажПолная КАК ТаблицаПродажПолная1
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаПродажПолная КАК ТаблицаПродажПолная2
       ПО ТаблицаПродажПолная1.ДеньПродажи <> ТаблицаПродажПолная2.ДеньПродажи
ГДЕ
   РАЗНОСТЬДАТ(ТаблицаПродажПолная1.ДеньПродажи, ТаблицаПродажПолная2.ДеньПродажи, ДЕНЬ) > 0

СГРУППИРОВАТЬ ПО
   ТаблицаПродажПолная1.Номенклатура
24 Нуф-Нуф
 
19.06.13
16:46
(23) а сам пробовал его выполнить?
25 Aprobator
 
19.06.13
16:52
(23) фигня откровенная.
26 zak555
 
19.06.13
16:55
(24) не работает ?

(25) в чём ?
27 Нуф-Нуф
 
19.06.13
16:55
(24) не работает
28 Aprobator
 
19.06.13
16:59
(26) дни без продаж между двумя ближайшими продажами. А у тебя что? Макисмальная разница между ДЮБЫМИ различными датами продажи под данной номенклатуре.
29 Aprobator
 
19.06.13
17:00
блин - чего то пальцы по клавиатуре попадают криво )
30 zak555
 
20.06.13
12:34
да, ошибся, надо было так :


ВЫБРАТЬ
   ПродажиОбороты.Номенклатура,
   НАЧАЛОПЕРИОДА(ПродажиОбороты.Период, ДЕНЬ) КАК ДеньПродажи
ПОМЕСТИТЬ ТаблицаПродаж
ИЗ
   РегистрНакопления.Продажи.Обороты(&Дата1, &Дата2, День, Номенклатура В (&Номенклатура)) КАК ПродажиОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТаблицаПродаж.Номенклатура КАК Номенклатура,
   ТаблицаПродаж.ДеньПродажи КАК ДеньПродажи
ПОМЕСТИТЬ ТаблицаПродажПолная
ИЗ
   ТаблицаПродаж КАК ТаблицаПродаж

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   ТаблицаПродаж.Номенклатура,
   НАЧАЛОПЕРИОДА(&Дата1, ДЕНЬ)
ИЗ
   ТаблицаПродаж КАК ТаблицаПродаж

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   ТаблицаПродаж.Номенклатура,
   НАЧАЛОПЕРИОДА(&Дата2, ДЕНЬ)
ИЗ
   ТаблицаПродаж КАК ТаблицаПродаж

ИНДЕКСИРОВАТЬ ПО
   Номенклатура,
   ДеньПродажи
;

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

СГРУППИРОВАТЬ ПО
   ВложенныйЗапрос.Номенклатура
31 zak555
 
20.06.13
12:50
хотя

ТаблицаПродажПолная1.ДеньПродажи <> ТаблицаПродажПолная2.ДеньПродажи

лучше заменить на

ТаблицаПродажПолная1.ДеньПродажи <= ТаблицаПродажПолная2.ДеньПродажи
32 GANR
 
20.06.13
12:58
(0) > Можно ли прямо в запросе
Да, можно, для этого нужно
1. Сгенерировать последоватьельность дат с периодичностью ДЕНЬ. В этом поможет Книга знаний: Генерация числовой последовательности и последовательности дат при помощи языка запросов.
2. Соединить п.1 с таблицей продаж по дням по условию на товар и на дату.
3. Ввести поле
сумма(выбор
 когда [п.2].Период есть null тогда
   1
 иначе
   0
конец)
Все понятно?
33 GANR
 
20.06.13
13:00
(32) А хотя можно и проще - вычесть количество дней, когда продажи были из общего количества дней в периоде - тогда и мудрить ничего не надо. (0) Забей на (32) - читай настоящее сообщение, эта идея перспективнее.
34 Aprobator
 
20.06.13
14:24
(30) опять мимо кассы.
35 Aprobator
 
20.06.13
14:26
хотя, при условии в (31) сработает.
36 zak555
 
20.06.13
14:47
(34) сработает и так, и так (35)
37 zak555
 
20.06.13
14:53
условие (31) можно и вовсе убрать
38 dk
 
20.06.13
15:02
небольшой взброс:
надо еще учитывать чтобы товар был на остатках
т.е. смотреть отсутствие продаж при наличии на складе
)
39 Aprobator
 
20.06.13
15:06
(37) *почесав немного репу* - вообще да, согласен. Сработает и так и так.
40 V_V_V
 
20.06.13
15:11
А слабо выходные убрать?  :)
41 zak555
 
20.06.13
15:17
(38) интересует факт продажи
42 zak555
 
20.06.13
15:17
(40) зачем ?
43 dk
 
20.06.13
15:19
(41) в (0) написано про отсутствие продаж
44 zak555
 
20.06.13
15:21
(43) так в (30) для тех, кто хотя бы один раз продавался
если нужно дополнить -- то вт правое соединение есть нул
45 zak555
 
20.06.13
15:24
и его дополняем
РАЗНОСТЬДАТ(&Дата2, &Дата1, ДЕНЬ) + 86400
46 dk
 
20.06.13
15:28
(44) остатки прикрутить легко тока на словах )
47 zak555
 
20.06.13
15:29
(46) причём тут остатки ?
ты же говоришь, что нужно добавить в результат те, номенклатуры, которые не продавались ?
48 dk
 
20.06.13
15:30
не продавались, но БЫЛИ на остатках
49 zak555
 
20.06.13
16:34
(48) про это точно ни слова =)
50 zak555
 
24.06.13
08:11
автор пропал
51 zak555
 
24.06.13
22:07
кстати, как лучше ускорить (30) и (31) ?