Имя: Пароль:
1C
 
Объединить строки в запросе
,
0 Alekzander Wolf
 
21.12.15
12:57
Есть простенький запрос

ВЫБРАТЬ
    СдельныйНарядИсполнители.Сотрудник
ИЗ
    Документ.СдельныйНаряд.Исполнители КАК СдельныйНарядИсполнители
ГДЕ
    СдельныйНарядИсполнители.Ссылка = &Наряд


на выходе получаю
Иванов
Петров
Сидоров

хочу получить одной строкой всех сотрудников:
Иванов Петров Сидоров

не могу додуматься как это сделать, подскажите
1 FIXXXL
 
21.12.15
12:58
в СКД можно, но как не помню
2 ObjectRelation Model
 
21.12.15
12:58
СКД или конкатенация в цикле
3 elCust
 
21.12.15
12:59
4 Alekzander Wolf
 
21.12.15
13:00
Знаю, что в СКД есть функция СоединитьСтроки, но у меня не получилось сделать, так как нужно мне. Можно ли сделать это простым запросом?
5 elCust
 
21.12.15
13:00
6 Alekzander Wolf
 
21.12.15
13:09
(5) лучше уж СКД дальше грызть
7 PR третий
 
21.12.15
13:10
(0) Никак. И не нужно так делать. Храни в документе в реквизите шапки.
8 1С Коннект
 
21.12.15
13:29
Решение нужно вообще или с пределом скажем в 1000 сотрудников?
9 Alekzander Wolf
 
21.12.15
13:44
(8) да в принципе и предел 100 сотрудников вполне хватит
10 Nuobu
 
21.12.15
13:59
(9) Тогда грызи СКД.
11 Мимохожий Однако
 
21.12.15
14:02
Посмотри как сделано в ЗУП. Там по варианту (7) вполне доступно.
12 1С Коннект
 
21.12.15
17:26
До 100 сотрудников если нужно больше то по аналогии



ВЫБРАТЬ
    ВЫРАЗИТЬ(ЕСТЬNULL(Сотрудники.Наименование, "") КАК СТРОКА(100)) КАК Имя
ПОМЕСТИТЬ втСотрудники
ИЗ
    Справочник.Сотрудники КАК Сотрудники

СГРУППИРОВАТЬ ПО
    ВЫРАЗИТЬ(ЕСТЬNULL(Сотрудники.Наименование, "") КАК СТРОКА(100))
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    втСотрудники.Имя,
    1 КАК НПП10
ПОМЕСТИТЬ втСотрудники10
ИЗ
    втСотрудники КАК втСотрудники
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    взСотрудникиНПП10.Имя,
    взСотрудникиНПП10.НПП10
ПОМЕСТИТЬ втСотрудники10НПП
ИЗ
    (ВЫБРАТЬ
        ВложенныйЗапрос.Имя КАК Имя,
        СУММА(втСотрудники10.НПП10) КАК НПП10
    ИЗ
        (ВЫБРАТЬ
            втСотрудники10.Имя КАК Имя,
            втСотрудники10.НПП10 КАК НПП10
        ИЗ
            втСотрудники10 КАК втСотрудники10) КАК ВложенныйЗапрос
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ втСотрудники10 КАК втСотрудники10
            ПО ВложенныйЗапрос.Имя <= втСотрудники10.Имя
    
    СГРУППИРОВАТЬ ПО
        ВложенныйЗапрос.Имя) КАК взСотрудникиНПП10
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВложенныйЗапрос.ИмяКаждыйДесятый,
    1 КАК НПП100,
    ВложенныйЗапрос.Имена
