Версия для печати темы (https://pro1c.org.ua/index.php?s=12f385ffee17f25b71c939b07095459d&showtopic=17628)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Ваши мысли по поводу задачки

Автор: Powerman 22.04.14, 11:26

Уважаемые знатоки! Подскажите, что Вы думаете поп поводу данной задачки...

Задача

Есть периодический регистр сведений «Показания спидометра» с измерением «Авто» и ресурсом «Пробег, км» со следующими данными:

1. 01/01/2012 Авто1 100.00
2. 02/01/2012 Авто1 500.00
3. 03/01/2012 Авто1 50.00
4. 04/01/2012 Авто1 400.00
5. 06/01/2012 Авто1 100.00

Как видим показания растут, но спидометр периодически может обнуляться. Необходимо одним запросом (вложенные запросы и временные таблицы допускаются) получение общего пробега за произвольный период.

Обнуление счетчика может происходить в любой день.
Правильным ответом по приведенному примеру будет пробег 1000 км за весь период.
При решении задачи учитывать что автомобилей может быть несколько…

Автор: logist 22.04.14, 11:56

А в чем проблема-то, непонятно...

| ВЫБРАТЬ * ИЗ РегистрыСведений.ПоказанияСпидометра КАК Т ГДЕ Т.Период МЕЖДУ НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ) И КОНЕЦПЕРИОДА(&КонецПериода,ДЕНЬ) И Т.Автомобиль В(&СписокАвтомоиблей)

Автор: sava1 22.04.14, 13:01

(2) Проблема в расчете пробега после обнуления (запросом)

ТС. Ключевое выражение для поиска "Нарастающий итог в запросе".
А так - левое соединение таблицыс собой по периоду

Автор: Powerman 22.04.14, 13:05

Цитата(logist @ 22.04.14, 12:56) *
А в чем проблема-то, непонятно...
| ВЫБРАТЬ * ИЗ РегистрыСведений.ПоказанияСпидометра КАК Т ГДЕ Т.Период МЕЖДУ НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ) И КОНЕЦПЕРИОДА(&КонецПериода,ДЕНЬ) И Т.Автомобиль В(&СписокАвтомоиблей)

Общий пробег не получили по этому запросу, а только выборку за период. Я сделал иначе но результат тот же. Задача получить общий пробег...


 ! 

Правила, п.13
 

Я начал подумывать корректно ли поставлена задача или мне не понятен её смысл

Автор: yuritch 22.04.14, 13:20

На первый взгляд, задача некорректна. Пример:

День Пробег
1 100
2 200
(здесь прошло обнуление)
3 210

(в первый день наездили 100, во второй тоже 100, дальше обнулили и проехали 210)

Т.е. по предложенным данным невозможно отследить ситуацию, когда в день обнуления машина наездила столько же или чуть больше, чем накопилось до того.
Вывод: нужно добавить информацию, в какие дни было обнуление. Тогда будет возможно решить такую задачу.

Автор: Ardi 22.04.14, 14:45

Переделать на регистр оборотов.
Когда вводим документ документ рассчитывает было обнуление или нет. И проводим не показания счетчика а прирост пробега.

Или на тот-же регистр сведений добавить ещё один ресурс - "прирост пробега".

Автор: Домовик 22.04.14, 15:05

ну если только математически ... то главное - половить перепады(пары значений) с большего значения на меньшее и взять из пары -бОльшее. потом просумировать бОльшие зн. + последнее.
Как это языком запроса понятия не имею.

остальные значения - не нужны.

Автор: Powerman 22.04.14, 15:26

Кое что уже получается... запрос такой...

ВЫБРАТЬ
    ПоказанияСпидометра.Период,
    ПоказанияСпидометра.Авто,
    ПоказанияСпидометра.Пробег
ПОМЕСТИТЬ ВТдвижения
ИЗ
    РегистрСведений.ПоказанияСпидометра КАК ПоказанияСпидометра
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Движения.Период КАК Период,
    Движения.Авто КАК Авто,
    Движения.Пробег КАК Пробег,
    СУММА(ТеЖеДвижения.Пробег) КАК ПробегНарастающийИтог
ИЗ
    ВТдвижения КАК Движения
        ЛЕВОЕ СОЕДИНЕНИЕ ВТдвижения КАК ТеЖеДвижения
        ПО Движения.Период >= ТеЖеДвижения.Период
ГДЕ
    Движения.Период МЕЖДУ НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ) И КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ)
    И Движения.Авто В(&СписокАвтомоиблей)

