gifts2017

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

Опубликовал 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) 16.07.09 16:34
(3) Это для вывода но не для расчета.
5. Дмитрий Глух (IronDemon) 16.07.09 16:38
Автор, запросы нужно выкладывать которые пойдут в типовых конфигурациях без изменений.
6. Санёк (Русский) 16.07.09 17:07
(4) Можно запихать результат работы СКД в универсальную коллекцию и уже с ней маневрировать чего-нить.
7. Дмитрий Глух (IronDemon) 16.07.09 17:34
8. Санёк (Русский) 16.07.09 17:37
(7) зато не надо ухищряться запросы писать :)
9. Serg Eli (elizarovs) 16.07.09 20:34
(1)(2)Звиняйте, дядьку, описачка вышла. Бросил шаблончик и не исправил. Конечно, это только запрос, причем по нетиповой торговле.
(5)На выходных, постараюсь переписать под типовую УТ. Пока небольшой комментарий для тех кому нужно срочно: РегистрАптекПартии аналог ПартийТоваровНаСкладах, Аптека является складом. Параметр &Ничего = 0.
10. Serg Eli (elizarovs) 16.07.09 20:47
(3) Систему Компоновки Данных недолюбливаю. Запрос - вещь универсальная, можешь воткнуть, куда хочется. Кодом, да через витуальную таблицу, пожалуй было бы еще легче и понятнее, но хотелось именно запросом. А запрос, зараза, ну очень вредничал. Главнае проблемы - заполнить данными даты, в которых не было движений и получить числовую последовательность не из готовой таблицы, которая обязательно окажется заполненной неправильно, а из числовой последовательности.
11. Петр (redgad) 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) 26.08.09 11:11
(13) Ок. А то без заинетересованных, не хотелось переделывать.
16. Cntgf dfghj (drandulet) 10.09.09 20:41
Спасибо! Очень пригодилось
17. Дмитрий Никитин (grub) 14.05.10 16:15
тут маленькая тонкость текущий запрос выдаёт только 36 дат у меня а квеличить количество ?!
18. Serg Eli (elizarovs) 15.05.10 14:13
(17) Не сложно. В середине два цикла (дают t1 и t2) от 1 до 6. 6х6=36. Добавьте в обоих цифры до 9, чисел добавится. Более, чем 99 делать не советую, выборка будет долго работать, успеете соскучиться. )
Можете черкнуть в личку, пришлю образец на 99.
19. Alex (KulnevAM) 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) 08.12.10 13:16
В публикации http://forum.infostart.ru/forum24/topic27133/ есть обработка, в которой для типовой Российской торговли оцениваются складские запасы и запрос по остаткам на складах там включен.
23. Марк (marku) 26.10.11 17:03
Спасибо
как раз запрос и нужен
24. Федор Степанов (mij) 20.11.11 08:50
Какая разница в принципе какой код если работает и то что нужно. Если делать самому то конечно по другому а если готовое то спасибо.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа