ФИФО в Запросе (с пояснениями для начинающих)

22.11.11

Разработка - Запросы

Статья призвана показать пример как реализовать ФИФО в запросе на произвольном примере для начинающих программистов.

Пример использования ФИФО в запросе.

Допустим есть поступление денежных средств на 100 рублей.
Сколько реализаций товаров оплачено, какую часть последнего документа оплатили?

Результат таблица

Реализация    СуммаДокумента    Оплата
1                    10                            10
2                    50                            50
3                    50                            40

ВЫБРАТЬ
   
1 КАК ПолеГруппировкиДляИтогов,
   
ВложенныйЗапрос.Ссылка,
   
ВложенныйЗапрос.СуммаДокумента КАК СуммаДокумента,
   
ВЫБОР
        КОГДА
ВложенныйЗапрос.НакапливаемыйИтог <= &Оплата
           
ТОГДА ВложенныйЗапрос.СуммаДокумента
        ИНАЧЕ ВложенныйЗапрос.СуммаДокумента + &Оплата - ВложенныйЗапрос.НакапливаемыйИтог
    КОНЕЦ КАК Оплата
ИЗ
    (ВЫБРАТЬ
       
РеализацияТоваровУслуг.Ссылка КАК Ссылка,
       
РеализацияТоваровУслуг.СуммаДокумента КАК СуммаДокумента,
       
СУММА(РеализацияТоваровУслугДляСуммирования.СуммаДокумента) КАК НакапливаемыйИтог
    ИЗ
       
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
            ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслугДляСуммирования
            ПО РеализацияТоваровУслуг.МоментВремени >= РеализацияТоваровУслугДляСуммирования.МоментВремени
    ГДЕ
       
РеализацияТоваровУслуг.Организация = &Организация
       
И РеализацияТоваровУслуг.Контрагент = &Контрагент
       
И РеализацияТоваровУслуг.ДоговорКонтрагента = &ДоговорКонтрагента
       
И РеализацияТоваровУслугДляСуммирования.Организация = &Организация
       
И РеализацияТоваровУслугДляСуммирования.Контрагент = &Контрагент
       
И РеализацияТоваровУслугДляСуммирования.ДоговорКонтрагента = &ДоговорКонтрагента

   
СГРУППИРОВАТЬ ПО
       
РеализацияТоваровУслуг.Ссылка,
       
РеализацияТоваровУслуг.СуммаДокумента) КАК ВложенныйЗапрос
ГДЕ
   
ВложенныйЗапрос.НакапливаемыйИтог - ВложенныйЗапрос.СуммаДокумента < &Оплата

УПОРЯДОЧИТЬ ПО
   
ВложенныйЗапрос.Ссылка.МоментВремени
ИТОГИ
   
СУММА(СуммаДокумента),
   
СУММА(Оплата)
ПО
   
ПолеГруппировкиДляИтогов

 


 

В запросе необходимо реализовать колонку, в которой будет накапливаться сумма предыдущих документов.

Строки, где Оплата < НакапливаемыйИтог и Оплата > (НакапливаемыйИтог - СуммаДок)  - это интересующие нас строки.

Собственно, самое сложное, добавить Колонку НакапливаемыйИтог.

ИЗ
        Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
            ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслугДляСуммирования
            ПО РеализацияТоваровУслуг.МоментВремени >= РеализацияТоваровУслугДляСуммирования.МоментВремени

Если не задать условия соединения к каждой строке одной таблицы будут присоединены все строки другой таблицы.

При условии

ПО РеализацияТоваровУслуг.МоментВремени >= РеализацияТоваровУслугДляСуммирования.МоментВремени

к одной строке присоединяются нужное нам количество строк.

ВЫБРАТЬ
        РеализацияТоваровУслуг.Ссылка КАК Ссылка,
        РеализацияТоваровУслуг.СуммаДокумента КАК СуммаДокумента,
        СУММА(РеализацияТоваровУслугДляСуммирования.СуммаДокумента) КАК НакапливаемыйИтог

ИЗ…

