Вход | Регистрация


1С:Предприятие ::

Метки: 

Получение остатка на каждый день

Я
   MAPATNK2
 
16.07.18 - 11:54
Всем доброго дня появилась необходимость в получение следующих данных:
Необходимо получить количество дней за определенный период, в котором товара не было на складе. Пытался:

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

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

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

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

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

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

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

ВЫБРАТЬ
 ТнС.Номенклатура КАК Номенклатура,
 КОЛИЧЕСТВО(ТнС.Период) КАК днейБезОстатка 
ИЗ ТнС КАК ТнС
ГДЕ ТнС.Остаток = 0 
СГРУППИРОВАТЬ ПО ТнС.Номенклатура

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

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


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

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

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

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

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

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



Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует