Запрос для получения остатков на складе на все дни, даже когда не было движений.(Для нетиповой)

Опубликовал Serg Eli (elizarovs) в раздел Программирование - Практика программирования

Запрос для 1С: Предприятие 8.1

Пример описывает механизм получения  остатков по регистру накопления на КАЖДЫЙ день периода (даже когда не было оборотов).

Проверялось на типовой БП для Казахстана, платформа 8.1

В запросе учтены наработки, представленные на данном сайте. Спасибо авторам, извините лень искать и приводить исходные ссылки. Если кому нужно спрашивайте, напишу. Вспомагательный запрос, формирующий последовательность дат заимствован целиком с Мисты. Мне он показался более удобным, и уж точно более компактным, чем у г. Душелова.

На базе приведенного запроса построен запрос с подсчетом количества дней товара на складе. Если кому интересно, выложу.

 

Текст Запроса:

ВЫБРАТЬ
    НоменклатураСПрПериодами.Партия КАК Партия,
    НоменклатураСПрПериодами.Дата КАК Дата,
    НоменклатураСПрПериодами.Номенклатура КАК Номенклатура,
    НоменклатураСПрПериодами.Номенклатура.Наименование КАК НоменклатураНаименование,
    РегистрАптекПартииОстаткиИОбороты.КолВоКонечныйОстаток
ИЗ
    (ВЫБРАТЬ
        НоменклатураСДатами.Партия КАК Партия,
        НоменклатураСДатами.Дата КАК Дата,
        МАКСИМУМ(РегистрАптекПартииОстаткиИОбороты.Период) КАК ПериодПоследний,
        НоменклатураСДатами.Номенклатура КАК Номенклатура
    ИЗ
        (ВЫБРАТЬ
            НоменклатураУровень2.Номенклатура КАК Номенклатура,
            НоменклатураУровень2.Партия КАК Партия,
            КалендарьУровень2.Дата КАК Дата
        ИЗ
            (ВЫБРАТЬ РАЗЛИЧНЫЕ
                ВыбраннаяНоменклатура.Номенклатура КАК Номенклатура,
                ВыбраннаяНоменклатура.Партия КАК Партия
            ИЗ
                (ВЫБРАТЬ
                    РегистрАптекПартииОбороты.Номенклатура КАК Номенклатура,
                    РегистрАптекПартииОбороты.Партия КАК Партия
                ИЗ
                    РегистрНакопления.РегистрАптекПартии.Обороты(&НачПериода, &КонПериода, День, Аптека = &Аптека) КАК РегистрАптекПартииОбороты
                ГДЕ
                    РегистрАптекПартииОбороты.КолВоПриход > &Ничего
               
                ОБЪЕДИНИТЬ ВСЕ
               
                ВЫБРАТЬ
                    РегистрАптекПартииОстатки.Номенклатура,
                    РегистрАптекПартииОстатки.Партия
                ИЗ
                    РегистрНакопления.РегистрАптекПартии.Остатки(&НачПериода, Аптека = &Аптека) КАК РегистрАптекПартииОстатки
                ГДЕ
                    РегистрАптекПартииОстатки.КолВоОстаток > &Ничего) КАК ВыбраннаяНоменклатура) КАК НоменклатураУровень2
                ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                    ДОБАВИТЬКДАТЕ(&НачПериода, ДЕНЬ, T.n) КАК Дата
                ИЗ
                    (ВЫБРАТЬ
                        5 * (t1.a - 1) + t2.b - 1 КАК n
                    ИЗ
                        (ВЫБРАТЬ
                            1 КАК a
                       
                        ОБЪЕДИНИТЬ
                       
                        ВЫБРАТЬ
                            2
                       
                        ОБЪЕДИНИТЬ
                       
                        ВЫБРАТЬ
                            3
                       
                        ОБЪЕДИНИТЬ
                       
                        ВЫБРАТЬ
                            4
                       
                        ОБЪЕДИНИТЬ
                       
                        ВЫБРАТЬ
                            5
                       
                        ОБЪЕДИНИТЬ
                       
                        ВЫБРАТЬ
                            6) КАК t1
                            ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                                1 КАК b
                           
                            ОБЪЕДИНИТЬ
                           
                            ВЫБРАТЬ
                                2
                           
                            ОБЪЕДИНИТЬ
                           
                            ВЫБРАТЬ
                                3
                           
                            ОБЪЕДИНИТЬ
                           
                            ВЫБРАТЬ
                                4
                           
                            ОБЪЕДИНИТЬ
                           
                            ВЫБРАТЬ
                                5
                           
                            ОБЪЕДИНИТЬ
                           
                            ВЫБРАТЬ
                                6) КАК t2
                            ПО (ИСТИНА)) КАК T
                ГДЕ
                    T.n < ДЕНЬ(КОНЕЦПЕРИОДА(&КонПериода, ДЕНЬ))) КАК КалендарьУровень2
                ПО (ИСТИНА)) КАК НоменклатураСДатами
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РегистрАптекПартии.ОстаткиИОбороты(НАЧАЛОПЕРИОДА(&НачПериода, ГОД), &КонПериода, День, , Аптека = &Аптека) КАК РегистрАптекПартииОстаткиИОбороты
            ПО НоменклатураСДатами.Номенклатура = РегистрАптекПартииОстаткиИОбороты.Номенклатура
                И НоменклатураСДатами.Партия = РегистрАптекПартииОстаткиИОбороты.Партия
                И НоменклатураСДатами.Дата >= РегистрАптекПартииОстаткиИОбороты.Период
   
    СГРУППИРОВАТЬ ПО
        НоменклатураСДатами.Партия,
        НоменклатураСДатами.Дата,
        НоменклатураСДатами.Номенклатура) КАК НоменклатураСПрПериодами
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РегистрАптекПартии.ОстаткиИОбороты(НАЧАЛОПЕРИОДА(&НачПериода, ГОД), &КонПериода, День, ДвиженияИГраницыПериода, Аптека = &Аптека) КАК РегистрАптекПартииОстаткиИОбороты
        ПО НоменклатураСПрПериодами.Номенклатура = РегистрАптекПартииОстаткиИОбороты.Номенклатура
            И НоменклатураСПрПериодами.Партия = РегистрАптекПартииОстаткиИОбороты.Партия
            И НоменклатураСПрПериодами.ПериодПоследний = РегистрАптекПартииОстаткиИОбороты.Период

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

