Пример использования ФИФО в запросе.
Допустим есть поступление денежных средств на 100 рублей.
Сколько реализаций товаров оплачено, какую часть последнего документа оплатили?
Результат таблица
Реализация СуммаДокумента Оплата
1 10 10
2 50 50
3 50 40
ВЫБРАТЬ
1 КАК ПолеГруппировкиДляИтогов,
ВложенныйЗапрос.Ссылка,
ВложенныйЗапрос.СуммаДокумента КАК СуммаДокумента,
ВЫБОР
КОГДА ВложенныйЗапрос.НакапливаемыйИтог <= &Оплата
ТОГДА ВложенныйЗапрос.СуммаДокумента
ИНАЧЕ ВложенныйЗапрос.СуммаДокумента + &Оплата — ВложенныйЗапрос.НакапливаемыйИтог
КОНЕЦ КАК Оплата
ИЗ
(ВЫБРАТЬ
РеализацияТоваровУслуг.Ссылка КАК Ссылка,
РеализацияТоваровУслуг.СуммаДокумента КАК СуммаДокумента,
СУММА(РеализацияТоваровУслугДляСуммирования.СуммаДокумента) КАК НакапливаемыйИтог
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслугДляСуммирования
ПО РеализацияТоваровУслуг.МоментВремени >= РеализацияТоваровУслугДляСуммирования.МоментВремени
ГДЕ
РеализацияТоваровУслуг.Организация = &Организация
И РеализацияТоваровУслуг.Контрагент = &Контрагент
И РеализацияТоваровУслуг.ДоговорКонтрагента = &ДоговорКонтрагента
И РеализацияТоваровУслугДляСуммирования.Организация = &Организация
И РеализацияТоваровУслугДляСуммирования.Контрагент = &Контрагент
И РеализацияТоваровУслугДляСуммирования.ДоговорКонтрагента = &ДоговорКонтрагента
СГРУППИРОВАТЬ ПО
РеализацияТоваровУслуг.Ссылка,
РеализацияТоваровУслуг.СуммаДокумента) КАК ВложенныйЗапрос
ГДЕ
ВложенныйЗапрос.НакапливаемыйИтог — ВложенныйЗапрос.СуммаДокумента < &Оплата
УПОРЯДОЧИТЬ ПО
ВложенныйЗапрос.Ссылка.МоментВремени
ИТОГИ
СУММА(СуммаДокумента),
СУММА(Оплата)
ПО
ПолеГруппировкиДляИтогов
В запросе необходимо реализовать колонку, в которой будет накапливаться сумма предыдущих документов.
Строки, где Оплата < НакапливаемыйИтог и Оплата > (НакапливаемыйИтог — СуммаДок) — это интересующие нас строки.
Собственно, самое сложное, добавить Колонку НакапливаемыйИтог.
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслугДляСуммирования
ПО РеализацияТоваровУслуг.МоментВремени >= РеализацияТоваровУслугДляСуммирования.МоментВремени
Если не задать условия соединения к каждой строке одной таблицы будут присоединены все строки другой таблицы.
При условии
ПО РеализацияТоваровУслуг.МоментВремени >= РеализацияТоваровУслугДляСуммирования.МоментВремени
к одной строке присоединяются нужное нам количество строк.
ВЫБРАТЬ
РеализацияТоваровУслуг.Ссылка КАК Ссылка,
РеализацияТоваровУслуг.СуммаДокумента КАК СуммаДокумента,
СУММА(РеализацияТоваровУслугДляСуммирования.СуммаДокумента) КАК НакапливаемыйИтог
ИЗ…
СГРУППИРОВАТЬ ПО
РеализацияТоваровУслуг.Ссылка,
РеализацияТоваровУслуг.СуммаДокумента
Суммируем строки 2-й таблицы и получаем НакапливаемыйИтог.
ВЫБРАТЬ
1 КАК ПолеГруппировкиДляИтогов,
ВложенныйЗапрос.Ссылка,
ВложенныйЗапрос.СуммаДокумента КАК СуммаДокумента,
! ВЫБОР
! КОГДА ВложенныйЗапрос.НакапливаемыйИтог ! ТОГДА ВложенныйЗапрос.СуммаДокумента
! ИНАЧЕ ВложенныйЗапрос.СуммаДокумента + &Оплата — ВложенныйЗапрос.НакапливаемыйИтог
! КОНЕЦ КАК Оплата
ИЗ…
ИТОГИ
СУММА(СуммаДокумента),
СУММА(Оплата)
ПО
ПолеГруппировкиДляИтогов
Вычислим разбиение общей оплаты к каждому документу
ИТОГИ
СУММА(СуммаДокумента),
СУММА(Оплата)
ПО
ПолеГруппировкиДляИтогов
Итоги для визуальной наглядности корректной работы.
1. ошибка в строке запроса
КОГДА ВложенныйЗапрос.НакапливаемыйИтог &Оплата
2. А можно как-то описать задачу которую решает этот запрос.
Фраза «ФИФО в запросе» — ни о чем не говорит!
Для начинающих ещё статья ФИФО для любопытныхhttp://infostart.ru/public/68225/
Действительно. Нужно дать ссылки на полный комплект статей.
Ещё были статья моя про оптимизацию и ещё пара статей про ФИФО
И ещё скриншот крутой… С не отключенной проверкой орфографии
Прикольно!
А по ЛИФО также? а по среднему как?
На мой взгляд, наиболее полно эта тема разобрана в видеолекциях Павла Чистова. Кстати, они доступны для бесплатного скачивания.
По ЛИФО будет почти все то же самое, только упорядочивание не по возрастанию, а по убыванию. По среднему алгоритм расчета будет совсем другой
Пока неинтересно. Пример тривиальный , избитый по постановке задачи.
Интерес появится если статья будет начинаться :
Если автор дерзнет реализовать в одном запросе — обсудим.
Это стандартный механизм, работу с которым нужно знать при сдаче на спеца по 1С
Да,Спец-тяжёлая штука,получить азы бы программирования для начала….
(8) Ish_2, Заинтересовало.
(8) Такая задача в общем случае одним конечным запросом не решается, т.к. имеет только циклическое алгоритмическое решение (с зависимостью каждого прохода от предыдущего и неизвестным заранее их числом).
(12) Такая задача решается в общем случае одним конечным запросом. Пример того как это делается
http://infostart.ru/public/68225/
(13) Признаю, я ошибся. Твоя статья хороша.
(14) Становись в очередь. Вначале я должен признать правоту Anig99.
Дело давнее — он написал несколько статей о нарастающих итогах,
довольно невнятных и сумбурных. Но в целом-то оказался прав !
Статья «Фифо..» завершает наш с ним диалог.
(8) Ish_2,
на самом деле, вся соль — как реализовать именно универсальный механизм, когда оплата неравномерна с первого же документа…
(9) Artemuch2,
да, вот такие «спецы» и получаются — что-то там для себя делают, ничего общего с реальностью не имеющего. Пример — на «спецах» не нужна проверка дублирующих документов… массовая ошибка начинающих бухгалтеров..
после этого я на всех 1с-ых спецах поставил жирный крестик…
(15) Ish_2,
так где статьи-то спорные? ))
привели бы уже список, тем более — так жарко, как пишите, обсуждали ))
(16) Хм.. Все комментарии читаете ?
http://infostart.ru/public/68225/
В третий уже раз (пардон!) в этой теме
Задача из (8) там решена.
В этой теме есть ссылки и на пред . публикации
Непонятно, зачем такие статьи вообще публиковать.
(18)(18) Lex1C, Для начинающих программистов
Спасибо за публикацию — вдохновила меня на работу: Прайс-лист в две колонки на СКД.
Добрый день!
Что нужно дописать, чтоб документы оплаты еще подбирало, и так же их распределяло?
Объясните плиз, а за «оплату», что берете?
Здравствуйте.
Значение параметра &Оплата откуда берется?
Вбивается пользователем?
(23) dreamcreal, Здравствуйте. Да. Это тестовый пример для демонстрации принципа работы. В реальной жизни чаще встречается Таблица на таблицу. Это обсуждалось выше в комментариях.:
13. Игорь Исхаков (Ish_2) 24.11.2011 18:09
http://infostart.ru/public/68225/
(12) Такая задача решается в общем случае одним конечным запросом. Пример того как это делается