Имя: Пароль:
1C
1С v8
Запрос. Ограничение остатков по регистратору или получение остатка по документу
0 fantomrik
 
04.09.13
20:01
Доброго времени суток.
Вобщем есть "кривой" запрос по УАТ. Кривой, потому что заказчик решил, что если Путевой лист сделан 31.07 а закрыт 01.01 то эту наработку мы закрываем 31 числом, а в регистр данные попадают датой закрытия. Пришлось для отчета данные брать не только с регистров но и связывать их с документами. Все работает за исключением остатков на начало месяца и конец месяца. Если попадается путевой лист от 31.07 который закрывается 01.08, то он Остатком топлива своим "сбивает" начальный остаток по регистру. Пол дня сегодня бился с этим отчетом, так и не придумал как победить. Если есть такой путевой лист (как описал выше), то остаток из остатка топлива на начало месяца нужно вычесть остаток топлива в такой машине. Этот остаток должен попадать на конец пред месяца. теоретически по каждой машинке если взять самый первый и последний в периоде путевой лист, то в нем мы увидем нужный нам остаток ГСМ на машине, но как это условие вписать в запрос для отчета СКД ума не приложу ...

Собственно запрос

ВЫБРАТЬ
    уатПутевойЛист.ТранспортноеСредство КАК ТС,
    уатПутевойЛист.ТранспортноеСредство.ГосударственныйНомер КАК ГосНомер,
    уатПутевойЛист.ТранспортноеСредство.ОсновноеСредство.Код КАК ИнвентарныйНомер,
    уатПутевойЛист.ТранспортноеСредство.ГаражныйНомер КАК ГарНомер,
    уатОстаткиГСМнаТСОстаткиИОбороты.КоличествоНачальныйОстаток КАК ГСМнач,
    ВЫБОР
        КОГДА уатОборотыПоЗаправкамГСМОбороты.ВидЗаправки = ЗНАЧЕНИЕ(перечисление.уатВидыДвиженияГСМ.ЗаправкаСклад)
            ТОГДА уатОборотыПоЗаправкамГСМОбороты.КоличествоОборот
        ИНАЧЕ 0
    КОНЕЦ КАК СоСклада,
    ВЫБОР
        КОГДА уатОборотыПоЗаправкамГСМОбороты.ВидЗаправки <> ЗНАЧЕНИЕ(перечисление.уатВидыДвиженияГСМ.ЗаправкаСклад)
            ТОГДА уатОборотыПоЗаправкамГСМОбороты.КоличествоОборот
        ИНАЧЕ 0
    КОНЕЦ КАК Другие,
    СУММА(уатПутевойЛистРасходГСМ.РасходПоНорме) КАК РасходПоНорме,
    СУММА(уатПутевойЛистРасходГСМ.ОстатокПриВыезде) КАК ОстатокПриВыезде,
    уатОстаткиГСМнаТСОстаткиИОбороты.КоличествоКонечныйОстаток КАК ГСМкон,
    СУММА(ВЫБОР
            КОГДА уатПутевойЛист.РаботаНаДвухВидахТоплива
                ТОГДА уатПутевойЛистРасходГСМ.Пробег
            ИНАЧЕ ВЫБОР
                    КОГДА уатПутевойЛист.ТранспортноеСредство.Модель.НаличиеСпидометра
                        ТОГДА уатПутевойЛистВыработкаТС.Количество
                    ИНАЧЕ уатПутевойЛистВыработкаТС.Количество / 3600
                КОНЕЦ
        КОНЕЦ) КАК Пробег,
    МИНИМУМ(уатПутевойЛист.СпидометрВыезда) КАК СпидометрВыезда,
    МАКСИМУМ(уатПутевойЛист.СпидометрВозвращения) КАК СпидометрВозвращения,
    уатПутевойЛистРасходГСМ.ГСМ КАК ГСМ,
    СУММА(уатПутевойЛистРасходГСМ.РасходПоФакту) КАК РасходПоФакту,
    СУММА(уатПутевойЛистРасходГСМ.Выдано) КАК Выдано,
    СУММА(уатПутевойЛистРасходГСМ.ОстатокПриВозвращении) КАК ОстатокПриВозвращении,
    СУММА(ВЫБОР
            КОГДА уатПутевойЛистРасходГСМ.РасходПоНорме > уатПутевойЛистРасходГСМ.РасходПоФакту
                ТОГДА уатПутевойЛистРасходГСМ.РасходПоНорме - уатПутевойЛистРасходГСМ.РасходПоФакту
            ИНАЧЕ 0
        КОНЕЦ) КАК Экономия,
    СУММА(ВЫБОР
            КОГДА уатПутевойЛистРасходГСМ.РасходПоНорме < уатПутевойЛистРасходГСМ.РасходПоФакту
                ТОГДА уатПутевойЛистРасходГСМ.РасходПоФакту - уатПутевойЛистРасходГСМ.РасходПоНорме
            ИНАЧЕ 0
        КОНЕЦ) КАК Пережог,
    уатПутевойЛист.ТранспортноеСредство.Модель,
    уатПутевойЛист.ТранспортноеСредство.Подразделение,
    уатОстаткиГСМнаТСОстаткиИОбороты.ГСМ КАК ГСМОстатки,
    уатОборотыПоЗаправкамГСМОбороты.ГСМ КАК ГСМОбороты
ПОМЕСТИТЬ ВТ
ИЗ
    Документ.уатПутевойЛист КАК уатПутевойЛист
        {ЛЕВОЕ СОЕДИНЕНИЕ Документ.уатПутевойЛист.РасходГСМ КАК уатПутевойЛистРасходГСМ
        ПО (уатПутевойЛистРасходГСМ.Ссылка = уатПутевойЛист.Ссылка)
            И (уатПутевойЛистРасходГСМ.ТС = уатПутевойЛист.ТранспортноеСредство)
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            уатПутевойЛистВыработкаТС1.Ссылка КАК Ссылка,
            уатПутевойЛистВыработкаТС1.ТС КАК ТС,
            уатПутевойЛистВыработкаТС1.ПараметрВыработки КАК ПараметрВыработки,
            СУММА(уатПутевойЛистВыработкаТС1.Количество) КАК Количество
        ИЗ
            Документ.уатПутевойЛист.ВыработкаТС КАК уатПутевойЛистВыработкаТС1
        ГДЕ
            (уатПутевойЛистВыработкаТС1.ТС.Модель.НаличиеСпидометра
                        И уатПутевойЛистВыработкаТС1.ПараметрВыработки = ЗНАЧЕНИЕ(Справочник.уатПараметрыВыработки.ПробегОбщий)
                    ИЛИ НЕ уатПутевойЛистВыработкаТС1.ТС.Модель.НаличиеСпидометра
                        И уатПутевойЛистВыработкаТС1.ПараметрВыработки = ЗНАЧЕНИЕ(Справочник.уатПараметрыВыработки.ВремяВРаботе))
        
        СГРУППИРОВАТЬ ПО
            уатПутевойЛистВыработкаТС1.Ссылка,
            уатПутевойЛистВыработкаТС1.ТС,
            уатПутевойЛистВыработкаТС1.ПараметрВыработки) КАК уатПутевойЛистВыработкаТС
        ПО (уатПутевойЛистВыработкаТС.Ссылка = уатПутевойЛист.Ссылка)
            И (уатПутевойЛистВыработкаТС.ТС = уатПутевойЛист.ТранспортноеСредство)}
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.уатОстаткиГСМнаТС.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , ) КАК уатОстаткиГСМнаТСОстаткиИОбороты
        ПО уатПутевойЛист.ТранспортноеСредство = уатОстаткиГСМнаТСОстаткиИОбороты.ТС
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.уатСоставТС КАК уатСоставТС
            {ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.уатСчетчикиТС.СрезПоследних(&НачалоПериода, ) КАК уатСчетчикиТССрезПоследних_Нач
            ПО уатСоставТС.ТС = уатСчетчикиТССрезПоследних_Нач.ТС}
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.уатСчетчикиТС.СрезПоследних(&КонецПериода, ) КАК уатСчетчикиТССрезПоследних_Кон
            ПО уатСоставТС.ТС = уатСчетчикиТССрезПоследних_Кон.ТС
        ПО уатПутевойЛист.ТранспортноеСредство = уатСоставТС.ВСоставе
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.уатОборотыПоЗаправкамГСМ.Обороты(&НачалоПериода, &КонецПериода, , ) КАК уатОборотыПоЗаправкамГСМОбороты
        ПО уатПутевойЛист.ТранспортноеСредство = уатОборотыПоЗаправкамГСМОбороты.ТС
ГДЕ
    уатПутевойЛист.Дата МЕЖДУ &НачалоПериода И &КонецПериода
    И уатПутевойЛист.Рассчитан
    И уатПутевойЛист.Проведен
    И уатПутевойЛистРасходГСМ.Активен
    И уатПутевойЛист.ТранспортноеСредство.Подразделение = &Подразделение

СГРУППИРОВАТЬ ПО
    уатПутевойЛистРасходГСМ.ГСМ,
    уатПутевойЛист.ТранспортноеСредство,
    уатПутевойЛист.ТранспортноеСредство.ГосударственныйНомер,
    уатПутевойЛист.ТранспортноеСредство.ГаражныйНомер,
    уатПутевойЛист.ТранспортноеСредство.ОсновноеСредство.Код,
    уатОстаткиГСМнаТСОстаткиИОбороты.КоличествоНачальныйОстаток,
    уатОстаткиГСМнаТСОстаткиИОбороты.КоличествоКонечныйОстаток,
    ВЫБОР
        КОГДА уатОборотыПоЗаправкамГСМОбороты.ВидЗаправки <> ЗНАЧЕНИЕ(перечисление.уатВидыДвиженияГСМ.ЗаправкаСклад)
            ТОГДА уатОборотыПоЗаправкамГСМОбороты.КоличествоОборот
        ИНАЧЕ 0
    КОНЕЦ,
    ВЫБОР
        КОГДА уатОборотыПоЗаправкамГСМОбороты.ВидЗаправки = ЗНАЧЕНИЕ(перечисление.уатВидыДвиженияГСМ.ЗаправкаСклад)
            ТОГДА уатОборотыПоЗаправкамГСМОбороты.КоличествоОборот
        ИНАЧЕ 0
    КОНЕЦ,
    уатСчетчикиТССрезПоследних_Кон.Значение,
    уатСчетчикиТССрезПоследних_Нач.Значение,
    уатПутевойЛист.ТранспортноеСредство.Модель,
    уатПутевойЛист.ТранспортноеСредство.Подразделение,
    уатОстаткиГСМнаТСОстаткиИОбороты.ГСМ,
    уатОборотыПоЗаправкамГСМОбороты.ГСМ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ.ГосНомер,
    ВТ.ИнвентарныйНомер,
    ВТ.ГарНомер,
    ВТ.ГСМнач,
    ВТ.СоСклада,
    ВТ.Другие,
    ВТ.РасходПоНорме,
    ВТ.РасходПоФакту,
    ВТ.ГСМкон,
    ВТ.Пробег,
    ВТ.СпидометрВыезда,
    ВТ.СпидометрВозвращения,
    ВТ.ТранспортноеСредствоМодель,
    ВТ.ТранспортноеСредствоПодразделение,
    ВТ.ГСМОстатки,
    ВТ.ГСМОбороты,
    ВТ.ТС,
    ВТ.ГСМ
ИЗ
    ВТ КАК ВТ
1 vyaz
 
04.09.13
20:05
...не вдаваясь в подробности и не претендуя на истину... а может движения документа от 1 числа проще в предыдущую дату писать?
2 fantomrik
 
04.09.13
20:08
(1)не понял мысль вашу
3 vyaz
 
04.09.13
20:11
(2)
> потому что заказчик решил, что если Путевой лист сделан
> 31.07 а закрыт 01.01 то эту наработку мы закрываем 31
> числом, а в регистр данные попадают датой закрытия

допилите конфигурацию, чтобы движения документа попадали в регистр НУЖНОЙ ВАМ датой
4 Бабло
 
04.09.13
20:23
Укажи явно папаметр таблицы остатков, есть там принедительный спецсимвол
5 fantomrik
 
05.09.13
09:15
(3) Логичное решение, просто не хотелось бы ломать документ, уже отчет уж исковеркать до конца под задачу.
(4) не понимаю о чем вы
6 fantomrik
 
05.09.13
09:39
Мб пойти тогда таким путем - выбрать самый ближайший путевой лист к &НачалоПериода и взять из него остаток. Но если в случае 1 машинки можно отсортировать ПЛ по дате и взять первый, то как такое же реализовать без отбора по машинам, что бы соединить с таблицей других данных?
7 fantomrik
 
05.09.13
22:35
(6) Сделал так - основной запрос оставил без изменений, результат в ВТ. В др ВТ отобрал документы с датой документа < НачалоПериода и датой регистрации в регистре > НачалоПериода. Соединил таблицы в от Суммы начала месяца отнимаю сумму из 2ой  ВТ. Наверняка далеко не оптимальное решение, но работает...