СГРУППИРОВАТЬ ПО
        РеализацияТоваровУслуг.Ссылка,
        РеализацияТоваровУслуг.СуммаДокумента

Суммируем строки 2-й таблицы и получаем НакапливаемыйИтог.

ВЫБРАТЬ
    1 КАК ПолеГруппировкиДляИтогов,
    ВложенныйЗапрос.Ссылка,
    ВложенныйЗапрос.СуммаДокумента КАК СуммаДокумента,
!    ВЫБОР
!        КОГДА ВложенныйЗапрос.НакапливаемыйИтог !            ТОГДА ВложенныйЗапрос.СуммаДокумента
!        ИНАЧЕ ВложенныйЗапрос.СуммаДокумента + &Оплата - ВложенныйЗапрос.НакапливаемыйИтог
!    КОНЕЦ КАК Оплата
ИЗ…

ИТОГИ
    СУММА(СуммаДокумента),
    СУММА(Оплата)
ПО
    ПолеГруппировкиДляИтогов

Вычислим разбиение общей оплаты к каждому документу

ИТОГИ

    СУММА(СуммаДокумента),
    СУММА(Оплата)
ПО
    ПолеГруппировкиДляИтогов

Итоги для визуальной наглядности корректной работы.

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

15500 руб.

02.09.2020    184667    1029    403    

967

Обновление 1С Запросы Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

Данный инструмент помогает анализировать доработанную конфигурацию после обновления на новый релиз и находить «битые» тексты запросов, в которых участвуют несуществующие в новом релизе метаданные.

2 стартмани

06.02.2025    2198    17    XilDen    26    

36

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

В статье приведена удобная возможность отладки исполняемого запроса динамического списка.

03.12.2024    5731    artemusII    11    

23

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    13135    sergey279    18    

66

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    8215    XilDen    36    

90

СКД Механизмы типовых конфигураций Запросы Программист Платформа 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    3191    PROSTO-1C    0    

23

Запросы Программист Запросы Бесплатно (free)

Отлаживая взаимодействие с базой данных, мы регулярно сталкиваемся с зависающими или подозрительно долго выполняющимися обращениями, негативно влияющими на производительность. О том, как в PostgreSQL выявить подозрительные запросы, основываясь на доступной о них информации, расскажем в статье.

16.08.2024    10797    user1840182    5    

29
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. igor_aviant 22.11.11 17:21 Сейчас в теме
1. ошибка в строке запроса
КОГДА ВложенныйЗапрос.НакапливаемыйИтог &Оплата
2. А можно как-то описать задачу которую решает этот запрос.
Фраза "ФИФО в запросе" - ни о чем не говорит!
2. Поручик 4674 23.11.11 07:40 Сейчас в теме
Для начинающих ещё статья ФИФО для любопытных http://infostart.ru/public/68225/
3. anig99 2855 23.11.11 08:49 Сейчас в теме
Действительно. Нужно дать ссылки на полный комплект статей.
Ещё были статья моя про оптимизацию и ещё пара статей про ФИФО
4. anig99 2855 23.11.11 08:55 Сейчас в теме
И ещё скриншот крутой... С не отключенной проверкой орфографии
5. S_DS 23.11.11 09:19 Сейчас в теме
6. S_DS 23.11.11 09:26 Сейчас в теме
А по ЛИФО также? а по среднему как?
7. dumal 23.11.11 10:14 Сейчас в теме
На мой взгляд, наиболее полно эта тема разобрана в видеолекциях Павла Чистова. Кстати, они доступны для бесплатного скачивания.

А по ЛИФО также? а по среднему как?


По ЛИФО будет почти все то же самое, только упорядочивание не по возрастанию, а по убыванию. По среднему алгоритм расчета будет совсем другой
8. Ish_2 1115 23.11.11 14:00 Сейчас в теме
Пока неинтересно. Пример тривиальный , избитый по постановке задачи.
Интерес появится если статья будет начинаться :
Допустим есть поступления денежных средств : 
Документ 1 - 20 р.
Документ 2 - 30 р.
Документ 3 - 50 р. 
Нужно по методу Фифо распределить эту оплату по документам реализации :
Реализация 1 - 40р
Реализация 1 - 30р
Реализация 1 - 50р

