8.х Как "свернуть" таблицу

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

  1. TopicStarter Overlay
    XXL
    Offline

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

    Регистрация:
    22 янв 2007
    Сообщения:
    1.159
    Симпатии:
    19
    Баллы:
    29
    Доброго дня.
    Подскажите, есть такая табличка, получаю её запросом
    Табличка.jpg
    Как бы её хитро свернуть, или переделать запрос, чтобы если в первой строке дата окончания = дате начала во второй строке, то они схлопывались в одну, при этом дата начала была из первой строки, дата окончания из второй? И так по всей таблице.

    т.е. в данном примере должны остаться три строки

    Итог.jpg
  2. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.410
    Симпатии:
    316
    Баллы:
    104
    Время всегда кратно 15 минутам?

    Если да, такой вариант:
    Допиши запрос чтобы даты были в одну колонку (ну т.е. и начало и конец вместе)
    Потом запрос типа:
    Код:
    ВЫБРАТЬ
        Даты.Дата,
        КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДатыДо.Дата) КАК Номер
    ПОМЕСТИТЬ НомераДат
    ИЗ
        Даты КАК Даты
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТДаты КАК ДатыДо
            ПО (ДатыДо.Дата <= Даты.Дата)
    
    СГРУППИРОВАТЬ ПО
        Даты.Дата
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        МИНИМУМ(НомераДат.Дата) КАК ДатаНач,
        МАКСИМУМ(НомераДат.Дата) КАК ДатаКон
    ИЗ
        НомераДат КАК НомераДат
    
    СГРУППИРОВАТЬ ПО
        ДОБАВИТЬКДАТЕ(НомераДат.Дата, минута, -НомераДат.Номер * 15)
    


    в общем вот пример в консоли попробовать, как-то так:
    Код:
    выбрать датавремя(2014, 1, 1, 15, 30, 0) КАК Дата ПОМЕСТИТЬ ВТДаты объединить
    выбрать датавремя(2014, 1, 1, 15, 45, 0) объединить
    выбрать датавремя(2014, 1, 1, 15, 45, 0) объединить
    выбрать датавремя(2014, 1, 1, 16, 00, 0) объединить
    выбрать датавремя(2014, 1, 1, 16, 00, 0) объединить
    выбрать датавремя(2014, 1, 1, 16, 15, 0) объединить
    выбрать датавремя(2014, 1, 1, 16, 15, 0) объединить
    выбрать датавремя(2014, 1, 1, 20, 0, 0) объединить
    выбрать датавремя(2014, 1, 1, 20, 15, 0) объединить
    выбрать датавремя(2014, 1, 1, 20, 45, 0)
    ;
    
    ВЫБРАТЬ
        Даты.Дата,
        КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДатыДо.Дата) КАК Номер
    ПОМЕСТИТЬ НомераДат
    ИЗ
        ВТДаты КАК Даты
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТДаты КАК ДатыДо
            ПО (ДатыДо.Дата <= Даты.Дата)
    
    СГРУППИРОВАТЬ ПО
        Даты.Дата
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        МИНИМУМ(НомераДат.Дата) КАК ДатаНач,
        МАКСИМУМ(НомераДат.Дата) КАК ДатаКон
    ИЗ
        НомераДат КАК НомераДат
    
    СГРУППИРОВАТЬ ПО
        ДОБАВИТЬКДАТЕ(НомераДат.Дата, минута, -НомераДат.Номер * 15)
  3. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Дык время в течении дня может быть разным, как понимаю, т.е. это не вариант вообще...
  4. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.410
    Симпатии:
    316
    Баллы:
    104
    Не факт в данном конкретном случае.. :) Я смутно помню темы на этом форуме, был здесь какой-то вопрос строго про 15 минут.
    Да даже если время разное, как это влияет на вышеприведенный вариант решения (кроме изменения множителя в запросе)?
  5. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Текст запроса содержит конкретно указанные даты - это ОЧЕНЬ частный случай :)
  6. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.410
    Симпатии:
    316
    Баллы:
    104
    Вот щас реально не понял сообщение.

    Даты вообще-то частично из первого поста, частично из головы, и вставлены туда чтобы продемонстрировать работоспособность запроса в консоли запросов.
    Никто же не мешает подставить свои.
  7. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Ок, туплю уже в конце рабочего дня :)
    Вот не понятно, шаг в 15 минут - строгий или нет. Если строгий, то сработает.
  8. vartanet
    Offline

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

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    у меня похожая задачка была по подсчету простоев в минутах в посещаемости магазина..

    вот так решил:

    Код:
    // получаем таблицу всех периодов
        НачПериода1 = НачалоДня(НачалоПериода);
        КонПериода1 = КонецДня(КонецПериода)+1;
        Пока НачПериода1<>КонПериода1 Цикл
            СтрокаТабличнойЧасти = ТабличнаяЧасть1.Добавить();
            СтрокаТабличнойЧасти.НачалоИнтервала = НачПериода1;
            НачПериода1 = НачПериода1 + 15*60;
        КонецЦикла;
     
        МенеджерВТ = Новый МенеджерВременныхТаблиц;
        Запрос = Новый Запрос;
        Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
     
        Запрос.Текст = "ВЫБРАТЬ * Поместить Таблица1 ИЗ &ВнешнийИсточник1 КАК ТЧ1";
        Запрос.УстановитьПараметр("ВнешнийИсточник1", ТабличнаяЧасть1);
        Запрос.Выполнить();
     
        Запрос.Текст =
        "ВЫБРАТЬ
        |    Склады.Ссылка КАК Магазин
        |    поместить Таблица2
        |ИЗ
        |    Справочник.Склады КАК Склады
        |ГДЕ
        |    Склады.Ссылка В ИЕРАРХИИ(&СкладыРозница)
        |    И Склады.ЭтоГруппа = ЛОЖЬ
        |;
        |ВЫБРАТЬ
        |    Таблица1.НачалоИнтервала,
        |    Таблица2.Магазин
        |ПОМЕСТИТЬ Таблица3
        |ИЗ
        |    Таблица1 КАК Таблица1,
        |    Таблица2 КАК Таблица2
        |;
        |ВЫБРАТЬ
        |    Посетители.Проход.Магазин КАК Магазин,
        |    Посетители.НачалоИнтервала КАК НачалоИнтервала,
        |    СУММА(Посетители.КоличествоВходящих) КАК КоличествоВходящих
        |ПОМЕСТИТЬ Таблица4
        |ИЗ
        |    РегистрНакопления.Посетители КАК Посетители
        |ГДЕ
        |    Посетители.НачалоИнтервала МЕЖДУ &НачалоПериода И &КонецПериода
        |
        |СГРУППИРОВАТЬ ПО
        |    Посетители.Проход.Магазин,
        |    Посетители.НачалоИнтервала
        |;
        |ВЫБРАТЬ
        |    Таблица3.НачалоИнтервала КАК НачалоИнтервала,
        |    Таблица3.Магазин КАК Магазин,
        |    Таблица4.КоличествоВходящих
        |ИЗ
        |    Таблица3 КАК Таблица3
        |        ЛЕВОЕ СОЕДИНЕНИЕ Таблица4 КАК Таблица4
        |        ПО Таблица3.НачалоИнтервала = Таблица4.НачалоИнтервала
        |            И Таблица3.Магазин = Таблица4.Магазин
        |
        |УПОРЯДОЧИТЬ ПО
        |    Магазин,
        |    НачалоИнтервала";
        Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(НачалоПериода));
        Запрос.УстановитьПараметр("КонецПериода", КонецДня(КонецПериода));
        Запрос.УстановитьПараметр("СкладыРозница", ПолучитьСписокРабочихМагазинов());
     
        Таблица = Запрос.Выполнить().Выгрузить();
    Последнее редактирование модератором: 7 ноя 2014
  9. _Алексей_
    Offline

    _Алексей_

    Регистрация:
    7 ноя 2014
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1
    Я бы сделал так. Сложил бы ДатаНачала и ДатаОкончания в одну колонку "vremya" и сгруппировал бы по ней с подсчетом количества ( если есть еще ключевое поле добавил бы и его в группировку) в отдельную таблицу. Затем условием бы отсек все значения у которых количество больше единицы. Потом бы соединил с исходной таблицей через условие "или" датаначала = "vremya" или датаокончания = "vremya" (ну и по ключу бы соединил). Остались бы только 2 записи на интервал - с датой начала интервала и датой конца интервала.
  10. TopicStarter Overlay
    XXL
    Offline

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

    Регистрация:
    22 янв 2007
    Сообщения:
    1.159
    Симпатии:
    19
    Баллы:
    29
    Извините, пропустила всю переписку.
    Интервал может меняться в зависимости от настроек (15 / 30 / 60 минут). Сейчас тестю по разным, но когда внедрим будет чётко один, если и будем менять, то это будет происходить крааайне редко, и, однозначно, с начала дня.
    shurikvz, vartanet и _Алексей_, спасибо за мысли, обязательно всё попробую, но, наверное, уже в понедельник, что-то голова отказывается думать сегодня. Потом отпишусь о результате.
    --- Объединение сообщений, 7 ноя 2014 ---
    Что-то совсем туплю сегодня, да, время всегда будет кратно какому-то заранее выбранному значению (15 / 30 / 60 минут).

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