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

22.11.11

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

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

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

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

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

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

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

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

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

 


 

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

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

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

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

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

При условии

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

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

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

ИЗ…

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

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

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

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

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

ИТОГИ

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

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

См. также

SALE! 15%

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

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159391    872    399    

861

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

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

18.10.2024    9869    sergey279    18    

64

Запросы Программист Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

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

11.10.2024    5164    XilDen    36    

80

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

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

16.08.2024    7898    user1840182    5    

28

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2393    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    8684    implecs_team    6    

47

Запросы Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    3391    andrey_sag    10    

36
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. igor_aviant 22.11.11 17:21 Сейчас в теме
1. ошибка в строке запроса
КОГДА ВложенныйЗапрос.НакапливаемыйИтог &Оплата
2. А можно как-то описать задачу которую решает этот запрос.
Фраза "ФИФО в запросе" - ни о чем не говорит!
2. Поручик 4692 23.11.11 07:40 Сейчас в теме
Для начинающих ещё статья ФИФО для любопытных http://infostart.ru/public/68225/
3. anig99 2852 23.11.11 08:49 Сейчас в теме
Действительно. Нужно дать ссылки на полный комплект статей.
Ещё были статья моя про оптимизацию и ещё пара статей про ФИФО
4. anig99 2852 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 1112 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 7229 24.11.11 15:28 Сейчас в теме
(8) Такая задача в общем случае одним конечным запросом не решается, т.к. имеет только циклическое алгоритмическое решение (с зависимостью каждого прохода от предыдущего и неизвестным заранее их числом).
13. Ish_2 1112 24.11.11 18:09 Сейчас в теме
(12) Такая задача решается в общем случае одним конечным запросом. Пример того как это делается
http://infostart.ru/public/68225/
14. tormozit 7229 24.11.11 21:59 Сейчас в теме
(13) Признаю, я ошибся. Твоя статья хороша.
15. Ish_2 1112 24.11.11 22:10 Сейчас в теме
(14) Становись в очередь. Вначале я должен признать правоту Anig99.
Дело давнее - он написал несколько статей о нарастающих итогах,
довольно невнятных и сумбурных. Но в целом-то оказался прав !
Статья "Фифо.." завершает наш с ним диалог.
16. AlexO 135 27.11.11 02:20 Сейчас в теме
(8) Ish_2,
на самом деле, вся соль - как реализовать именно универсальный механизм, когда оплата неравномерна с первого же документа...
(9) Artemuch2,
да, вот такие "спецы" и получаются - что-то там для себя делают, ничего общего с реальностью не имеющего. Пример - на "спецах" не нужна проверка дублирующих документов... массовая ошибка начинающих бухгалтеров..
после этого я на всех 1с-ых спецах поставил жирный крестик...
(15) Ish_2,
так где статьи-то спорные? ))
привели бы уже список, тем более - так жарко, как пишите, обсуждали ))
17. Ish_2 1112 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 1472 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/
Оставьте свое сообщение