Если автор дерзнет реализовать в одном запросе - обсудим.
JohnyDeath; SedovSU@mail.ru; Sun_Storm; glazrom; toxicoff; afk; +6 Ответить
11. yavedmin 121 24.11.11 13:34 Сейчас в теме
12. tormozit 7272 24.11.11 15:28 Сейчас в теме
(8) Такая задача в общем случае одним конечным запросом не решается, т.к. имеет только циклическое алгоритмическое решение (с зависимостью каждого прохода от предыдущего и неизвестным заранее их числом).
13. Ish_2 1115 24.11.11 18:09 Сейчас в теме
(12) Такая задача решается в общем случае одним конечным запросом. Пример того как это делается
http://infostart.ru/public/68225/
14. tormozit 7272 24.11.11 21:59 Сейчас в теме
(13) Признаю, я ошибся. Твоя статья хороша.
15. Ish_2 1115 24.11.11 22:10 Сейчас в теме
(14) Становись в очередь. Вначале я должен признать правоту Anig99.
Дело давнее - он написал несколько статей о нарастающих итогах,
довольно невнятных и сумбурных. Но в целом-то оказался прав !
Статья "Фифо.." завершает наш с ним диалог.
16. AlexO 136 27.11.11 02:20 Сейчас в теме
(8) Ish_2,
на самом деле, вся соль - как реализовать именно универсальный механизм, когда оплата неравномерна с первого же документа...
(9) Artemuch2,
да, вот такие "спецы" и получаются - что-то там для себя делают, ничего общего с реальностью не имеющего. Пример - на "спецах" не нужна проверка дублирующих документов... массовая ошибка начинающих бухгалтеров..
после этого я на всех 1с-ых спецах поставил жирный крестик...
(15) Ish_2,
так где статьи-то спорные? ))
привели бы уже список, тем более - так жарко, как пишите, обсуждали ))
17. Ish_2 1115 27.11.11 13:21 Сейчас в теме
(16) Хм.. Все комментарии читаете ?
В третий уже раз (пардон!) в этой теме http://infostart.ru/public/68225/
Задача из (8) там решена.
В этой теме есть ссылки и на пред . публикации
9. Artemuch2 23.11.11 17:57 Сейчас в теме
Это стандартный механизм, работу с которым нужно знать при сдаче на спеца по 1С
10. rodoz32 24.11.11 12:19 Сейчас в теме
Да,Спец-тяжёлая штука,получить азы бы программирования для начала....
18. Lex1C 02.12.11 11:15 Сейчас в теме
Непонятно, зачем такие статьи вообще публиковать.
19. yavedmin 121 02.12.11 15:35 Сейчас в теме
(18)(18) Lex1C, Для начинающих программистов
20. Yury1001 1474 07.12.11 10:59 Сейчас в теме
Спасибо за публикацию - вдохновила меня на работу: Прайс-лист в две колонки на СКД.
21. Tanis 04.09.13 14:09 Сейчас в теме
Добрый день!
Что нужно дописать, чтоб документы оплаты еще подбирало, и так же их распределяло?
22. Multik 33 26.09.13 10:27 Сейчас в теме
Объясните плиз, а за "оплату", что берете?
23. dreamcreal 31.10.16 04:09 Сейчас в теме
Здравствуйте.
Значение параметра &Оплата откуда берется?
Вбивается пользователем?
24. yavedmin 121 08.11.16 02:34 Сейчас в теме
(23) dreamcreal, Здравствуйте. Да. Это тестовый пример для демонстрации принципа работы. В реальной жизни чаще встречается Таблица на таблицу. Это обсуждалось выше в комментариях.:

13. Игорь Исхаков (Ish_2) 24.11.2011 18:09
(12) Такая задача решается в общем случае одним конечным запросом. Пример того как это делается
http://infostart.ru/public/68225/
Оставьте свое сообщение