Имя: Пароль:
1C
 
Конкатенация ТЗ с группировкой 8.3.27
0 saradip
 
03.10.25
11:50
Добрый день.
Подскажите, пожалуйста, способ/алгоритм решения задачи:
Есть таблица значений
Партнер Телефон Примечение
Иван 89111111111 Олеся
Иван 89111111112 Снежана
Петр 89222222222 Петух
Петр 89222222223 Дятел

Нужно сгруппировать партнера и склеить строку партнер + телефон + примечание в следующем виде:
Иван 89111111111 Олеся, 89111111112 Снежана
Петр 89222222222 Петух, 89222222223 Дятел

Инструментов для решения три:
1. код
2. скд
3. запрос
1 kubik_live
 
03.10.25
12:17
На выходе то что?
Таблица значений? Массив?
2 unenu
 
03.10.25
12:18
запрос конечно
3 saradip
 
03.10.25
12:36
(1) ТЗ
4 craxx
 
03.10.25
12:22
(2) Не согласен. СКД проще.
5 timurhv
 
03.10.25
12:23
6 timurhv
 
03.10.25
12:26
"Петух", "Дятел" - так в ТЗ написано? У вас что, дружный токсичный коллектив? :)
7 ads55
 
03.10.25
12:31
(6) "У вас что, дружный токсичный коллектив? :)"

Это ты ещё ник ТС-а задом наперед не прочитал :)

ЗЫ. Я за СКД
8 saradip
 
03.10.25
12:32
Вообще, можно запросом данные в отсортированную по партнеру выборку закинуть и в цикле присваивать переменной "ПредыдущийПартнер" и "ТекущийПартнер" значения партнера, если предыдущий = текущий складывать значения (телефона + примечание) в переменную "контакты".
В итоге получится тз с решением
9 saradip
 
03.10.25
12:33
(5) Спасибо, отличная информация
10 timurhv
 
03.10.25
12:35
(7)
11 unenu
 
03.10.25
12:44
(10) зато не бот и вопрос грамотный.
12 saradip
 
03.10.25
14:04
Так и что, кто там писал про СКД, не вижу решения)
В результате, если у партнера три контакта, должно быть поле вида:
Партнер + телефон + примечание + телефон + примечание + телефон + примечание
13 Homer
 
03.10.25
14:22
(12) тебе в (5) все показали
14 Garykom
 
гуру
03.10.25
16:21
(0) Классически это запрос с группировками + обход по группировкам
15 unenu
 
03.10.25
16:39
Подробности
ВЫБРАТЬ
    "Иван" КАК Партнер,
    "89111111111" КАК Телефон,
    "Олеся" КАК Примечание
ПОМЕСТИТЬ ВТ_Набор

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Петр",
    "89222222222",
    "Тукан"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Иван",
    "89111111112",
    "Снежана"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Петр",
    "89222222223",
    "Дятел"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Вася",
    "89222222224",
    "Лиса"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Вася",
    "89222222225",
    "Глухарь"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Вася",
    "89222222226",
    "Павлин"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Саша",
    "89222222227",
    "Дрозд"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Саша",
    "89222222228",
    "Лосось"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Саша",
    "89222222229",
    "Колбаса"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Саша",
    "89222222230",
    "Пиво"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Саша",
    "89222222231",
    "Слива"
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТТ.Партнер КАК Партнер,
    ТТ.Инфо КАК Инфо,
    АВТОНОМЕРЗАПИСИ() КАК НомерЗаписи,
    1 КАК Счетчик
ПОМЕСТИТЬ ВТ_НомерЗаписи
ИЗ
    (ВЫБРАТЬ ПЕРВЫЕ 1000000000
        Т.Партнер КАК Партнер,
        Т.Телефон + " " + Т.Примечание КАК Инфо
    ИЗ
        ВТ_Набор КАК Т
    
    УПОРЯДОЧИТЬ ПО
        Партнер,
        Т.Телефон) КАК ТТ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТТ.Партнер КАК Партнер,
    ТТ.Инфо КАК Инфо,
    ТТ.НомерВГруппе КАК НомерВГруппе
ПОМЕСТИТЬ ВТ_ПорядокГрупп
ИЗ
    (ВЫБРАТЬ
        Т1.Партнер КАК Партнер,
        Т1.Инфо КАК Инфо,
        СУММА(Т2.Счетчик) КАК НомерВГруппе
    ИЗ
        ВТ_НомерЗаписи КАК Т1
            ЛЕВОЕ СОЕДИНЕНИЕ ВТ_НомерЗаписи КАК Т2
            ПО Т1.Партнер = Т2.Партнер
                И Т1.НомерЗаписи >= Т2.НомерЗаписи
    
    СГРУППИРОВАТЬ ПО
        Т1.Партнер,
        Т1.Инфо) КАК ТТ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Т.Партнер КАК Партнер,
    МАКСИМУМ(ВЫБОР
            КОГДА Т.НомерВГруппе = 1
                ТОГДА Т.Инфо
            ИНАЧЕ ""
        КОНЕЦ) + МАКСИМУМ(ВЫБОР
            КОГДА Т.НомерВГруппе = 2
                ТОГДА ", " + Т.Инфо
            ИНАЧЕ ""
        КОНЕЦ) + МАКСИМУМ(ВЫБОР
            КОГДА Т.НомерВГруппе = 3
                ТОГДА ", " + Т.Инфо
            ИНАЧЕ ""
        КОНЕЦ) + МАКСИМУМ(ВЫБОР
            КОГДА Т.НомерВГруппе = 4
                ТОГДА ", " + Т.Инфо
            ИНАЧЕ ""
        КОНЕЦ) + МАКСИМУМ(ВЫБОР
            КОГДА Т.НомерВГруппе = 5
                ТОГДА ", " + Т.Инфо
            ИНАЧЕ ""
        КОНЕЦ) + &ДополнительныйТекстКогдаПорядокБольше5 КАК ИнфоВсе
ИЗ
    ВТ_ПорядокГрупп КАК Т

СГРУППИРОВАТЬ ПО
    Т.Партнер


Запросом считаю проще. Текст запроса просто забросьте в консоль и готово.
Программно гораздо легче динамически добавить текст в запрос
&ДополнительныйТекстКогдаПорядокБольше5 если частей строки N.
Вычислить N можно сверткой исходной таблицы.

Реализация такой задачи в СКД(программно) - это гораздо больше кода и мороки.
Да и 5 секций тут лишнее. Достаточно двух, а далее дополнение текста через параметр.
16 Eiffil123
 
03.10.25
16:50
(12) кодом конечно же. Сделать копию таблицы, свернуть по полям 1 и 2. потом циклом по ней и поиском строк в исходной.
Суммировать поля в массив, соединить через СтрСоединить
17 unenu
 
03.10.25
16:53
(16) а если это BI и там миллиард записей? )
18 Garykom
 
гуру
03.10.25
18:40
(15) Плохое решение с подзапросами
Особенно если надо делать допобработку номеров и имен
Например нормализовывать их
Тогда один фиг будут циклы уже кодом

Так что не проще ли сразу запросом только получить данные и сгруппировать по нужному партнеру
А сложение контактов внутри группы делать уже кодом?
Заодно еще как надо в том же цикле обрабатывая
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.