ПОМЕСТИТЬ втСотрудники100
ИЗ
    (ВЫБРАТЬ
        КаждыйДесятый.Имя КАК ИмяКаждыйДесятый,
        ВЫБОР
            КОГДА ЕСТЬNULL(втСотрудники10НПП.Имя, "") = ""
                ТОГДА ""
            ИНАЧЕ втСотрудники10НПП.Имя + ", "
        КОНЕЦ + ВЫБОР
            КОГДА ЕСТЬNULL(втСотрудники10НПП1.Имя, "") = ""
                ТОГДА ""
            ИНАЧЕ втСотрудники10НПП1.Имя + ", "
        КОНЕЦ + ВЫБОР
            КОГДА ЕСТЬNULL(втСотрудники10НПП2.Имя, "") = ""
                ТОГДА ""
            ИНАЧЕ втСотрудники10НПП2.Имя + ", "
        КОНЕЦ + ВЫБОР
            КОГДА ЕСТЬNULL(втСотрудники10НПП3.Имя, "") = ""
                ТОГДА ""
            ИНАЧЕ втСотрудники10НПП3.Имя + ", "
        КОНЕЦ + ВЫБОР
            КОГДА ЕСТЬNULL(втСотрудники10НПП4.Имя, "") = ""
                ТОГДА ""
            ИНАЧЕ втСотрудники10НПП4.Имя + ", "
        КОНЕЦ + ВЫБОР
            КОГДА ЕСТЬNULL(втСотрудники10НПП5.Имя, "") = ""
                ТОГДА ""
            ИНАЧЕ втСотрудники10НПП5.Имя + ", "
        КОНЕЦ + ВЫБОР
            КОГДА ЕСТЬNULL(втСотрудники10НПП6.Имя, "") = ""
                ТОГДА ""
            ИНАЧЕ втСотрудники10НПП6.Имя + ", "
        КОНЕЦ + ВЫБОР
            КОГДА ЕСТЬNULL(втСотрудники10НПП7.Имя, "") = ""
                ТОГДА ""
            ИНАЧЕ втСотрудники10НПП7.Имя + ", "
        КОНЕЦ + ВЫБОР
            КОГДА ЕСТЬNULL(втСотрудники10НПП8.Имя, "") = ""
                ТОГДА ""
            ИНАЧЕ втСотрудники10НПП8.Имя + ", "
        КОНЕЦ + ВЫБОР
            КОГДА ЕСТЬNULL(втСотрудники10НПП9.Имя, "") = ""
                ТОГДА ""
            ИНАЧЕ втСотрудники10НПП9.Имя + ", "
        КОНЕЦ КАК Имена
    ИЗ
        (ВЫБРАТЬ
            втСотрудники10НПП.Имя КАК Имя,
            втСотрудники10НПП.НПП10 + ВЫБОР
                КОГДА втСотрудники10НПП.НПП10 - (ВЫРАЗИТЬ(втСотрудники10НПП.НПП10 / 10 КАК ЧИСЛО(10, 0))) * 10 <> 0
                    ТОГДА ((ВЫРАЗИТЬ(втСотрудники10НПП.НПП10 / 10 КАК ЧИСЛО(10, 0))) + ВЫБОР
                            КОГДА (ВЫРАЗИТЬ(втСотрудники10НПП.НПП10 / 10 КАК ЧИСЛО(10, 0))) > втСотрудники10НПП.НПП10 / 10
                                ТОГДА 0
                            ИНАЧЕ 1
                        КОНЕЦ) * 10 - втСотрудники10НПП.НПП10
                ИНАЧЕ 0
            КОНЕЦ КАК НПП10до10
        ИЗ
            (ВЫБРАТЬ
                МАКСИМУМ(втСотрудники10НПП.НПП10) КАК НПП10Макс
            ИЗ
                втСотрудники10НПП КАК втСотрудники10НПП) КАК взСотруденик10Макс,
            втСотрудники10НПП КАК втСотрудники10НПП
        ГДЕ
            (втСотрудники10НПП.НПП10 = взСотруденик10Макс.НПП10Макс
                    ИЛИ втСотрудники10НПП.НПП10 / 10 = (ВЫРАЗИТЬ(втСотрудники10НПП.НПП10 / 10 КАК ЧИСЛО(10, 0))))) КАК КаждыйДесятый
            ЛЕВОЕ СОЕДИНЕНИЕ втСотрудники10НПП КАК втСотрудники10НПП
            ПО КаждыйДесятый.НПП10до10 = втСотрудники10НПП.НПП10
            ЛЕВОЕ СОЕДИНЕНИЕ втСотрудники10НПП КАК втСотрудники10НПП1
            ПО (КаждыйДесятый.НПП10до10 = втСотрудники10НПП1.НПП10 + 1)
            ЛЕВОЕ СОЕДИНЕНИЕ втСотрудники10НПП КАК втСотрудники10НПП2
            ПО (КаждыйДесятый.НПП10до10 = втСотрудники10НПП2.НПП10 + 2)
            ЛЕВОЕ СОЕДИНЕНИЕ втСотрудники10НПП КАК втСотрудники10НПП3
            ПО (КаждыйДесятый.НПП10до10 = втСотрудники10НПП3.НПП10 + 3)
            ЛЕВОЕ СОЕДИНЕНИЕ втСотрудники10НПП КАК втСотрудники10НПП4
            ПО (КаждыйДесятый.НПП10до10 = втСотрудники10НПП4.НПП10 + 4)
            ЛЕВОЕ СОЕДИНЕНИЕ втСотрудники10НПП КАК втСотрудники10НПП6
            ПО (КаждыйДесятый.НПП10до10 = втСотрудники10НПП6.НПП10 + 6)
            ЛЕВОЕ СОЕДИНЕНИЕ втСотрудники10НПП КАК втСотрудники10НПП5
            ПО (КаждыйДесятый.НПП10до10 = втСотрудники10НПП5.НПП10 + 5)
            ЛЕВОЕ СОЕДИНЕНИЕ втСотрудники10НПП КАК втСотрудники10НПП7
            ПО (КаждыйДесятый.НПП10до10 = втСотрудники10НПП7.НПП10 + 7)
            ЛЕВОЕ СОЕДИНЕНИЕ втСотрудники10НПП КАК втСотрудники10НПП9
            ПО (КаждыйДесятый.НПП10до10 = втСотрудники10НПП9.НПП10 + 9)
            ЛЕВОЕ СОЕДИНЕНИЕ втСотрудники10НПП КАК втСотрудники10НПП8
            ПО (КаждыйДесятый.НПП10до10 = втСотрудники10НПП8.НПП10 + 8)) КАК ВложенныйЗапрос
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    взСотрудникиНПП100.ИмяКаждыйДесятый,
    взСотрудникиНПП100.НПП100,
    взСотрудникиНПП100.Имена
