Имя: Пароль:
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ой  ВТ. Наверняка далеко не оптимальное решение, но работает...
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший