Гость
Форумы / [игнор отключен] [закрыт для гостей] / 1С83 дней на складе за год (SQL) / 23 сообщений из 23, страница 1 из 1
05.04.2017, 15:15
    #39433550
Lexx_SQL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С83 дней на складе за год (SQL)
Добрый день!
Необходимо сделать выборку (SQL) товаров с указанием количества сколько он лежал на складе. Прямым способом через определение остатков на каждый день и затем суммирование дней, где кол-во отлично от нуля, это выполняется очень долго.
Думаю, что не я первый с этим сталкивается. Подскажите, пожалуйста, или методику или код как это сделать.
Спасибо.
...
Рейтинг: 0 / 0
05.04.2017, 16:13
    #39433616
LSV
LSV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С83 дней на складе за год (SQL)
Других методик не будет. Потому что единственный выход: считать остатки.

Как вариант - сделать журнал с подневными остатками. И зачитывать из него.
...
Рейтинг: 0 / 0
05.04.2017, 17:14
    #39433665
Nitro_Junkie
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С83 дней на складе за год (SQL)
Lexx_SQLДобрый день!
Необходимо сделать выборку (SQL) товаров с указанием количества сколько он лежал на складе. Прямым способом через определение остатков на каждый день и затем суммирование дней, где кол-во отлично от нуля, это выполняется очень долго.
Думаю, что не я первый с этим сталкивается. Подскажите, пожалуйста, или методику или код как это сделать.
Спасибо.

Вообщем то можно. Делаете SUM кол-во операции PARTITION BY товары, ORDER by дата, id операции - высчитываете остаток на начало операции (соответственно остаток на конец операции = на начало + количество самой операция). Соответственно для операции определяется change = 1 - если появился, -1 - если исчез, 0 если его статус не изменился. А дальше GROUP BY по change * (конец интервала - date) - "подсчет интеграла" в SQL правыми прямоугольниками. Ну и еще надо с началами интервалов пободаться.

Соответственно, это все делается одним запросом, но на голом SQL или псевдо-SQL вроде хибернейтовского или 1с-ского вы убьетесь это делать.

Модератор: Тема перенесена из форума "ERP и учетные системы".
...
Рейтинг: 0 / 0
06.04.2017, 08:51
    #39433908
Владимир Лазурко
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С83 дней на складе за год (SQL)
Lexx_SQLПрямым способом через определение остатков на каждый день и затем суммирование дней, где кол-во отлично от нуля, это выполняется очень долго.еще и неверно. Утром распродали весь остаток и пришла новая партия - в конце дня остаток есть, но оборот товара отличный от нуля. В итоге ликвидный товар тоже попадает в отчет как неликвидный.

Отсюда: Ежедневные остатки
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
ВЫБРАТЬ
    Движения.Номенклатура,
    ДНИ.Период,
    СУММА(ВЫБОР
            КОГДА Движения.Период = &НачалоПериода
                ТОГДА Движения.КоличествоКонечныйОстаток
            ИНАЧЕ ВЫБОР
                    КОГДА Движения.Период <= ДНИ.Период
                        ТОГДА Движения.КоличествоОборот
                    ИНАЧЕ 0
                КОНЕЦ
        КОНЕЦ) КАК КоличествоКонечныйОстаток
ИЗ
    Дни КАК ДНИ,
    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, , Номенклатура = &Номенклатура) КАК Движения

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

Где "Дни" - таблица дат за период

Посмотри на ИТС: Методическая поддержка 1С:Предприятия 8 -> Методические рекомендации по конфигурированию -> Система компоновки данных -> Дополнение периодов в системе компоновки данных

Если нет ИТС, скачай бесплатные материалы по 1С по ссылке http://v8.1c.ru/edu/
выбери "Версия для обучения программированию" и нажми "скачать бесплатно". В архиве на 1,8 ГБ будет папка ITS - там как раз офф-лайн версия ИТС (680 МБ).
прямая ссылка - http://online.1c.ru/catalog/free/18610119/
...
Рейтинг: 0 / 0
06.04.2017, 08:55
    #39433909
Владимир Лазурко
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С83 дней на складе за год (SQL)
...
Рейтинг: 0 / 0
06.04.2017, 09:14
    #39433916
Zerro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С83 дней на складе за год (SQL)
Партии если есть то можно по ним смотреть. Уход партий и остатки на конец
...
Рейтинг: 0 / 0
06.04.2017, 09:14
    #39433917