ПОМЕСТИТЬ втСотрудники100НПП
ИЗ
    (ВЫБРАТЬ
        ВложенныйЗапрос.ИмяКаждыйДесятый КАК ИмяКаждыйДесятый,
        СУММА(ВложенныйЗапрос.НПП100) КАК НПП100,
        ВложенныйЗапрос.Имена КАК Имена
    ИЗ
        (ВЫБРАТЬ
            втСотрудники100.ИмяКаждыйДесятый КАК ИмяКаждыйДесятый,
            втСотрудники100.НПП100 КАК НПП100,
            втСотрудники100.Имена КАК Имена
        ИЗ
            втСотрудники100 КАК втСотрудники100) КАК ВложенныйЗапрос
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ втСотрудники100 КАК втСотрудники100
            ПО ВложенныйЗапрос.ИмяКаждыйДесятый <= втСотрудники100.ИмяКаждыйДесятый
    
    СГРУППИРОВАТЬ ПО
        ВложенныйЗапрос.ИмяКаждыйДесятый,
        ВложенныйЗапрос.Имена) КАК взСотрудникиНПП100
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВложенныйЗапрос.ИмяКаждыйСотый,
    ВложенныйЗапрос.Имена,
    1 КАК НПП1000
ПОМЕСТИТЬ втСотрудники1000
ИЗ
    (ВЫБРАТЬ
        взКаждыйСотый.ИмяКаждыйСотый КАК ИмяКаждыйСотый,
        ВЫБОР
            КОГДА ЕСТЬNULL(втСотрудники100НПП.ИмяКаждыйДесятый, "") = ""
                ТОГДА ""
            ИНАЧЕ втСотрудники100НПП.Имена + ", "
        КОНЕЦ + ВЫБОР
            КОГДА ЕСТЬNULL(втСотрудники100НПП1.ИмяКаждыйДесятый, "") = ""
                ТОГДА ""
            ИНАЧЕ втСотрудники100НПП1.Имена + ", "
        КОНЕЦ + ВЫБОР
            КОГДА ЕСТЬNULL(втСотрудники100НПП2.ИмяКаждыйДесятый, "") = ""
                ТОГДА ""
            ИНАЧЕ втСотрудники100НПП2.Имена + ", "
        КОНЕЦ + ВЫБОР
            КОГДА ЕСТЬNULL(втСотрудники100НПП3.ИмяКаждыйДесятый, "") = ""
                ТОГДА ""
            ИНАЧЕ втСотрудники100НПП3.Имена + ", "
        КОНЕЦ + ВЫБОР
            КОГДА ЕСТЬNULL(втСотрудники100НПП4.ИмяКаждыйДесятый, "") = ""
                ТОГДА ""
            ИНАЧЕ втСотрудники100НПП4.Имена + ", "
        КОНЕЦ + ВЫБОР
            КОГДА ЕСТЬNULL(втСотрудники100НПП5.ИмяКаждыйДесятый, "") = ""
                ТОГДА ""
            ИНАЧЕ втСотрудники100НПП5.Имена + ", "
        КОНЕЦ + ВЫБОР
            КОГДА ЕСТЬNULL(втСотрудники100НПП6.ИмяКаждыйДесятый, "") = ""
                ТОГДА ""
            ИНАЧЕ втСотрудники100НПП6.Имена + ", "
        КОНЕЦ + ВЫБОР
            КОГДА ЕСТЬNULL(втСотрудники100НПП7.ИмяКаждыйДесятый, "") = ""
                ТОГДА ""
            ИНАЧЕ втСотрудники100НПП7.Имена + ", "
        КОНЕЦ + ВЫБОР
            КОГДА ЕСТЬNULL(втСотрудники100НПП8.ИмяКаждыйДесятый, "") = ""
                ТОГДА ""
            ИНАЧЕ втСотрудники100НПП8.Имена + ", "
        КОНЕЦ + ВЫБОР
            КОГДА ЕСТЬNULL(втСотрудники100НПП9.ИмяКаждыйДесятый, "") = ""
                ТОГДА ""
            ИНАЧЕ втСотрудники100НПП9.Имена + ", "
        КОНЕЦ КАК Имена
    ИЗ
        (ВЫБРАТЬ
            втСотрудники100НПП.ИмяКаждыйДесятый КАК ИмяКаждыйСотый,
            втСотрудники100НПП.НПП100 + ВЫБОР
                КОГДА втСотрудники100НПП.НПП100 / 10 = (ВЫРАЗИТЬ(втСотрудники100НПП.НПП100 / 10 КАК ЧИСЛО(10, 0)))
                    ТОГДА 0
                ИНАЧЕ ((ВЫРАЗИТЬ(втСотрудники100НПП.НПП100 / 10 КАК ЧИСЛО(10, 0))) + ВЫБОР
                        КОГДА (ВЫРАЗИТЬ(втСотрудники100НПП.НПП100 / 10 КАК ЧИСЛО(10, 0))) > втСотрудники100НПП.НПП100 / 10
                            ТОГДА 0
                        ИНАЧЕ 1
                    КОНЕЦ) * 10 - втСотрудники100НПП.НПП100
            КОНЕЦ КАК Нпп100До10
        ИЗ
            (ВЫБРАТЬ
                МАКСИМУМ(втСотрудники100НПП.НПП100) КАК НПП100
            ИЗ
                втСотрудники100НПП КАК втСотрудники100НПП) КАК взМаксСотрудник,
            втСотрудники100НПП КАК втСотрудники100НПП
        ГДЕ
            (взМаксСотрудник.НПП100 = втСотрудники100НПП.НПП100
                    ИЛИ втСотрудники100НПП.НПП100 / 10 = (ВЫРАЗИТЬ(втСотрудники100НПП.НПП100 / 10 КАК ЧИСЛО(10, 0))))) КАК взКаждыйСотый
            ЛЕВОЕ СОЕДИНЕНИЕ втСотрудники100НПП КАК втСотрудники100НПП
            ПО взКаждыйСотый.Нпп100До10 = втСотрудники100НПП.НПП100
            ЛЕВОЕ СОЕДИНЕНИЕ втСотрудники100НПП КАК втСотрудники100НПП1
            ПО (взКаждыйСотый.Нпп100До10 = втСотрудники100НПП1.НПП100 + 1)
            ЛЕВОЕ СОЕДИНЕНИЕ втСотрудники100НПП КАК втСотрудники100НПП2
            ПО (взКаждыйСотый.Нпп100До10 = втСотрудники100НПП2.НПП100 + 2)
            ЛЕВОЕ СОЕДИНЕНИЕ втСотрудники100НПП КАК втСотрудники100НПП3
            ПО (взКаждыйСотый.Нпп100До10 = втСотрудники100НПП3.НПП100 + 3)
            ЛЕВОЕ СОЕДИНЕНИЕ втСотрудники100НПП КАК втСотрудники100НПП4
            ПО (взКаждыйСотый.Нпп100До10 = втСотрудники100НПП4.НПП100 + 4)
            ЛЕВОЕ СОЕДИНЕНИЕ втСотрудники100НПП КАК втСотрудники100НПП5
            ПО (взКаждыйСотый.Нпп100До10 = втСотрудники100НПП5.НПП100 + 5)
            ЛЕВОЕ СОЕДИНЕНИЕ втСотрудники100НПП КАК втСотрудники100НПП6
            ПО (взКаждыйСотый.Нпп100До10 = втСотрудники100НПП6.НПП100 + 6)
            ЛЕВОЕ СОЕДИНЕНИЕ втСотрудники100НПП КАК втСотрудники100НПП7
            ПО (взКаждыйСотый.Нпп100До10 = втСотрудники100НПП7.НПП100 + 7)
            ЛЕВОЕ СОЕДИНЕНИЕ втСотрудники100НПП КАК втСотрудники100НПП8
            ПО (взКаждыйСотый.Нпп100До10 = втСотрудники100НПП8.НПП100 + 8)
            ЛЕВОЕ СОЕДИНЕНИЕ втСотрудники100НПП КАК втСотрудники100НПП9
            ПО (взКаждыйСотый.Нпп100До10 = втСотрудники100НПП9.НПП100 + 9)) КАК ВложенныйЗапрос
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    втСотрудники1000.Имена
ИЗ
    втСотрудники1000 КАК втСотрудники1000
13 FIXXXL
 
21.12.15
17:54
(12) лююютая портянка :)
проще в цикле результат обойти и в свой макет вывести
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс