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

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

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

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

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

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

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

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

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

 


 

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

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

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

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

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

При условии

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

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

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

ИЗ…

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

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

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

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

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

ИТОГИ

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

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

24 Comments

  1. igor_aviant

    1. ошибка в строке запроса

    КОГДА ВложенныйЗапрос.НакапливаемыйИтог &Оплата

    2. А можно как-то описать задачу которую решает этот запрос.

    Фраза «ФИФО в запросе» — ни о чем не говорит!

    Reply
  2. Поручик

    Для начинающих ещё статья ФИФО для любопытных http://infostart.ru/public/68225/

    Reply
  3. anig99

    Действительно. Нужно дать ссылки на полный комплект статей.

    Ещё были статья моя про оптимизацию и ещё пара статей про ФИФО

    Reply
  4. anig99

    И ещё скриншот крутой… С не отключенной проверкой орфографии

    Reply
  5. S_DS

    Прикольно!

    Reply
  6. S_DS

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

    Reply
  7. dumal

    На мой взгляд, наиболее полно эта тема разобрана в видеолекциях Павла Чистова. Кстати, они доступны для бесплатного скачивания.

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

    По ЛИФО будет почти все то же самое, только упорядочивание не по возрастанию, а по убыванию. По среднему алгоритм расчета будет совсем другой

    Reply
  8. Ish_2

    Пока неинтересно. Пример тривиальный , избитый по постановке задачи.

    Интерес появится если статья будет начинаться :

    Допустим есть поступления денежных средств :
    Документ 1 — 20 р.
    Документ 2 — 30 р.
    Документ 3 — 50 р.
    Нужно по методу Фифо распределить эту оплату по документам реализации :
    Реализация 1 — 40р
    Реализация 1 — 30р
    Реализация 1 — 50р

    Если автор дерзнет реализовать в одном запросе — обсудим.

    Reply
  9. Artemuch2

    Это стандартный механизм, работу с которым нужно знать при сдаче на спеца по 1С

    Reply
  10. rodoz32

    Да,Спец-тяжёлая штука,получить азы бы программирования для начала….

    Reply
  11. yavedmin

    (8) Ish_2, Заинтересовало.

    Reply
  12. tormozit

    (8) Такая задача в общем случае одним конечным запросом не решается, т.к. имеет только циклическое алгоритмическое решение (с зависимостью каждого прохода от предыдущего и неизвестным заранее их числом).

    Reply
  13. Ish_2

    (12) Такая задача решается в общем случае одним конечным запросом. Пример того как это делается

    http://infostart.ru/public/68225/

    Reply
  14. tormozit

    (13) Признаю, я ошибся. Твоя статья хороша.

    Reply
  15. Ish_2

    (14) Становись в очередь. Вначале я должен признать правоту Anig99.

    Дело давнее — он написал несколько статей о нарастающих итогах,

    довольно невнятных и сумбурных. Но в целом-то оказался прав !

    Статья «Фифо..» завершает наш с ним диалог.

    Reply
  16. AlexO

    (8) Ish_2,

    на самом деле, вся соль — как реализовать именно универсальный механизм, когда оплата неравномерна с первого же документа…

    (9) Artemuch2,

    да, вот такие «спецы» и получаются — что-то там для себя делают, ничего общего с реальностью не имеющего. Пример — на «спецах» не нужна проверка дублирующих документов… массовая ошибка начинающих бухгалтеров..

    после этого я на всех 1с-ых спецах поставил жирный крестик…

    (15) Ish_2,

    так где статьи-то спорные? ))

    привели бы уже список, тем более — так жарко, как пишите, обсуждали ))

    Reply
  17. Ish_2

    (16) Хм.. Все комментарии читаете ?

    В третий уже раз (пардон!) в этой теме http://infostart.ru/public/68225/

    Задача из (8) там решена.

    В этой теме есть ссылки и на пред . публикации

    Reply
  18. Lex1C

    Непонятно, зачем такие статьи вообще публиковать.

    Reply
  19. yavedmin

    (18)(18) Lex1C, Для начинающих программистов

    Reply
  20. Yury1001

    Спасибо за публикацию — вдохновила меня на работу: Прайс-лист в две колонки на СКД.

    Reply
  21. Tanis

    Добрый день!

    Что нужно дописать, чтоб документы оплаты еще подбирало, и так же их распределяло?

    Reply
  22. Multik

    Объясните плиз, а за «оплату», что берете?

    Reply
  23. dreamcreal

    Здравствуйте.

    Значение параметра &Оплата откуда берется?

    Вбивается пользователем?

    Reply
  24. yavedmin

    (23) dreamcreal, Здравствуйте. Да. Это тестовый пример для демонстрации принципа работы. В реальной жизни чаще встречается Таблица на таблицу. Это обсуждалось выше в комментариях.:

    13. Игорь Исхаков (Ish_2) 24.11.2011 18:09

    (12) Такая задача решается в общем случае одним конечным запросом. Пример того как это делается

    http://infostart.ru/public/68225/

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *