Имя: Пароль:
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) Плохое решение с подзапросами
Особенно если надо делать допобработку номеров и имен
Например нормализовывать их
Тогда один фиг будут циклы уже кодом

Так что не проще ли сразу запросом только получить данные и сгруппировать по нужному партнеру
А сложение контактов внутри группы делать уже кодом?
Заодно еще как надо в том же цикле обрабатывая
19 saradip
 
03.10.25
23:10
(13) Хомер, база знаний это не решение)
Я через код уже решение писал выше, мне просто интересно через скд как это решается
20 saradip
 
03.10.25
23:11
(14) Ну, мне что и приходило в голову, обходить результат запроса, суммируя поля. А вот без кода, как решить?)
21 Timon1405
 
03.10.25
23:38
формула СоединитьСтроки(ТаблицаЗначений(Телефон, Доп), ",", " ")
СКД под катом
СКД<?xml version="1.0" encoding="UTF-8"?>
<DataCompositionSchema xmlns="http://v8.1c.ru/8.1/data-composition-system/schema xmlns:dcscom="http://v8.1c.ru/8.1/data-composition-system/common xmlns:dcscor="http://v8.1c.ru/8.1/data-composition-system/core xmlns:dcsset="http://v8.1c.ru/8.1/data-composition-system/settings xmlns:v8="http://v8.1c.ru/8.1/data/core xmlns:v8ui="http://v8.1c.ru/8.1/data/ui xmlns:xs="http://www.w3.org/2001/XMLSchema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
    <dataSource>
        <name>ИсточникДанных1</name>
        <dataSourceType>Local</dataSourceType>
    </dataSource>
    <dataSet xsi:type="DataSetQuery">
        <name>НаборДанных1</name>
        <field xsi:type="DataSetFieldField">
            <dataPath>партнер</dataPath>
            <field>партнер</field>
            <title xsi:type="v8:LocalStringType">
                <v8:item>
                    <v8:lang>ru</v8:lang>
                    <v8:content>Партнер</v8:content>
                </v8:item>
            </title>
            <appearance/>
            <inputParameters/>
        </field>
        <field xsi:type="DataSetFieldField">
            <dataPath>телефон</dataPath>
            <field>телефон</field>
            <title xsi:type="v8:LocalStringType">
                <v8:item>
                    <v8:lang>ru</v8:lang>
                    <v8:content>Телефон</v8:content>
                </v8:item>
            </title>
            <appearance/>
            <inputParameters/>
        </field>
        <field xsi:type="DataSetFieldField">
            <dataPath>доп</dataPath>
            <field>доп</field>
            <title xsi:type="v8:LocalStringType">
                <v8:item>
                    <v8:lang>ru</v8:lang>
                    <v8:content>Доп</v8:content>
                </v8:item>
            </title>
            <appearance/>
            <inputParameters/>
        </field>
        <dataSource>ИсточникДанных1</dataSource>
        <query>ВЫБРАТЬ
    "Иван" КАК партнер,
    "89111111111" КАК телефон,
    "Олеся" КАК доп

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

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

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

ВЫБРАТЬ
    "Петр",
    "89222222222",
    "Петух"

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

ВЫБРАТЬ
    "Петр",
    "89222222223",
    "Дятел"</query>
    </dataSet>
    <calculatedField>
        <dataPath>Инфо</dataPath>
        <expression/>
        <title xsi:type="v8:LocalStringType">
            <v8:item>
                <v8:lang>ru</v8:lang>
                <v8:content>Инфо</v8:content>
            </v8:item>
        </title>
        <appearance/>
        <inputParameters/>
    </calculatedField>
    <totalField>
        <dataPath>Инфо</dataPath>
        <expression>СоединитьСтроки(ТаблицаЗначений(Телефон, Доп), ",", " ")</expression>
        <group>партнер</group>
    </totalField>
    <settingsVariant>
        <dcsset:name>Основной</dcsset:name>
        <dcsset:presentation xsi:type="xs:string">Основной</dcsset:presentation>
        <dcsset:settings xmlns:style="http://v8.1c.ru/8.1/data/ui/style xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows
            <dcsset:selection>
                <dcsset:item xsi:type="dcsset:SelectedItemField">
                    <dcsset:field>Инфо</dcsset:field>
                </dcsset:item>
            </dcsset:selection>
            <dcsset:outputParameters/>
            <dcsset:item xsi:type="dcsset:StructureItemGroup">
                <dcsset:groupItems>
                    <dcsset:item xsi:type="dcsset:GroupItemField">
                        <dcsset:field>партнер</dcsset:field>
                        <dcsset:groupType>Items</dcsset:groupType>
                        <dcsset:periodAdditionType>None</dcsset:periodAdditionType>
                        <dcsset:periodAdditionBegin xsi:type="xs:dateTime">0001-01-01T00:00:00</dcsset:periodAdditionBegin>
                        <dcsset:periodAdditionEnd xsi:type="xs:dateTime">0001-01-01T00:00:00</dcsset:periodAdditionEnd>
                    </dcsset:item>
                </dcsset:groupItems>
                <dcsset:order>
                    <dcsset:item xsi:type="dcsset:OrderItemAuto"/>
                </dcsset:order>
                <dcsset:selection>
                    <dcsset:item xsi:type="dcsset:SelectedItemAuto"/>
                </dcsset:selection>
                <dcsset:outputParameters/>
            </dcsset:item>
        </dcsset:settings>
    </settingsVariant>
</DataCompositionSchema>

Закон Брукера: Даже маленькая практика стоит большой теории.