8.х Помогите доработать запрос

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем ketonija, 4 мар 2015.

  1. TopicStarter Overlay
    ketonija
    Offline

    ketonija

    Регистрация:
    1 ноя 2012
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1
    Запрос выводит номера телефонов клиентов в колонке "Контакт". В колонке "Число контактов" - количество записей телефонов в контактной информации клиента. Нужно доработать запрос чтоб в колонке "Контакт" при числе контактов более 1 вместо слова "нет" выводился список телефонов через точку с запятой. На каждого клиента должна быть только одна строка результата запроса.

    Код:
    ВЫБРАТЬ
    КонтактнаяИнформация.Объект,
    КонтактнаяИнформация.Вид,
    ВЫРАЗИТЬ(КонтактнаяИнформация.Представление КАК СТРОКА(100)) КАК Контакт
    ПОМЕСТИТЬ Контакты
    ИЗ
    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
    ГДЕ
    КонтактнаяИнформация.Тип = &Тип
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    Клиенты.Объект КАК Клиент,
    ВложенныйЗапрос.ЧислоКонтактов,
    ЕСТЬNULL(Контакты.Контакт, "нет") КАК Контакт
    ИЗ
    (ВЫБРАТЬ
    КонтактнаяИнформация.Объект КАК Объект
    ИЗ
    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
    
    СГРУППИРОВАТЬ ПО
    КонтактнаяИнформация.Объект) КАК Клиенты
    ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    КонтактнаяИнформация.Объект КАК Объект,
    КОЛИЧЕСТВО(КонтактнаяИнформация.Вид) КАК ЧислоКонтактов
    ИЗ
    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
    ГДЕ
    КонтактнаяИнформация.Тип = &Тип
    
    СГРУППИРОВАТЬ ПО
    КонтактнаяИнформация.Объект) КАК ВложенныйЗапрос
    ПО Клиенты.Объект = ВложенныйЗапрос.Объект
    ЛЕВОЕ СОЕДИНЕНИЕ Контакты КАК Контакты
    ПО Клиенты.Объект = Контакты.Объект
    И (ВложенныйЗапрос.ЧислоКонтактов = 1)
    Последнее редактирование модератором: 4 мар 2015
  2. nickpugachev
    Offline

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

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    такое запросом не сделаете, только кодом
  3. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.639
    Симпатии:
    948
    Баллы:
    204
    Делайте кодом, У Вас будет ТЗ в котрой одна из колонок будет иметь тип массив, с номерами телефонов. Передавайте этот набор в СКД и выводите.
    СКД может выводить массивы.
    --- Объединение сообщений, 4 мар 2015 ---
    либо можно в том же СКД описать в общем модуле функцию в которую передаешь контрагента, она вернет массив телефонов его. и в Вычслемых полях сделать поле
  4. TopicStarter Overlay
    ketonija
    Offline

    ketonija

    Регистрация:
    1 ноя 2012
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1
    Ради спортивного интереса я решил все-таки сделать это запросом, решение получилось немного извращенное, но вроде работает. Параметр "ШиринаКолонки" должен быть не меньше чем длина самого длинного контакта, 1000 вполне подходит.
    Код:
    ВЫБРАТЬ
        КОЛИЧЕСТВО(ВЫРАЗИТЬ(КонтактнаяИнформация1.Представление КАК СТРОКА(100))) КАК Номер,
        КонтактнаяИнформация.Объект КАК Объект,
        ВЫРАЗИТЬ(КонтактнаяИнформация.Представление КАК СТРОКА(100)) КАК Контакт,
        КонтактнаяИнформация.Вид
    ПОМЕСТИТЬ Контакты1
    ИЗ
        РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация1
            ПО ((ВЫРАЗИТЬ(КонтактнаяИнформация.Представление КАК СТРОКА(100))) >= (ВЫРАЗИТЬ(КонтактнаяИнформация1.Представление КАК СТРОКА(100))))
                И КонтактнаяИнформация.Объект = КонтактнаяИнформация1.Объект
    ГДЕ
        КонтактнаяИнформация.Тип = &Тип
        И КонтактнаяИнформация1.Тип = &Тип
    
    СГРУППИРОВАТЬ ПО
        КонтактнаяИнформация.Объект,
        КонтактнаяИнформация.Вид,
        ВЫРАЗИТЬ(КонтактнаяИнформация.Представление КАК СТРОКА(100))
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ РАЗЛИЧНЫЕ
        ВЫБОР
            КОГДА Дано.Контакт = ""
                ТОГДА "нет"
            ИНАЧЕ Дано.Контакт + ";    "
        КОНЕЦ КАК НомерСтроки,
        ВЫБОР
            КОГДА Дано.Контакт = ""
                ТОГДА "нет"
            ИНАЧЕ Дано.Контакт + ";    "
        КОНЕЦ КАК а,
        Дано.Объект
    ПОМЕСТИТЬ Дано
    ИЗ
        Контакты1 КАК Дано
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        0 КАК ё
    ПОМЕСТИТЬ Р0
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        1
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        2 * Р1.ё + Р0.ё КАК ё
    ПОМЕСТИТЬ Р10
    ИЗ
        Р0 КАК Р1,
        Р0 КАК Р0
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        4 * Р32.ё + Р10.ё КАК ё
    ПОМЕСТИТЬ Р3210
    ИЗ
        Р10 КАК Р32,
        Р10 КАК Р10
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        16 * Р7654.ё + Р3210.ё КАК ё
    ПОМЕСТИТЬ Р76543210
    ИЗ
        Р3210 КАК Р7654,
        Р3210 КАК Р3210
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        8 * Р76543210.ё + 2 * Р10.ё + Р0.ё + 1 КАК ё
    ПОМЕСТИТЬ РА9876543210
    ИЗ
        Р76543210 КАК Р76543210,
        Р10 КАК Р10,
        Р0 КАК Р0
    ГДЕ
        8 * Р76543210.ё + 2 * Р10.ё + Р0.ё < &ШиринаКолонки
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        Дано.НомерСтроки,
        РА9876543210.ё,
        ВЫБОР ПОДСТРОКА(Дано.а, РА9876543210.ё, 1)
            КОГДА " "
                ТОГДА "_"
            ИНАЧЕ ПОДСТРОКА(Дано.а, РА9876543210.ё, 1)
        КОНЕЦ КАК а,
        Дано.Объект
    ПОМЕСТИТЬ Буквы
    ИЗ
        Дано КАК Дано,
        РА9876543210 КАК РА9876543210
    ГДЕ
        ПОДСТРОКА(Дано.а, РА9876543210.ё, 1) + "!" <> "!"
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        Буквы.НомерСтроки,
        МАКСИМУМ(Буквы.ё) КАК СтрДлина,
        Буквы.Объект
    ПОМЕСТИТЬ Длины
    ИЗ
        Буквы КАК Буквы
    
    СГРУППИРОВАТЬ ПО
        Буквы.НомерСтроки,
        Буквы.Объект
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        Буквы.ё + СУММА(ЕСТЬNULL(Длины.СтрДлина, 0)) КАК ё,
        Буквы.а,
        Буквы.Объект
    ПОМЕСТИТЬ Таб
    ИЗ
        Буквы КАК Буквы
            ЛЕВОЕ СОЕДИНЕНИЕ Длины КАК Длины
            ПО Буквы.НомерСтроки > Длины.НомерСтроки
                И Буквы.Объект = Длины.Объект
    
    СГРУППИРОВАТЬ ПО
        Буквы.НомерСтроки,
        Буквы.ё,
        Буквы.а,
        Буквы.Объект
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ВЫРАЗИТЬ(Таб.ё / 2 КАК ЧИСЛО(15, 0)) КАК е,
        Таб.ё,
        Таб.а,
        Таб.Объект
    ПОМЕСТИТЬ Шаг
    ИЗ
        Таб КАК Таб
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    УНИЧТОЖИТЬ Таб
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        Шаг.е КАК ё,
        МАКСИМУМ(ВЫБОР Шаг.е * 2 - Шаг.ё
                КОГДА 1
                    ТОГДА Шаг.а
                ИНАЧЕ ""
            КОНЕЦ) + МАКСИМУМ(ВЫБОР Шаг.е * 2 - Шаг.ё
                КОГДА 1
                    ТОГДА ""
                ИНАЧЕ Шаг.а
            КОНЕЦ) КАК а,
        Шаг.Объект
    ПОМЕСТИТЬ Таб
    ИЗ
        Шаг КАК Шаг
    
    СГРУППИРОВАТЬ ПО
        Шаг.е,
        Шаг.Объект
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    УНИЧТОЖИТЬ Шаг
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ВЫРАЗИТЬ(Таб.ё / 2 КАК ЧИСЛО(15, 0)) КАК е,
        Таб.ё,
        Таб.а,
        Таб.Объект
    ПОМЕСТИТЬ Шаг
    ИЗ
        Таб КАК Таб
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    УНИЧТОЖИТЬ Таб
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        Шаг.е КАК ё,
        МАКСИМУМ(ВЫБОР Шаг.е * 2 - Шаг.ё
                КОГДА 1
                    ТОГДА Шаг.а
                ИНАЧЕ ""
            КОНЕЦ) + МАКСИМУМ(ВЫБОР Шаг.е * 2 - Шаг.ё
                КОГДА 1
                    ТОГДА ""
                ИНАЧЕ Шаг.а
            КОНЕЦ) КАК а,
        Шаг.Объект
    ПОМЕСТИТЬ Таб
    ИЗ
        Шаг КАК Шаг
    
    СГРУППИРОВАТЬ ПО
        Шаг.е,
        Шаг.Объект
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    УНИЧТОЖИТЬ Шаг
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ВЫРАЗИТЬ(Таб.ё / 2 КАК ЧИСЛО(15, 0)) КАК е,
        Таб.ё,
        Таб.а,
        Таб.Объект
    ПОМЕСТИТЬ Шаг
    ИЗ
        Таб КАК Таб
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    УНИЧТОЖИТЬ Таб
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        Шаг.е КАК ё,
        МАКСИМУМ(ВЫБОР Шаг.е * 2 - Шаг.ё
                КОГДА 1
                    ТОГДА Шаг.а
                ИНАЧЕ ""
            КОНЕЦ) + МАКСИМУМ(ВЫБОР Шаг.е * 2 - Шаг.ё
                КОГДА 1
                    ТОГДА ""
                ИНАЧЕ Шаг.а
            КОНЕЦ) КАК а,
        Шаг.Объект
    ПОМЕСТИТЬ Таб
    ИЗ
        Шаг КАК Шаг
    
    СГРУППИРОВАТЬ ПО
        Шаг.е,
        Шаг.Объект
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    УНИЧТОЖИТЬ Шаг
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ВЫРАЗИТЬ(Таб.ё / 2 КАК ЧИСЛО(15, 0)) КАК е,
        Таб.ё,
        Таб.а,
        Таб.Объект
    ПОМЕСТИТЬ Шаг
    ИЗ
        Таб КАК Таб
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    УНИЧТОЖИТЬ Таб
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        Шаг.е КАК ё,
        МАКСИМУМ(ВЫБОР Шаг.е * 2 - Шаг.ё
                КОГДА 1
                    ТОГДА Шаг.а
                ИНАЧЕ ""
            КОНЕЦ) + МАКСИМУМ(ВЫБОР Шаг.е * 2 - Шаг.ё
                КОГДА 1
                    ТОГДА ""
                ИНАЧЕ Шаг.а
            КОНЕЦ) КАК а,
        Шаг.Объект
    ПОМЕСТИТЬ Таб
    ИЗ
        Шаг КАК Шаг
    
    СГРУППИРОВАТЬ ПО
        Шаг.е,
        Шаг.Объект
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    УНИЧТОЖИТЬ Шаг
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ВЫРАЗИТЬ(Таб.ё / 2 КАК ЧИСЛО(15, 0)) КАК е,
        Таб.ё,
        Таб.а,
        Таб.Объект
    ПОМЕСТИТЬ Шаг
    ИЗ
        Таб КАК Таб
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    УНИЧТОЖИТЬ Таб
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        Шаг.е КАК ё,
        МАКСИМУМ(ВЫБОР Шаг.е * 2 - Шаг.ё
                КОГДА 1
                    ТОГДА Шаг.а
                ИНАЧЕ ""
            КОНЕЦ) + МАКСИМУМ(ВЫБОР Шаг.е * 2 - Шаг.ё
                КОГДА 1
                    ТОГДА ""
                ИНАЧЕ Шаг.а
            КОНЕЦ) КАК а,
        Шаг.Объект
    ПОМЕСТИТЬ Таб
    ИЗ
        Шаг КАК Шаг
    
    СГРУППИРОВАТЬ ПО
        Шаг.е,
        Шаг.Объект
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    УНИЧТОЖИТЬ Шаг
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ВЫРАЗИТЬ(Таб.ё / 2 КАК ЧИСЛО(15, 0)) КАК е,
        Таб.ё,
        Таб.а,
        Таб.Объект
    ПОМЕСТИТЬ Шаг
    ИЗ
        Таб КАК Таб
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    УНИЧТОЖИТЬ Таб
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        Шаг.е КАК ё,
        МАКСИМУМ(ВЫБОР Шаг.е * 2 - Шаг.ё
                КОГДА 1
                    ТОГДА Шаг.а
                ИНАЧЕ ""
            КОНЕЦ) + МАКСИМУМ(ВЫБОР Шаг.е * 2 - Шаг.ё
                КОГДА 1
                    ТОГДА ""
                ИНАЧЕ Шаг.а
            КОНЕЦ) КАК а,
        Шаг.Объект
    ПОМЕСТИТЬ Таб
    ИЗ
        Шаг КАК Шаг
    
    СГРУППИРОВАТЬ ПО
        Шаг.е,
        Шаг.Объект
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    УНИЧТОЖИТЬ Шаг
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        Таб.Объект,
        Таб.а КАК Контакт
    ПОМЕСТИТЬ Контакты
    ИЗ
        Таб КАК Таб
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        Клиенты.Объект КАК Клиент,
        ВложенныйЗапрос.ЧислоКонтактов,
        ЕСТЬNULL(Контакты.Контакт, "нет") КАК Контакт
    ИЗ
        (ВЫБРАТЬ
            КонтактнаяИнформация.Объект КАК Объект
        ИЗ
            РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
      
        СГРУППИРОВАТЬ ПО
            КонтактнаяИнформация.Объект) КАК Клиенты
            ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                КонтактнаяИнформация.Объект КАК Объект,
                КОЛИЧЕСТВО(КонтактнаяИнформация.Вид) КАК ЧислоКонтактов
            ИЗ
                РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
            ГДЕ
                КонтактнаяИнформация.Тип = &Тип
          
            СГРУППИРОВАТЬ ПО
                КонтактнаяИнформация.Объект) КАК ВложенныйЗапрос
            ПО Клиенты.Объект = ВложенныйЗапрос.Объект
            ЛЕВОЕ СОЕДИНЕНИЕ Контакты КАК Контакты
            ПО Клиенты.Объект = Контакты.Объект
    
    УПОРЯДОЧИТЬ ПО
        Клиенты.Объект.Наименование 
    пользуйтесь тегами для оформления кода
    Последнее редактирование модератором: 5 мар 2015

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