gifts2017

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

Опубликовал Артур Трушкин (yavedmin) в раздел Программирование - Практика программирования

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

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

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

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

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

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

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

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

 


 

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

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

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

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

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

При условии

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

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

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

ИЗ…

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

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

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

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

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

ИТОГИ

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

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

См. также

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

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


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

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

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