Имя: Пароль:
1C
1С v8
Получение остатка на каждый день
0 MAPATNK2
 
naïve
16.07.18
11:54
Всем доброго дня появилась необходимость в получение следующих данных:
Необходимо получить количество дней за определенный период, в котором товара не было на складе. Пытался:

"ВЫБРАТЬ
    |    ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
    |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ (НАЧАЛОПЕРИОДА(ТоварыНаСкладахОстаткиИОбороты.Период, ДЕНЬ))) КАК Период
    |ИЗ
    |    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&Дат1, &Дат2, ДЕНЬ, , ) КАК ТоварыНаСкладахОстаткиИОбороты
    |ГДЕ
    |    ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток <= 0
        |ГДЕ ТоварыНаСкладахОстаткиИОбороты.Номенклатура.Ссылка В ИЕРАРХИИ(&Ном)
СГРУППИРОВАТЬ ПО
ТоварыНаСкладахОстаткиИОбороты.Номенклатура"
Но к сожалению данный запрос выводит мне нудевой остаток только если совершился оборот по необходимой номенклатуре и остаток после этого оборота равен нулю. КАК ПОЛУЧИТЬ ДАННЫЕ ПО ВСЕМ ДНЯМ, В КОТОРЫХ ОСТАТОК ТОВАРА НА СКЛАДЕ БЫЛ РАВЕН НУЛЮ?
1 MAPATNK2
 
naïve
16.07.18
11:55
За <= прошу прощения, бывают минуса на складе, но это уже другая история.
2 Малыш Джон
 
16.07.18
11:57
хмммм.... еженедельный вопрос...

создавай или вытаскивай откуда-нибудь список нужных тебе дней, левым соединением к нему - твои остатки
3 MAPATNK2
 
naïve
16.07.18
12:00
(2) Откуда вытащить список дней? Легче ли перебрать циклом, для каждого дня делать запрос? Или это неоптимально и сильно нагрузит систему?
4 Ненавижу 1С
 
гуру
16.07.18
12:01
например есть РС РегламентированныйПроизводственныйКалендарь
5 Джинн
 
16.07.18
12:01
ОФФ. Второе десятилетие тупые менеджеры с тупыми односниками бьются головой о дерево в попытке решить таким способом задачу управления запасами. И также объяснить, что контора, торгующая канцтоварами, не продавала пароходы и Ламборгини "потому, что их не было на складе".
6 Tonik992
 
16.07.18
12:02
Попробуйте использовать:

|ИТОГИ ПО
|   Период ПЕРИОДАМИ("+Интервал+", &НачДата, &КонДата)";

а потом:

Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Период", "Все");
7 novichok79
 
16.07.18
12:06
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ТоварыНаСкладах.Период КАК Период,
    ТоварыНаСкладах.Номенклатура КАК Номенклатура,
    ТоварыНаСкладах.ВНаличииКонечныйОстаток КАК ВНаличииКонечныйОстаток
ИЗ
    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&ДатаНачала, &ДатаОкончания, День, ДвиженияИГраницыПериода,
    Номенклатура В ИЕРАРХИИ (&Номенклатура)
    ) КАК ТоварыНаСкладах
ГДЕ
    ТоварыНаСкладах.ВНаличииКонечныйОстаток <= 0

УПОРЯДОЧИТЬ ПО
    Номенклатура,
    Период

типа так?
8 DrShad
 
16.07.18
12:08
(7) вообще не в тему
9 Михаил Козлов
 
16.07.18
12:08
(7) Нет.
10 novichok79
 
16.07.18
12:17
(8) (9) а, ему количество дней надо.
не такое сходу не написать
сначала получить периоды, потом к ним таблицу дат (либо РС регл. производственный календарь) и потом количество различных дней по каждому периоду.
11 MAPATNK2
 
naïve
16.07.18
12:21
Спасибо, буду пробовать
12 Михаил Козлов
 
16.07.18
12:25
(11) Попробуйте так:
ВЫБРАТЬ РАЗЛИЧНЫЕ
КурсыВалют.Период
ПОМЕСТИТЬ Дни
ИЗ  РегистрСведений.КурсыВалют КАК КурсыВалют
ГДЕ КурсыВалют.Период МЕЖДУ &НачалоПериода И &КонецПериода
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТнС.Номенклатура КАК Номенклатура,
ДНИ.Период КАК Период,
СУММА(ВЫБОР КОГДА ТнС.Период = &НачалоПериода ТОГДА ТнС.КоличествоКонечныйОстаток ИНАЧЕ ВЫБОР КОГДА ТнС.Период <= ДНИ.Период ТОГДА ТнС.КоличествоОборот ИНАЧЕ 0 КОНЕЦ КОНЕЦ) КАК Остаток
ПОМЕСТИТЬ ТнС
ИЗ Дни КАК ДНИ,
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, , Номенклатура В ИЕРАРХИИ(&Номенклатура)) КАК ТнС
СГРУППИРОВАТЬ ПО ТнС.Номенклатура, ДНИ.Период
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТнС.Номенклатура КАК Номенклатура,
КОЛИЧЕСТВО(ТнС.Период) КАК днейБезОстатка
ИЗ ТнС КАК ТнС
ГДЕ ТнС.Остаток = 0
СГРУППИРОВАТЬ ПО ТнС.Номенклатура

РС "Курсы валют" используется для получения массива всех дней. Лучше использовать РС "Производственный календарь".
13 mistеr
 
16.07.18
12:29
(0) Не забудь потом проверять еще и оборот за день = 0. Потому что бывают ситуации, когда товар пришел и ушел в тот же день.
14 MAPATNK2
 
naïve
16.07.18
12:40
(13) (12) Спасибо большое
15 Tonik992
 
16.07.18
12:41
Если результат запроса используется в дальнейшем в выборке, тогда делайте так, как в (6). Не надо делать лишние соединения.
16 MAPATNK2
 
naïve
16.07.18
12:46
(15) не совсем понятно что это  Период ПЕРИОДАМИ("+Интервал+", &НачДата, &КонДата)";, что за интервал?
17 hhhh
 
16.07.18
12:48
Период ПЕРИОДАМИ(день
18 MAPATNK2
 
naïve
16.07.18
12:48
(16) Нашел инфу, спасибо, посмотрю
19 MAPATNK2
 
naïve
16.07.18
12:55
(15) Все равно не ясно как эта конструкция должна использоваться
20 MAPATNK2
 
naïve
16.07.18
12:59
(15)

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


Ошибку пишет. Не совсем понятно как пользоваться данный "ПЕРИОДАМИ"
21 Tonik992
 
16.07.18
13:01
22 MAPATNK2
 
naïve
16.07.18
13:03
(21) На этом примере все ясно, но в моем случае период используется в Итогах 2 раза, глупость какая то.
23 Tonik992
 
16.07.18
13:09
Никакой глупости.
Уберите из итогов итоговое поле:
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ НАЧАЛОПЕРИОДА(ТоварыНаСкладахОстаткиИОбороты.Период, ДЕНЬ)) КАК Период

А оставьте только
ИТОГИ
    |ПО
    |    Период ПЕРИОДАМИ(ДЕНЬ, &Дат1, &Дат2)"
24 MAPATNK2
 
naïve
16.07.18
13:16
(23) Уже так делал, к сожалению, пишет ошибку при выполнении запроса.
25 MAPATNK2
 
naïve
16.07.18
13:17
(23)
"ВЫБРАТЬ
    |    ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
    |    ТоварыНаСкладахОстаткиИОбороты.Период КАК Период
    |ИЗ
    |    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&Дат1, &Дат2, ДЕНЬ, , Номенклатура В ИЕРАРХИИ (&Ном)) КАК ТоварыНаСкладахОстаткиИОбороты
    |ГДЕ
    |    ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток <= 0
    |ИТОГИ ПО
    |    Период ПЕРИОДАМИ(ДЕНЬ, &Дат1, &Дат2)";