Nitro_Junkie
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С83 дней на складе за год (SQL)
Владимир ЛазуркоLexx_SQLПрямым способом через определение остатков на каждый день и затем суммирование дней, где кол-во отлично от нуля, это выполняется очень долго.еще и неверно. Утром распродали весь остаток и пришла новая партия - в конце дня остаток есть, но оборот товара отличный от нуля. В итоге ликвидный товар тоже попадает в отчет как неликвидный.

Отсюда: Ежедневные остатки
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
ВЫБРАТЬ
    Движения.Номенклатура,
    ДНИ.Период,
    СУММА(ВЫБОР
            КОГДА Движения.Период = &НачалоПериода
                ТОГДА Движения.КоличествоКонечныйОстаток
            ИНАЧЕ ВЫБОР
                    КОГДА Движения.Период <= ДНИ.Период
                        ТОГДА Движения.КоличествоОборот
                    ИНАЧЕ 0
                КОНЕЦ
        КОНЕЦ) КАК КоличествоКонечныйОстаток
ИЗ
    Дни КАК ДНИ,
    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, , Номенклатура = &Номенклатура) КАК Движения

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

Где "Дни" - таблица дат за период

Посмотри на ИТС: Методическая поддержка 1С:Предприятия 8 -> Методические рекомендации по конфигурированию -> Система компоновки данных -> Дополнение периодов в системе компоновки данных

Если нет ИТС, скачай бесплатные материалы по 1С по ссылке http://v8.1c.ru/edu/
выбери "Версия для обучения программированию" и нажми "скачать бесплатно". В архиве на 1,8 ГБ будет папка ITS - там как раз офф-лайн версия ИТС (680 МБ).
прямая ссылка - http://online.1c.ru/catalog/free/18610119/

Так это и есть определение остатков на каждый день и затем суммирование дней. Итого у вас материализуется таблица размером кол-во дней * среднее количество товара на остатках, СУБД очень порадуется.
Плюс при таком запросе СУБД не будет использовать результат предыдущего дня а для каждого будет считать сначала. То есть фиг с материализацией, у вас сложность алгоритма выполнения, будет кол-во дней * кол-во операций / 2. В цикле и то лучше. Вы хоть думайте прежде чем такое рекомендовать.
...
Рейтинг: 0 / 0
06.04.2017, 09:24
    #39433925
Zerro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С83 дней на складе за год (SQL)
Nitro_Junkie,

ну ладно уж количество дней - количество дней когда были изменения остатков. Если товар не оборачиваемый то это немного
...
Рейтинг: 0 / 0
06.04.2017, 10:08
    #39433951
Владимир Лазурко
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С83 дней на складе за год (SQL)
Nitro_JunkieВы хоть думайте прежде чем такое рекомендовать.Вы хоть думайте прежде чем писать "Вы хоть думайте".
Просьба относиться ко всем участникам конференции уважительно.
А вот мой совет "посмотри на ИТС" был проигнорирован. ИТС плохого не посоветует?
...
Рейтинг: 0 / 0
06.04.2017, 11:44
    #39434046
Nitro_Junkie
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С83 дней на складе за год (SQL)
ZerroNitro_Junkie,

ну ладно уж количество дней - количество дней когда были изменения остатков. Если товар не оборачиваемый то это немного

Материализоваться то как раз будут кол-во дней * (кол-во товаров которые были на начало или по которым было движение). И как раз если товар не оборачиваемый это еще хуже. Так как ассортимент будет широкие и у вас будет много остатков по одной единице - скажем 200к, и при выполнении запроса у вас будет материализоваться таблица на 6млн записей.
...
Рейтинг: 0 / 0
06.04.2017, 11:48
    #39434051
Nitro_Junkie
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С83 дней на складе за год (SQL)
Владимир ЛазуркоNitro_JunkieВы хоть думайте прежде чем такое рекомендовать.Вы хоть думайте прежде чем писать "Вы хоть думайте".
Просьба относиться ко всем участникам конференции уважительно.
А вот мой совет "посмотри на ИТС" был проигнорирован. ИТС плохого не посоветует?

Не наезд. Случайно получилось. :(

ИТС плохого не посоветует?

Это риторический вопрос? Если да, то не совсем понимаю какой на него ответ. :)
...
Рейтинг: 0 / 0
06.04.2017, 12:15
    #39434078
Владимир Лазурко
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С83 дней на складе за год (SQL)
Nitro_JunkieЭто риторический вопрос? Если да, то не совсем понимаю какой на него ответ. :)вопросительный знак был лишний.

От ТС мы не получили полной задачи - ему надо показывать неликвиды (чтобы из реализовать) или какова заполненность склада (чтобы оптимизировать затраты на арендованное помещение) - от этого меняется и подход и способ получения данных.
...
Рейтинг: 0 / 0
06.04.2017, 12:42
    #39434104
Zerro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С83 дней на складе за год (SQL)
Nitro_JunkieZerroNitro_Junkie,

ну ладно уж количество дней - количество дней когда были изменения остатков. Если товар не оборачиваемый то это немного

Материализоваться то как раз будут кол-во дней * (кол-во товаров которые были на начало или по которым было движение). И как раз если товар не оборачиваемый это еще хуже. Так как ассортимент будет широкие и у вас будет много остатков по одной единице - скажем 200к, и при выполнении запроса у вас будет материализоваться таблица на 6млн записей.
20 тышь товаров* продается 3-4 раза в месяц =100 тышь записей фигня
...
Рейтинг: 0 / 0
06.04.2017, 13:23
    #39434138
Nitro_Junkie
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С83 дней на складе за год (SQL)
ZerroNitro_Junkieпропущено...


Материализоваться то как раз будут кол-во дней * (кол-во товаров которые были на начало или по которым было движение). И как раз если товар не оборачиваемый это еще хуже. Так как ассортимент будет широкие и у вас будет много остатков по одной единице - скажем 200к, и при выполнении запроса у вас будет материализоваться таблица на 6млн записей.
20 тышь товаров* продается 3-4 раза в месяц =100 тышь записей фигня

20тыщ товаров * кол-во дней в периоде. То есть за месяц 600 тысяч записей. А если 200 тысяч или период - год - 6млн ну и т.д. А если нужно по часам считать, а если эти данные используются в операционной деятельности - ну и т.п. То есть тут подход в принципе стремный.
...
Рейтинг: 0 / 0
06.04.2017, 13:34
    #39434150
Zerro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С83 дней на складе за год (SQL)
Nitro_JunkieZerroпропущено...

20 тышь товаров* продается 3-4 раза в месяц =100 тышь записей фигня

20тыщ товаров * кол-во дней в периоде. То есть за месяц 600 тысяч записей. А если 200 тысяч или период - год - 6млн ну и т.д. А если нужно по часам считать, а если эти данные используются в операционной деятельности - ну и т.п. То есть тут подход в принципе стремный.
Посмотри как разворачивает запрос по периодам - только те дни когда было движение. то есть 20*4*12 = 640 тышь записей. не страшно. вот цикл по остаткам по 7200 тышь записям по любому медленнее будет
...
Рейтинг: 0 / 0
06.04.2017, 13:54
    #39434161
Nitro_Junkie
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С83 дней на складе за год (SQL)
ZerroNitro_Junkieпропущено...


20тыщ товаров * кол-во дней в периоде. То есть за месяц 600 тысяч записей. А если 200 тысяч или период - год - 6млн ну и т.д. А если нужно по часам считать, а если эти данные используются в операционной деятельности - ну и т.п. То есть тут подход в принципе стремный.
Посмотри как разворачивает запрос по периодам - только те дни когда было движение. то есть 20*4*12 = 640 тышь записей. не страшно. вот цикл по остаткам по 7200 тышь записям по любому медленнее будет

Не совсем понимаю что значит "разворачивает запрос по периодам". Можете хотя бы контурно обрисовать какой у него план выполнения будет? Потому как я кроме nested loop'а по дням, а дальше seq scan по таблице остатков и оборотов придумать не могу как он может это выполнять.
...
Рейтинг: 0 / 0
06.04.2017, 14:14
    #39434174
Zerro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С83 дней на складе за год (SQL)
Nitro_JunkieZerroпропущено...

Посмотри как разворачивает запрос по периодам - только те дни когда было движение. то есть 20*4*12 = 640 тышь записей. не страшно. вот цикл по остаткам по 7200 тышь записям по любому медленнее будет

