Как получить начальный и конечный остаток без виртуальных таблиц?Виртуальные таблицы не подходят из-за того,что нужны остатки в разрезе того,что нет в регистрах накопления.
Пробую сделать так, как в этой статье: https://its.1c.ru/db/metod8dev/content/4049/hdoc , но выдает не корректную информацию.
Буду очень,если кто-то сможет скинуть пример запроса.
выбрать товар, сумма(
выбор когда видДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) тогда 1
иначе -1 конец * количество) КАК НачОст
где Период <&ДатаНачальногоОстатка
и Регистратор.ТорговаяТочка = &тт
ВЫБРАТЬ
РасходТовара.Ссылка КАК РасходныйДокумент,
РасходТовара.Дата КАК ПериодРасходногоДокумента,
РасходТовара.СуммаДокумента КАК СуммаРасходногоДокумента
ПОМЕСТИТЬ РасходныеДокументы
ИЗ
Документ.РеализацияТоваровУслуг КАК РасходТовара
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеДенег
ПО (ПоступлениеДенег.Ссылка = РасходТовара.Ссылка)
И (ПоступлениеДенег.Дата < &НачалоПериода)
ГДЕ
РасходТовара.Дата < &НачалоПериода
СГРУППИРОВАТЬ ПО
РасходТовара.Ссылка,
РасходТовара.Дата,
РасходТовара.СуммаДокумента
ИМЕЮЩИЕ
МАКСИМУМ(РасходТовара.СуммаДокумента) - ЕСТЬNULL(СУММА(ПоступлениеДенег.СуммаДокумента), 0) <> 0
ОБЪЕДИНИТЬ
ВЫБРАТЬ
РасходТовара.Ссылка,
РасходТовара.Дата,
РасходТовара.СуммаДокумента
ИЗ
Документ.РеализацияТоваровУслуг КАК РасходТовара
ГДЕ
РасходТовара.Дата >= НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И РасходТовара.Дата <= КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВЫБОР
КОГДА ВложенныйЗапрос.Период < НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
ТОГДА НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
ИНАЧЕ ВложенныйЗапрос.Период
КОНЕЦ КАК Период,
ЕСТЬNULL(СУММА(ВЫБОР
КОГДА ВложенныйЗапрос.Период >= НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
ТОГДА ВложенныйЗапрос.СуммаРасходныхДокументов
КОНЕЦ), 0) КАК СуммаРасходныхДокументов,
ЕСТЬNULL(СУММА(ВЫБОР
КОГДА ВложенныйЗапрос.Период >= НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
ТОГДА ВложенныйЗапрос.СуммаПоступления
КОНЕЦ), 0) КАК СуммаПоступления,
ВложенныйЗапрос.РасходныйДокументПокупатель
ПОМЕСТИТЬ ДатыДвижений
ИЗ
(ВЫБРАТЬ
НАЧАЛОПЕРИОДА(РасходныеДокументы.ПериодРасходногоДокумента, ДЕНЬ) КАК Период,
РасходныеДокументы.СуммаРасходногоДокумента КАК СуммаРасходныхДокументов,
0 КАК СуммаПоступления,
РасходныеДокументы.РасходныйДокумент.Контрагент КАК РасходныйДокументПокупатель
ИЗ
РасходныеДокументы КАК РасходныеДокументы
ОБЪЕДИНИТЬ
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(ПоступлениеДенег.Дата, ДЕНЬ),
0,
ПоступлениеДенег.СуммаДокумента,
ПоступлениеДенег.Ссылка.Контрагент
ИЗ
Документ.ПоступлениеТоваровУслуг КАК ПоступлениеДенег
ГДЕ
ПоступлениеДенег.Дата >= НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
И ПоступлениеДенег.Дата <= КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ)) КАК ВложенныйЗапрос
СГРУППИРОВАТЬ ПО
ВложенныйЗапрос.РасходныйДокументПокупатель,
ВЫБОР
КОГДА ВложенныйЗапрос.Период < НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
ТОГДА НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
ИНАЧЕ ВложенныйЗапрос.Период
КОНЕЦ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВременныйЗапрос.РасходныйДокументПокупатель,
СУММА(ВременныйЗапрос.НачальныйОстаток) КАК НачальныйОстаток,
МАКСИМУМ(ДатыДвижений.СуммаРасходныхДокументов) КАК СуммаРасходныхДокументов,
МАКСИМУМ(ДатыДвижений.СуммаПоступления) КАК СуммаПоступления,
СУММА(ВременныйЗапрос.НачальныйОстаток) + МАКСИМУМ(ДатыДвижений.СуммаРасходныхДокументов) - МАКСИМУМ(ДатыДвижений.СуммаПоступления) КАК КонечныйОстаток
ИЗ
(ВЫБРАТЬ
ДатыДвижений.Период КАК Период,
РасходныеДокументы.РасходныйДокумент КАК РасходныйДокумент,
ЕСТЬNULL(МАКСИМУМ(РасходныеДокументы.СуммаРасходногоДокумента) - ЕСТЬNULL(СУММА(ПоступлениеДенег.СуммаДокумента), 0), 0) КАК НачальныйОстаток,
ДатыДвижений.РасходныйДокументПокупатель КАК РасходныйДокументПокупатель
ИЗ
ДатыДвижений КАК ДатыДвижений
ЛЕВОЕ СОЕДИНЕНИЕ РасходныеДокументы КАК РасходныеДокументы
ПО (РасходныеДокументы.ПериодРасходногоДокумента < ДатыДвижений.Период)
И ДатыДвижений.РасходныйДокументПокупатель = РасходныеДокументы.РасходныйДокумент.Контрагент
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеДенег
ПО (ПоступлениеДенег.Дата < ДатыДвижений.Период)
И (РасходныеДокументы.РасходныйДокумент = ПоступлениеДенег.Ссылка)
СГРУППИРОВАТЬ ПО
ДатыДвижений.Период,
РасходныеДокументы.РасходныйДокумент,
ДатыДвижений.РасходныйДокументПокупатель) КАК ВременныйЗапрос
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДатыДвижений КАК ДатыДвижений
ПО ВременныйЗапрос.Период = ДатыДвижений.Период
И ВременныйЗапрос.РасходныйДокументПокупатель = ДатыДвижений.РасходныйДокументПокупатель
СГРУППИРОВАТЬ ПО
ВременныйЗапрос.РасходныйДокументПокупатель
(3)там же еще есть документы,которые нужно вычитать, а не суммировать.
Так тоже попробовал,но выводит также не корректные данные:
ВЫБРАТЬ
СУММА(РеализацияТоваровУслуг.СуммаДокумента) КАК РТУСумма,
NULL КАК ПоступлениеСумма,
РеализацияТоваровУслуг.ТорговаяТочка КАК ТорговаяТочка,
РеализацияТоваровУслуг.Ссылка КАК Документ
ПОМЕСТИТЬ ВТ_Начало
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
РеализацияТоваровУслуг.ТорговаяТочка = &ТорговаяТочка
И РеализацияТоваровУслуг.Дата < НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ)
СГРУППИРОВАТЬ ПО
РеализацияТоваровУслуг.ТорговаяТочка,
РеализацияТоваровУслуг.Ссылка
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
NULL,
СУММА(ПоступлениеТоваровУслуг.СуммаДокумента),
ПоступлениеТоваровУслуг.ТорговаяТочка,
ПоступлениеТоваровУслуг.Ссылка
ИЗ
Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
ГДЕ
ПоступлениеТоваровУслуг.ТорговаяТочка = &ТорговаяТочка
И ПоступлениеТоваровУслуг.Дата < НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ)
СГРУППИРОВАТЬ ПО
ПоступлениеТоваровУслуг.ТорговаяТочка,
ПоступлениеТоваровУслуг.Ссылка
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
СУММА(РеализацияТоваровУслуг.СуммаДокумента) КАК РТУСумма,
NULL КАК ПоступлениеСумма,
РеализацияТоваровУслуг.ТорговаяТочка КАК ТорговаяТочка,
РеализацияТоваровУслуг.Ссылка КАК Документ
ПОМЕСТИТЬ ВТ_Конец
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
РеализацияТоваровУслуг.ТорговаяТочка = &ТорговаяТочка
И РеализацияТоваровУслуг.Дата < КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ)
СГРУППИРОВАТЬ ПО
РеализацияТоваровУслуг.ТорговаяТочка,
РеализацияТоваровУслуг.Ссылка
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
NULL,
СУММА(ПоступлениеТоваровУслуг.СуммаДокумента),
ПоступлениеТоваровУслуг.ТорговаяТочка,
ПоступлениеТоваровУслуг.Ссылка
ИЗ
Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
ГДЕ
ПоступлениеТоваровУслуг.ТорговаяТочка = &ТорговаяТочка
И ПоступлениеТоваровУслуг.Дата < КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ)
СГРУППИРОВАТЬ ПО
ПоступлениеТоваровУслуг.ТорговаяТочка,
ПоступлениеТоваровУслуг.Ссылка
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
СУММА(ЕСТЬNULL(ВТ_Начало.РТУСумма, 0) - ЕСТЬNULL(ВТ_Начало.ПоступлениеСумма, 0)) КАК НачальныйОстаток,
СУММА(ЕСТЬNULL(ВТ_Конец.РТУСумма, 0) - ЕСТЬNULL(ВТ_Конец.ПоступлениеСумма, 0)) КАК КонечныйОстаток,
ВТ_Конец.ТорговаяТочка
ИЗ
ВТ_Начало КАК ВТ_Начало
ПОЛНОЕ СОЕДИНЕНИЕ ВТ_Конец КАК ВТ_Конец
ПО ВТ_Начало.ТорговаяТочка = ВТ_Конец.ТорговаяТочка
СГРУППИРОВАТЬ ПО
ВТ_Конец.ТорговаяТочка
Типа
выбрать товар, сумма(
выбор когда видДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) тогда 1
иначе -1 конец * количество) КАК НачОст
где Период <&ДатаНачальногоОстатка
(5)не понял.
В регистрах накопления нет реквизита "Торговая точка", а мне нужно получить начальный и конечный остаток в разрезе торговой точки.
Сможете привести пример,как получить начальный и конечный остаток, например на примере примере документов Реализация товаров и услуг и Поступление товаров и услуг? В этих документах есть реквизит "торговая точка".
выбрать товар, сумма(
выбор когда видДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) тогда 1
иначе -1 конец * количество) КАК НачОст
где Период <&ДатаНачальногоОстатка
и Регистратор.ТорговаяТочка = &тт
(8)сделал так,но выводит не корректные данные . в десятки раз преувеличивает:
ВЫБРАТЬ
СУММА(ВЫБОР
КОГДА ВзаиморасчетыСКонтрагентами.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
ТОГДА ВзаиморасчетыСКонтрагентами.СуммаВзаиморасчетов
ИНАЧЕ -ЕСТЬNULL(ВзаиморасчетыСКонтрагентами.СуммаВзаиморасчетов, 0)
КОНЕЦ) КАК СуммаВзаиморасчетов
ИЗ
РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами
ГДЕ
(ВзаиморасчетыСКонтрагентами.Регистратор.ТорговаяТочка = &ТорговаяТочка
ИЛИ ВзаиморасчетыСКонтрагентами.Регистратор.СуммыДолга.ДокументРасчетовСКонтрагентом.ТорговаяТочка = &ТорговаяТочка)
И ВзаиморасчетыСКонтрагентами.Период < КОНЕЦПЕРИОДА(&ДатаНачальногоОстатка, ДЕНЬ)