26 MAPATNK2
 
naïve
16.07.18
13:19
выборка пустая
27 Tonik992
 
16.07.18
13:27
РезультатЗапрос.Пустой() будет возвращать истина, но
Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Период", "Все");

даст вам нужный результат.
28 MAPATNK2
 
naïve
16.07.18
13:29
(27) Я ведь так и сделал, пустой результат выдает
Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Период", "Все");
29 MAPATNK2
 
naïve
16.07.18
13:30
(27)

Запрос2 = новый запрос;
    Запрос2.Текст =
    "ВЫБРАТЬ
    |    ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
    |    ТоварыНаСкладахОстаткиИОбороты.Период КАК Период
    |ИЗ
    |    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&Дат1, &Дат2, ДЕНЬ, ,Номенклатура В ИЕРАРХИИ (&Ном)) КАК
    |ГДЕ
    |    ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток <= 0
    |ИТОГИ ПО
    |    Период ПЕРИОДАМИ(ДЕНЬ, &Дат1, &Дат2)";
    Запрос2.УстановитьПараметр("Дат1",ЭтаФорма.Дат1);
    Запрос2.УстановитьПараметр("Дат2",ЭтаФорма.Дат2);
    Запрос2.УстановитьПараметр("Ном",ЭтаФорма.Номенклатура);
    
    Выборка = Запрос2.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Период", "Все");
30 Tonik992
 
16.07.18
13:32
Вы хотите сказать, что Выборка.Количество() = 0 ?
31 Garykom
 
гуру
16.07.18
13:37
(0) Данная задача запросами вменяемо не решается.
32 MAPATNK2
 
naïve
16.07.18
13:37
(30) Количество не равно 0, оно равно 30. Но что это за 30?
33 Tonik992
 
16.07.18
13:38
Вот, тото и оно.
А теперь обходите циклом Выборка.Следующий()
34 Tonik992
 
16.07.18
13:40
Внутри цикла:
Выборка2 = Выборка.Выбрать();

И если Выборка2.Количество() = 0, значит имеем дело с номенклатурой, которая в данном периоде не имела движений.
35 bolobol
 
16.07.18
13:40
(32) А вы что просили-то от запроса?
36 MAPATNK2
 
naïve
16.07.18
13:41
(34) Странно, затормозил. Проверю, спасибо.
37 catena
 
16.07.18
13:45
(34)Судя по условию - не имела движений при отрицательном остатке.
38 MAPATNK2
 
naïve
16.07.18
13:46
(34) В итоге запрос выводит просто даты. Без номенклатуры, без подсчета различных дней, при котором остаток равен 0. Не подходит. Я так понимаю данный отчет подойдет если выбираешь конкретную номенклатуру и по ней получаешь количество дней, при которых на складе она равна 0. Мне необходимо получить список.
39 Tonik992
 
16.07.18
13:49
Вы ведь в (0) сказали:
"Необходимо получить количество дней за определенный период, в котором товара не было на складе"

Вот вы и в Выборке2.Количество() определяете, что если равно нулю, значит никаких там движений нет, и остатки нулевые.
А вот сейчас ваши запросу чуть-чуть выросли.. различные дни для чего-то нужны, номенклатура ?
40 MAPATNK2
 
naïve
16.07.18
13:53
(39) Мне необходимо получить количество дней, при которых товара на складе нет. А этот запрос я так и не понял что выдает
41 MAPATNK2
 
naïve
16.07.18
13:53
(12) Спасибо, вариант подходит
42 Tonik992
 
16.07.18
14:04
Разве можно использовать регистр не по его назначению? :-(
Брать р/с "валюты" для того, чтобы выцепить оттуда даты.. Это беспредел, товарищи.
43 MAPATNK2
 
naïve
16.07.18
14:24
(42) Согласен, но я всё же не понял, что выводит ваш вариант запроса.