Не совсем понимаю что значит "разворачивает запрос по периодам". Можете хотя бы контурно обрисовать какой у него план выполнения будет? Потому как я кроме nested loop'а по дням, а дальше seq scan по таблице остатков и оборотов придумать не могу как он может это выполнять.
когда в 1с ставишь показывать обороты с остатками по регистру день он показывает остатки на начало и конец дня в котором сменись остатки. то есть если у товара были продажи 3 и 7 то будет 2 записи
20 0 2 18 -3
18 0 1 17 -7
на каждый день просто так не сделаешь
...
Рейтинг: 0 / 0
07.04.2017, 13:50
    #39434805
Программист 1с
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С83 дней на складе за год (SQL)
Lexx_SQL, - А может зря мучаетесь?

Это от Вас попросил логист для.... (много пропущенного текста).
Ключевое - это будет запускаться раз в месяца от силы. Есть ли смысл тратить несколько дней работы на алгоритм, который сэкономит логисту 5 минут в месяц?
...
Рейтинг: 0 / 0
10.04.2017, 09:44
    #39435649
Владимир Лазурко
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С83 дней на складе за год (SQL)
Программист 1сLexx_SQL, - А может зря мучаетесь?

Это от Вас попросил логист для.... (много пропущенного текста).
Ключевое - это будет запускаться раз в месяца от силы. Есть ли смысл тратить несколько дней работы на алгоритм, который сэкономит логисту 5 минут в месяц?Для таких целей целесообразно создать регистр сведений, в который писать дату и время открытия отчета и его наименование.
А потом в конце месяца/квартала/полугодия посмотреть по нему статистику.
...
Рейтинг: 0 / 0
13.04.2017, 12:45
    #39437875
Lexx_SQL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С83 дней на складе за год (SQL)
Программист 1с,

Нужна статистика по дням для заказа. А заказ может делаться и несколько раз в день.
В 1С в каком то отчете смотрел это реализуется секунд за 30 с другими данными.
Если высчитывать остатки по дням за год (около 6,5 млн записей) и потом группировать, то выходит минут 15.
Возможно нужно считать по периодам, но не могу понять из какой таблице забирать данные.
...
Рейтинг: 0 / 0
13.04.2017, 17:50
    #39438182
Программист 1с
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С83 дней на складе за год (SQL)
Lexx_SQLПрограммист 1с,

Нужна статистика по дням для заказа. А заказ может делаться и несколько раз в день.
В 1С в каком то отчете смотрел это реализуется секунд за 30 с другими данными.
Если высчитывать остатки по дням за год (около 6,5 млн записей) и потом группировать, то выходит минут 15.
Возможно нужно считать по периодам, но не могу понять из какой таблице забирать данные.Загуглите - "1с остатки на каждый день". Там и замечательный пример есть. Думаю как раз - не более 30 секунд будет.
...
Рейтинг: 0 / 0
06.05.2017, 09:26
    #39449694
Eugeneer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С83 дней на складе за год (SQL)
Легко решается обьединением с календарем (есть такой регистр в 1С)
...
Рейтинг: 0 / 0
06.05.2017, 09:54
    #39449697
Eugeneer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
1С83 дней на складе за год (SQL)
Все примеры кривые.

Не учитывают то что в УТ10 например 2 регистра остатков по складам - с типом оптовые и отдельные регистр остатки в рознице.
Также не учитывают что могут быть выходные праздники и прочее.
На самом деле запрос намного больше и намного сложнее.

Еще может быть задача отдельно по складам и еще при ведении характеристик....

Так и быть поделюсь рабочим запросом и своего решения для УТ11 (оригинал http://subsystems.ru/solutions/program=154/)
Для УТ10 запрос будет сложнее из за двух регистров


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

СГРУППИРОВАТЬ ПО
ДниКалендаря.ДатаГрафика,
ИсторияОстатков.Номенклатура,
ИсторияОстатков.Характеристика) КАК РабочиеДниНоменклатуры
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, ДвиженияИГраницыПериода, {(Номенклатура).* КАК Номенклатура, (Склад).* КАК Склад}) КАК ИсторияОстатков
ПО РабочиеДниНоменклатуры.Период = ИсторияОстатков.Период
И РабочиеДниНоменклатуры.Номенклатура = ИсторияОстатков.Номенклатура
И РабочиеДниНоменклатуры.Характеристика = ИсторияОстатков.Характеристика

СГРУППИРОВАТЬ ПО
РабочиеДниНоменклатуры.Номенклатура,
РабочиеДниНоменклатуры.Характеристика
...
Рейтинг: 0 / 0
Форумы / [игнор отключен] [закрыт для гостей] / 1С83 дней на складе за год (SQL) / 23 сообщений из 23, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]