СГРУППИРОВАТЬ ПО
    Движения.Период,
    Движения.Авто,
    Движения.Пробег

УПОРЯДОЧИТЬ ПО
    Авто,
    Период


Результат, такой...

Период Авто Пробег ПробегНарастающийИтог
01.01.2012 0:00:00 Авто1 100 200
02.01.2012 0:00:00 Авто1 500 1 200
03.01.2012 0:00:00 Авто1 50 1 300
05.01.2012 0:00:00 Авто1 400 1 700
06.01.2012 0:00:00 Авто1 100 1 800
07.01.2012 0:00:00 Авто1 0 1 800

Но должно быть 1000

Автор: Егор Динин 22.04.14, 15:29

Цитата(yuritch @ 22.04.14, 13:20) *
На первый взгляд, задача некорректна. Пример:

Соглашусь с yuritch, при такой структуре задачу можно решать лишь с некоторыми допущениями.

Автор: sava1 22.04.14, 15:42

Вот так 1С учит новых программистов -
хранение пробега в РС (вместо оборотов/остатков), а дальше соорудите аццкий запрос к базе, увеличивающий таблицу выборки в геометрической прогрессии.

Автор: Petre 22.04.14, 15:50

Дебильная постановка задачи, если чесно.
На коленке где-то так:

ВЫБРАТЬ
    ПоказанияСпидометра.Авто,
    ПоказанияСпидометра.Период КАК ТекПериод,
    ПоказанияСпидометра.Спидометр КАК ТекСпидометр,
    МАКСИМУМ(ПоказанияСпидометраПредыдущие.Период) КАК ПредПериод
ПОМЕСТИТЬ Таб1
ИЗ
    РегистрСведений.ПоказанияСпидометра КАК ПоказанияСпидометра
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПоказанияСпидометра КАК ПоказанияСпидометраПредыдущие
        ПО ПоказанияСпидометра.Период > ПоказанияСпидометраПредыдущие.Период
            И ПоказанияСпидометра.Авто = ПоказанияСпидометраПредыдущие.Авто

СГРУППИРОВАТЬ ПО
    ПоказанияСпидометра.Период,
    ПоказанияСпидометра.Авто,
    ПоказанияСпидометра.Спидометр
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Таб1.Авто,
    Таб1.ТекПериод КАК ТекПериод,
    Таб1.ТекСпидометр,
    ЕСТЬNULL(ПоказанияСпидометра.Спидометр, 0) КАК ПредСпидометр,
    ВЫБОР
        КОГДА Таб1.ТекСпидометр > ЕСТЬNULL(ПоказанияСпидометра.Спидометр, 0)
            ТОГДА Таб1.ТекСпидометр - ЕСТЬNULL(ПоказанияСпидометра.Спидометр, 0)
        ИНАЧЕ Таб1.ТекСпидометр
    КОНЕЦ КАК Пробег
ИЗ
    Таб1 КАК Таб1
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПоказанияСпидометра КАК ПоказанияСпидометра
        ПО Таб1.Авто = ПоказанияСпидометра.Авто
            И Таб1.ПредПериод = ПоказанияСпидометра.Период

УПОРЯДОЧИТЬ ПО
    ТекПериод

Автор: Powerman 22.04.14, 17:24

Цитата(sava1 @ 22.04.14, 16:42) http://pro1c.org.ua/index.php?act=findpost&pid=86037
Дебильная постановка задачи, если чесно.
На коленке где-то так:

К сожалению с коленки сразу не получилось...
слегка модифицировал код...

ВЫБРАТЬ
    ПоказанияСпидометра.Авто,
    ПоказанияСпидометра.Период КАК ТекПериод,
    ПоказанияСпидометра.Пробег КАК ТекСпидометр,
    МАКСИМУМ(ПоказанияСпидометраПредыдущие.Период) КАК ПредПериод
ПОМЕСТИТЬ Таб1
ИЗ
    РегистрСведений.ПоказанияСпидометра КАК ПоказанияСпидометра
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПоказанияСпидометра КАК ПоказанияСпидометраПредыдущие
        ПО ПоказанияСпидометра.Период > ПоказанияСпидометраПредыдущие.Период
            И ПоказанияСпидометра.Авто = ПоказанияСпидометраПредыдущие.Авто
ГДЕ
    ПоказанияСпидометра.Период МЕЖДУ &НачалоПериода И &КонецПериода
    И ПоказанияСпидометра.Авто = &Авто

