8.х Выборка из периодического РС на разные даты

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

  1. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    Я же Вам специально 2 примера привел, какая разница по одному полю соединять илп о 10 ти?
  2. TopicStarter Overlay
    XXL
    Offline

    XXL Опытный в 1С Команда форума

    Регистрация:
    22 янв 2007
    Сообщения:
    1.159
    Симпатии:
    19
    Баллы:
    29
    Если я буду выбирать по датам всех документов для каждого автомобиля, то у меня будет огромная таблица вида
    Авто1, Дата1, Пробег11
    Авто1, Дата2, Пробег12
    Авто1, Дата3, Пробег13
    Авто2, Дата1, Пробег21
    Авто2, Дата2, Пробег22
    Авто2, Дата3, Пробег23
    Авто3, Дата1, Пробег31...

    т.е. будет избыточность данных, мне, например, из этого всего нужны только 1, 3, 4 строки.

    Наверное главный вопрос в том, как указать, что по этому автомобилю нужен срез по дате именно этого документа.
  3. Yuriy_Alexandrovich
    Offline

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

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Код:
    ВЫБРАТЬ
        ДатыЗаписейНаДатуДокументов.Период,
        ДатыЗаписейНаДатуДокументов.СсылкаДок,
        ДатыЗаписейНаДатуДокументов.Автомобиль,
        ДатыЗаписейНаДатуДокументов.ДатаПоследнейЗаписиРегистраНаДатуДокумента,
        ДатыЗаписейНаДатуДокументов.ПробегАвтомобиля
    ИЗ
    (    ВЫБРАТЬ
            ТаблицаУчетаДокументов.Период,
            ТаблицаУчетаДокументов.СсылкаДок,
            ТаблицаУчетаДокументов.Автомобиль,
            МАКСИМУМ(ПробегАвтомобиля.Период) КАК ДатаПоследнейЗаписиРегистраНаДатуДокумента
        ИЗ ТаблицаУчетаДокументов
            ЛЕВОЕ СОЕДИНЕНИЕ
                РегистрСведений.ПробегАвтомобиля КАК ПробегАвтомобиля
            ПО ПробегАвтомобиля.Автомобиль = ТаблицаУчетаДокументов.Автомобиль
             И ПробегАвтомобиля.Период <= ТаблицаУчетаДокументов.Период
        СГРУППИРОВАТЬ ПО
            ТаблицаУчетаДокументов.Период,
            ТаблицаУчетаДокументов.СсылкаДок,
            ТаблицаУчетаДокументов.Автомобиль
    ) КАК ДатыЗаписейНаДатуДокументов
        ЛЕВОЕ СОЕДИНЕНИЕ
            РегистрСведений.ПробегАвтомобиля КАК ПробегАвтомобиля
        ПО ПробегАвтомобиля.Автомобиль = ДатыЗаписейНаДатуДокументов.Автомобиль
         И ПробегАвтомобиля.Период = ДатыЗаписейНаДатуДокументов.ДатаПоследнейЗаписиРегистраНаДатуДокумента
    
    XXL, Thelearning и alexburn нравится это.
  4. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Я бы еще этот запрос в СКД запихнул :)
  5. TopicStarter Overlay
    XXL
    Offline

    XXL Опытный в 1С Команда форума

    Регистрация:
    22 янв 2007
    Сообщения:
    1.159
    Симпатии:
    19
    Баллы:
    29
    Спасибо, немного отвлекусь, после попробую, и отпишусь
  6. Yuriy_Alexandrovich
    Offline

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

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Если запросец будет медленно шевелиться, то можно заранее поработать с таблицей учета пробега, сократив ее до даты первого документа в отборе
    Код:
    // Основная выборка по автомобилям, документам
    ВЫБРАТЬ
        ТаблицаУчетаДокументов.Период,
        ТаблицаУчетаДокументов.Регистратор КАК СсылкаДок,
        ТаблицаУчетаДокументов.Автомобиль
    ПОМЕСТИТЬ ВТ_ТаблицаУчетаДокументов
    ИЗ
        Регистр<Тип>.<Имя> КАК ТаблицаУчетаДокументов
    ГДЕ
        ТаблицаУчетаДокументов.Регистратор = &СсылкаДок
        И ТаблицаУчетаДокументов = &Автомобиль
    ;
    // Для ограничения выборки из регистра учета данных о пробеге,
    // Найдем дату с которой отбирать записи регистра
    ВЫБРАТЬ ПЕРВЫЕ 1
        ПробегАвтомобиля.Период
    ПОМЕСТИТЬ ВТ_ПериодЗаписи
    ИЗ
        РегистрСведений.ПробегАвтомобиля КАК ПробегАвтомобиля
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ
        (    ВЫБРАТЬ
                ВТ_ТаблицаУчетаДокументов.Период
            ИЗ
                ВТ_ТаблицаУчетаДокументов
            УПОРЯДОЧИТЬ ПО
                ВТ_ТаблицаУчетаДокументов.Период ВОЗР
        ) КАК ДатаПервогоДокумента
        ПО ПробегАвтомобиля.Период <= ДатаПервогоДокумента.Период
    УПОРЯДОЧИТЬ ПО
        ПробегАвтомобиля.Период УБЫВ
    ;
    
    // Ограниченная выборка регистра данных о пробеге, ограничение снизу
    // впринципе можно еще добавить ограничение сверху, данные для этого есть,
    // но поскольку обычно отбираются записи сравнительно "недавние" то этого можно не делать
    ВЫБРАТЬ
        ПробегАвтомобиля.Период,
        ПробегАвтомобиля.Автомобиль,
        ПробегАвтомобиля.Пробег
    ПОМЕСТИТЬ ВТ_ЗаписиОПробегеАвто
    ИЗ
        РегистрСведений.ПробегАвтомобиля КАК ПробегАвтомобиля
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ
            ВТ_ПериодЗаписи
        ПО ВТ_ПериодЗаписи.Период >= ПробегАвтомобиля.Период
    ;
    
    // Общая выборка и соединения
    ВЫБРАТЬ
        ДатыЗаписейНаДатуДокументов.Период,
        ДатыЗаписейНаДатуДокументов.СсылкаДок,
        ДатыЗаписейНаДатуДокументов.Автомобиль,
        ДатыЗаписейНаДатуДокументов.ДатаПоследнейЗаписиРегистраНаДатуДокумента,
        ДатыЗаписейНаДатуДокументов.ПробегАвтомобиля
    ИЗ
    (    ВЫБРАТЬ
            ТаблицаУчетаДокументов.Период,
            ТаблицаУчетаДокументов.СсылкаДок,
            ТаблицаУчетаДокументов.Автомобиль,
            МАКСИМУМ(ПробегАвтомобиля.Период) КАК ДатаПоследнейЗаписиРегистраНаДатуДокумента
        ИЗ
            ВТ_ТаблицаУчетаДокументов КАК ТаблицаУчетаДокументов
            ЛЕВОЕ СОЕДИНЕНИЕ
                ВТ_ЗаписиОПробегеАвто КАК ПробегАвтомобиля
            ПО ПробегАвтомобиля.Автомобиль = ТаблицаУчетаДокументов.Автомобиль
             И ПробегАвтомобиля.Период <= ТаблицаУчетаДокументов.Период
        СГРУППИРОВАТЬ ПО
            ТаблицаУчетаДокументов.Период,
            ТаблицаУчетаДокументов.СсылкаДок,
            ТаблицаУчетаДокументов.Автомобиль
    ) КАК ДатыЗаписейНаДатуДокументов
        ЛЕВОЕ СОЕДИНЕНИЕ
            ВТ_ЗаписиОПробегеАвто КАК ПробегАвтомобиля
        ПО ПробегАвтомобиля.Автомобиль = ДатыЗаписейНаДатуДокументов.Автомобиль
         И ПробегАвтомобиля.Период = ДатыЗаписейНаДатуДокументов.ДатаПоследнейЗаписиРегистраНаДатуДокумента
    
    Работоспособность не проверял, попросту неначем :)
  7. TopicStarter Overlay
    XXL
    Offline

    XXL Опытный в 1С Команда форума

    Регистрация:
    22 янв 2007
    Сообщения:
    1.159
    Симпатии:
    19
    Баллы:
    29
    По первому варианту работает, спасибо:) отрабатывает быстро, так что модернизировать не нужно.

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