См. также

Добавить вознаграждение
Комментарии
1. Евгений (wirg) 16.07.09 15:53 Сейчас в теме
3. Санёк (Русский) 16.07.09 15:57 Сейчас в теме
Если в СКД указать в качестве группировочного поле с типом Дата, и указать у него метод дополнения ДЕНЬ, то также получаем данные расписанные по дням включая дни без записей в регистре.
4. Дмитрий Глух (IronDemon) 682 16.07.09 16:34 Сейчас в теме
(3) Это для вывода но не для расчета.
5. Дмитрий Глух (IronDemon) 682 16.07.09 16:38 Сейчас в теме
Автор, запросы нужно выкладывать которые пойдут в типовых конфигурациях без изменений.
6. Санёк (Русский) 16.07.09 17:07 Сейчас в теме
(4) Можно запихать результат работы СКД в универсальную коллекцию и уже с ней маневрировать чего-нить.
7. Дмитрий Глух (IronDemon) 682 16.07.09 17:34 Сейчас в теме
8. Санёк (Русский) 16.07.09 17:37 Сейчас в теме
(7) зато не надо ухищряться запросы писать :)
9. Serg Eli (elizarovs) 70 16.07.09 20:34 Сейчас в теме
(1)(2)Звиняйте, дядьку, описачка вышла. Бросил шаблончик и не исправил. Конечно, это только запрос, причем по нетиповой торговле.
(5)На выходных, постараюсь переписать под типовую УТ. Пока небольшой комментарий для тех кому нужно срочно: РегистрАптекПартии аналог ПартийТоваровНаСкладах, Аптека является складом. Параметр &Ничего = 0.
10. Serg Eli (elizarovs) 70 16.07.09 20:47 Сейчас в теме
(3) Систему Компоновки Данных недолюбливаю. Запрос - вещь универсальная, можешь воткнуть, куда хочется. Кодом, да через витуальную таблицу, пожалуй было бы еще легче и понятнее, но хотелось именно запросом. А запрос, зараза, ну очень вредничал. Главнае проблемы - заполнить данными даты, в которых не было движений и получить числовую последовательность не из готовой таблицы, которая обязательно окажется заполненной неправильно, а из числовой последовательности.
11. Петр (redgad) 81 18.07.09 08:40 Сейчас в теме
Как правило, такие запросы я строил до появления СКД следующим образом:
1. Получал данные по интересуюущему регистру
2. Брал какой либо регистр сведений, который заполнен на каждую дату(В типовых это могут быть или "КурсыВалют" или "Регламентированный производственный календарь")
3. Делал левое соединение с этим вспмогательный регистром
12. Сергей Лунев (luns) 26.08.09 08:38 Сейчас в теме
Автор выложи запрос для типовой конфы. Чтобы работало и на УТ и на УПП, ну скажем к регистру ТоварыНаСкладах.
13. Сергей Лунев (luns) 26.08.09 08:38 Сейчас в теме
Плюс авансом за интерес к теме. Но посмотрю только когда будет для типовой запрос.
14. Serg Eli (elizarovs) 70 26.08.09 11:11 Сейчас в теме
(13) Ок. А то без заинетересованных, не хотелось переделывать.
16. Cntgf dfghj (drandulet) 10.09.09 20:41 Сейчас в теме
Спасибо! Очень пригодилось
17. Дмитрий Никитин (grub) 6 14.05.10 16:15 Сейчас в теме
тут маленькая тонкость текущий запрос выдаёт только 36 дат у меня а квеличить количество ?!
18. Serg Eli (elizarovs) 70 15.05.10 14:13 Сейчас в теме
(17) Не сложно. В середине два цикла (дают t1 и t2) от 1 до 6. 6х6=36. Добавьте в обоих цифры до 9, чисел добавится. Более, чем 99 делать не советую, выборка будет долго работать, успеете соскучиться. )
Можете черкнуть в личку, пришлю образец на 99.
19. Alex (KulnevAM) 92 25.06.10 21:13 Сейчас в теме
20. Raider (raider-rec@ya.ru) 06.10.10 11:22 Сейчас в теме
Я б сказал ГОВНОКОДИЩЕ! :D
21. Artur (Artur88) 01.12.10 12:01 Сейчас в теме
22. Serg Eli (elizarovs) 70 08.12.10 13:16 Сейчас в теме
В публикации http://forum.infostart.ru/forum24/topic27133/ есть обработка, в которой для типовой Российской торговли оцениваются складские запасы и запрос по остаткам на складах там включен.
23. Марк (marku) 52 26.10.11 17:03 Сейчас в теме
Спасибо
как раз запрос и нужен
24. Федор Степанов (mij) 20 20.11.11 08:50 Сейчас в теме
Какая разница в принципе какой код если работает и то что нужно. Если делать самому то конечно по другому а если готовое то спасибо.