СГРУППИРОВАТЬ ПО
    ПоказанияСпидометра.Период,
    ПоказанияСпидометра.Авто,
    ПоказанияСпидометра.Пробег
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Таб1.Авто,
    Таб1.ТекПериод КАК ТекПериод,
    Таб1.ТекСпидометр,
    ЕСТЬNULL(ПоказанияСпидометра.Пробег, 0) КАК ПредСпидометр,
    ВЫБОР
        КОГДА Таб1.ТекСпидометр > ЕСТЬNULL(ПоказанияСпидометра.Пробег, 0)
            ТОГДА Таб1.ТекСпидометр - ЕСТЬNULL(ПоказанияСпидометра.Пробег, 0)
        ИНАЧЕ Таб1.ТекСпидометр
    КОНЕЦ КАК Пробег
ИЗ
    Таб1 КАК Таб1
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПоказанияСпидометра КАК ПоказанияСпидометра
        ПО Таб1.Авто = ПоказанияСпидометра.Авто
            И Таб1.ПредПериод = ПоказанияСпидометра.Период

УПОРЯДОЧИТЬ ПО
    ТекПериод


результат ниже...

Авто ТекПериод ТекСпидометр ПредСпидометр Пробег
Авто1 01.01.2012 0:00:00 100 0 100
Авто1 02.01.2012 0:00:00 500 100 400
Авто1 03.01.2012 0:00:00 50 500 50
Авто1 04.01.2012 0:00:00 0 50 0
Авто1 05.01.2012 0:00:00 400 0 400
Авто1 06.01.2012 0:00:00 100 400 100

Автор: Ardi 22.04.14, 18:09

Цитата(Powerman @ 22.04.14, 17:24) *
результат ниже...

У меня корректно отрабатывает запрос (в консоли запросов).

Автор: Powerman 22.04.14, 18:22

Цитата(Ardi @ 22.04.14, 19:09) *
У меня корректно отрабатывает запрос (в консоли запросов).

Мой вариант?
у меня тоже через консоль, но что то не так... why.gif

Автор: Ardi 22.04.14, 19:20

Цитата(Powerman @ 22.04.14, 18:22) http://pro1c.org.ua/index.php?act=findpost&pid=86041

Автор: Powerman 22.04.14, 20:45

Цитата(Ardi @ 22.04.14, 20:20) http://pro1c.org.ua/index.php?act=findpost&pid=86042

эта консоль отрабатывает в точности как и моя, но я в результатах так и не могу получить 1000 т.е. нет нарастающего итога
Авто ТекПериод ТекСпидометр ПредСпидометр Спидометр
Авто1 01.01.2012 0:00:00 100 100
Авто1 02.01.2012 0:00:00 500 100 400
Авто1 03.01.2012 0:00:00 50 500 50
Авто1 04.01.2012 0:00:00 50
Авто1 05.01.2012 0:00:00 400 400
Авто1 06.01.2012 0:00:00 100 400 100

Вроде получилось... Всем ОГРОМНОЕ СПАСИБО!!! Ошибка была в данных... Итог получил. Итого, рабочий запрос.

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

СГРУППИРОВАТЬ ПО
    ПоказанияСпидометра.Период,
    ПоказанияСпидометра.Авто,
    ПоказанияСпидометра.Спидометр
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Таб1.Авто КАК Авто,
    Таб1.ТекПериод КАК ТекПериод,
    Таб1.ТекСпидометр КАК ТекСпидометр,
    ЕСТЬNULL(ПоказанияСпидометра.Спидометр, 0) КАК ПредСпидометр,
    ВЫБОР
        КОГДА Таб1.ТекСпидометр > ЕСТЬNULL(ПоказанияСпидометра.Спидометр, 0)
            ТОГДА Таб1.ТекСпидометр - ЕСТЬNULL(ПоказанияСпидометра.Спидометр, 0)
        ИНАЧЕ Таб1.ТекСпидометр
    КОНЕЦ КАК Пробег
ИЗ
    Таб1 КАК Таб1
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПоказанияСпидометра КАК ПоказанияСпидометра
        ПО Таб1.Авто = ПоказанияСпидометра.Авто
            И Таб1.ПредПериод = ПоказанияСпидометра.Период

УПОРЯДОЧИТЬ ПО
    ТекПериод
ИТОГИ
    СУММА(Пробег)
ПО
    Авто

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua