8.х Как получить остатки ДС по хоз. операции если она не является измерением!?

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем web.num, 21 май 2015.

  1. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Код:
    // Выборка движений с группировками, можно модифицировать на случай "укрупнения" выборки
    ВЫБРАТЬ РАЗЛИЧНЫЕ
        ДенежныеСредства.Период КАК Период,
        ДенежныеСредства.Касса КАК Касса,
        ДенежныеСредства.Регистратор КАК Регистратор,
        ДенежныеСредства.ХозяйственнаяОперация,
        ДенежныеСредства.Заказ,
        СУММА(ВЫБОР
            КОГДА ДенежныеСредства.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
                ТОГДА ДенежныеСредства.Сумма
            ИНАЧЕ 0
        КОНЕЦ) КАК СуммаПриход,
        СУММА(ВЫБОР
            КОГДА ДенежныеСредства.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
                ТОГДА ДенежныеСредства.Сумма
            ИНАЧЕ 0
        КОНЕЦ) КАК СуммаРасход
    ПОМЕСТИТЬ ВТ_ВыборкаИзРегистра
    ИЗ
        РегистрНакопления.ДенежныеСредстваНаличные КАК ДенежныеСредства
    ГДЕ
        ДенежныеСредства.Период МЕЖДУ &НачалоПериода И &КонецПериода
        //И ДенежныеСредства.Касса В(&СписокДоступныхКасс)
        И ДенежныеСредства.ХозяйственнаяОперация <> ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.КонвертацияВалюты)
        И ДенежныеСредства.ХозяйственнаяОперация <> ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ПоступлениеДенежныхСредствИзБанка)
        И (ДенежныеСредства.Регистратор ССЫЛКА Документ.ПриходныйКассовыйОрдер
        ИЛИ ДенежныеСредства.Регистратор ССЫЛКА Документ.РасходныйКассовыйОрдер)
    СГРУППИРОВАТЬ ПО
        ДенежныеСредства.МоментВремени,
        ДенежныеСредства.Период,
        ДенежныеСредства.Касса,
        ДенежныеСредства.Регистратор,
        ДенежныеСредства.ХозяйственнаяОперация,
        ДенежныеСредства.Заказ
       
    ОБЪЕДИНИТЬ ВСЕ
    
    // Начальный остаток на дату получения данных по хоз. операции и кассе
    ВЫБРАТЬ РАЗЛИЧНЫЕ
        МАКСИМУМ(ДенежныеСредства.Период),
        ДенежныеСредства.Касса,
        NULL,
        ДенежныеСредства.ХозяйственнаяОперация,
        NULL,
        СУММА(ВЫБОР
            КОГДА ДенежныеСредства.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
                ТОГДА ДенежныеСредства.Сумма
            ИНАЧЕ 0
        КОНЕЦ) КАК СуммаПриход,
        СУММА(ВЫБОР
            КОГДА ДенежныеСредства.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
                ТОГДА ДенежныеСредства.Сумма
            ИНАЧЕ 0
        КОНЕЦ) КАК СуммаРасход
    ИЗ
        РегистрНакопления.ДенежныеСредстваНаличные КАК ДенежныеСредства
    ГДЕ
        ДенежныеСредства.Период < &НачалоПериода
        //И ДенежныеСредства.Касса В(&СписокДоступныхКасс)
        И ДенежныеСредства.ХозяйственнаяОперация <> ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.КонвертацияВалюты)
        И ДенежныеСредства.ХозяйственнаяОперация <> ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ПоступлениеДенежныхСредствИзБанка)
        И (ДенежныеСредства.Регистратор ССЫЛКА Документ.ПриходныйКассовыйОрдер
        ИЛИ ДенежныеСредства.Регистратор ССЫЛКА Документ.РасходныйКассовыйОрдер)
    СГРУППИРОВАТЬ ПО
        ДенежныеСредства.Касса,
        ДенежныеСредства.ХозяйственнаяОперация
    
    ИНДЕКСИРОВАТЬ ПО
        ДенежныеСредства.Регистратор,
        ДенежныеСредства.ХозяйственнаяОперация
    ;
    ВЫБРАТЬ
        ДенежныеСредства.ХозяйственнаяОперация,
        ДенежныеСредства.Период,
        ДенежныеСредства.Регистратор,
        ДенежныеСредства.Касса,
        ДенежныеСредства.Заказ,
        ДенежныеСредства.СуммаПриход,
        СУММА(ВТ_ВыборкаИзРегистра.СуммаПриход) КАК СуммаПриходНакопительная,
        ДенежныеСредства.СуммаРасход,
        СУММА(ВТ_ВыборкаИзРегистра.СуммаРасход) КАК СуммаРасходНакопительная
    ИЗ
        ВТ_ВыборкаИзРегистра КАК ДенежныеСредства
        ЛЕВОЕ СОЕДИНЕНИЕ
            ВТ_ВыборкаИзРегистра
        // Поля соединения, поля по которым мы будем накапливать итог, сумму, количество и т.д. :
        ПО ВТ_ВыборкаИзРегистра.ХозяйственнаяОперация = ДенежныеСредства.ХозяйственнаяОперация
         И ВТ_ВыборкаИзРегистра.Касса = ДенежныеСредства.Касса
         // Важное условие, дает нам сумму по период в строке ведущей таблицы :
         И ВТ_ВыборкаИзРегистра.Период <= ДенежныеСредства.Период
    
    СГРУППИРОВАТЬ ПО
        ДенежныеСредства.ХозяйственнаяОперация,
        ДенежныеСредства.Период,
        ДенежныеСредства.Регистратор,
        ДенежныеСредства.Касса,
        ДенежныеСредства.Заказ,
        ДенежныеСредства.СуммаПриход,
        ДенежныеСредства.СуммаРасход
    
    УПОРЯДОЧИТЬ ПО
        ДенежныеСредства.ХозяйственнаяОперация,
        ДенежныеСредства.Период,
        ДенежныеСредства.Регистратор,
        ДенежныеСредства.Касса
    
    upload_2015-5-26_11-14-49.png
    --- Объединение сообщений, 26 май 2015 ---
    Делал в последней УТ11 демо база
    --- Объединение сообщений, 26 май 2015 ---
    Суть алгоритма в следующем : соединяем таблицу к себе же по условиям, в поля соединения - поля детализации и еще добавляем ограничивающий фактор, в данном случае поле период.
    После соединения будем иметь простынку в которой к каждой строке основной выборки будет присоединены строки с теми же значениями полей но до строки в которой период не больше периода в основной выборке, нам остается сгруппировать по полям основной выборки, а поля присоединения вогнать в агрегатные функции.
    Для большей ясности как это работает в последнем запросе можно убрать агрегатные функции - "СУММА" и "СГРУППИРОВАТЬ" будет видно как и какие суммы пойдут в общий итог.
    Последнее редактирование: 26 май 2015

Поделиться этой страницей