Имя: Пароль:
1C
1С v8
Объединение повторяющихся строк в Запросе с различным полем
, , ,
0 zhukovia
 
20.05.21
16:46
Есть ТЗ
Петя|М|12|a|
Маша|Ж|12|a|
Маша|Ж|12|б|
Анна|Ж|12|a|
Необходимо произвести объединение частично повторяющихся строк.

Результат
Петя|М|12|a|
Маша|Ж|12|aб|
Анна|Ж|12|a|

Возможно ли решение поставленной задачи в запросе?
1 ДенисЧ
 
20.05.21
16:47
В чистом нет
2 zhukovia
 
20.05.21
16:48
(1) Только через цикл? Или как то еще?
3 ДенисЧ
 
20.05.21
16:49
(2) В СКД, наверное, можно поизвращаться
4 zhukovia
 
20.05.21
16:52
(3) В СКД не хочется чего то. Буду тогда циклом перебирать. Спасибо за ответ, не придется голову ломать как в запросе это сделать.
5 Ivan_495
 
20.05.21
16:53
через внеш функцию в скд
6 zhukovia
 
20.05.21
16:56
(5) С СКД не работал, все делаю на обычных запросах. Поэтому сделаю тогда простым перебором.
7 Kassern
 
20.05.21
17:00
(6) Отличный шанс познакомиться с СКД. В будущем пригодится
8 Said_We
 
20.05.21
17:01
(0) В 1С тоже такой получится запрос. Но извратный.
9 zhukovia
 
20.05.21
17:07
(8) Хотя бы намекните как?
10 zhukovia
 
20.05.21
17:15
(7) СКД можно как то вызвать в форме документа программно для каких либо целей? А то все что я видел это только создание отчетов в конфигураторе мышкой.
11 Kassern
 
20.05.21
17:17
(10) У вас есть модуль объекта, у которого есть предопределенная процедура "ПриКомпоновке" в которой можно как угодно воротить ваш отчет, указывать программно параметры и вообще внешнюю ТЗ передать в СКД.
12 Said_We
 
20.05.21
17:17
https://infostart.ru/1c/articles/407913/
Тут что-то нарисовано, но и в базе знаний на Мисте я встречался.
На мисте лучше было описано.
13 Kassern
 
20.05.21
17:21
(10) Так же в самом СКД можно использовать внешние функции, тут есть немного инфы https://forum.infostart.ru/forum9/topic193220/
14 Said_We
 
20.05.21
17:22
Только нумерацию можно делать без внутреннего соединения через АВТОНОМЕРЗАПИСИ(). Так быстрее отрабатывает, но есть ограничения на количество пронумерованных строк, например ВЫБРАТЬ ПЕРВЫЕ 1316134911.
15 zhukovia
 
20.05.21
17:23
(12) Спасибо за наводку, буду разбираться.
16 zhukovia
 
20.05.21
17:24
(13) Спасибо, попробую поизучать. Может и правда пригодится.
17 mikecool
 
20.05.21
20:45
в скд ресурс массив() - сделает спбж
18 brainguard
 
20.05.21
21:50
(0) Соединение таблицы с самой собой
19 zhukovia
 
21.05.21
06:42
(18) И дальше что?
20 Галахад
 
гуру
21.05.21
07:28
(0) "а" и "б" это строки?
21 zhukovia
 
21.05.21
08:59
(20) Да
22 Галахад
 
гуру
21.05.21
10:35
Если я правильно понял:


    Т1 = Новый ТаблицаЗначений;
    Т1.Колонки.Добавить("Кол1", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(200)));
    Т1.Колонки.Добавить("Кол2", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(200)));
    
    
    НовСтр = Т1.Добавить();
    НовСтр.Кол1 = "Стр1";
    НовСтр.Кол2 = "АА";
    НовСтр = Т1.Добавить();
    НовСтр.Кол1 = "Стр1";
    НовСтр.Кол2 = "ВВ";
    НовСтр = Т1.Добавить();
    НовСтр.Кол1 = "Стр2";
    НовСтр.Кол2 = "СС";
    НовСтр = Т1.Добавить();
    НовСтр.Кол1 = "Стр3";
    НовСтр.Кол2 = "ДД";
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Т1", Т1);
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Т1.Кол1 КАК Кол1,
    |    Т1.Кол2 КАК Кол2
    |ПОМЕСТИТЬ Таблица
    |ИЗ
    |    &Т1 КАК Т1
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    Таблица.Кол1 КАК Кол1,
    |    МИНИМУМ(Таблица.Кол2 + Таблица1.Кол2) КАК Кол2
    |ИЗ
    |    Таблица КАК Таблица
    |        ЛЕВОЕ СОЕДИНЕНИЕ Таблица КАК Таблица1
    |        ПО Таблица.Кол1 = Таблица1.Кол1
    |            И Таблица.Кол2 < Таблица1.Кол2
    |
    |СГРУППИРОВАТЬ ПО
    |    Таблица.Кол1";
    Рез = Запрос.Выполнить();
    Таблица = Рез.Выгрузить();
23 Галахад
 
гуру
21.05.21
10:45
Не, немного не так:

    "ВЫБРАТЬ
    |    Т1.Кол1 КАК Кол1,
    |    Т1.Кол2 КАК Кол2
    |ПОМЕСТИТЬ Таблица
    |ИЗ
    |    &Т1 КАК Т1
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    Таблица.Кол1 КАК Кол1,
    |    ВЫБОР
    |        КОГДА НЕ МИНИМУМ(Таблица.Кол2 + Таблица1.Кол2) ЕСТЬ NULL
    |            ТОГДА МИНИМУМ(Таблица.Кол2 + Таблица1.Кол2)
    |        ИНАЧЕ МИНИМУМ(Таблица.Кол2)
    |    КОНЕЦ КАК Кол2
    |ИЗ
    |    Таблица КАК Таблица
    |        ЛЕВОЕ СОЕДИНЕНИЕ Таблица КАК Таблица1
    |        ПО Таблица.Кол1 = Таблица1.Кол1
    |            И Таблица.Кол2 < Таблица1.Кол2
    |
    |СГРУППИРОВАТЬ ПО
    |    Таблица.Кол1";
24 zhukovia
 
21.05.21
11:00
(12) Получилось сделать как в указанной ссылке. Спасибо ещё раз за наводку.
25 zhukovia
 
21.05.21
11:05
(23) Так тоже получилось, правда только объединяются только 2 строки (у меня как раз всего две). Если одинаковых строк больше 2 то лишние просто стираются, не знаю можно ли это поправить. Но на двух работает, спасибо. Так гораздо короче получилось.
26 Said_We
 
21.05.21
13:08
(23) А как сложится такая таблица:
Петя|М|12|a|
Маша|Ж|12|б|
Маша|Ж|12|а|
Маша|Ж|12|б|
Маша|Ж|12|у|
Маша|Ж|12|ш|
Маша|Ж|12|к|
Маша|Ж|12|а|
Анна|Ж|12|a|

Так вариант а):
Петя|М|12|a|
Маша|Ж|12|бабушка|
Анна|Ж|12|a|

Или так вариант б):
Петя|М|12|a|
Маша|Ж|12|абкуш|
Анна|Ж|12|a|

:-)
Повторы не попадают и всегда в алфавитном порядке.
Может (0) так и нужно, но есть задачи, когда необходимо всё как в варианте а).
27 Галахад
 
гуру
21.05.21
13:14
(26) Ну так себе сложится. Только для "бабушек" состоящих из "ба". ;-)
28 zhukovia
 
21.05.21
13:19
(26) Если я правильно все сделал то будет:
Петя|М|12|a|
Маша|Ж|12|ба|
Анна|Ж|12|a|
Всё что больше двух повторений сотрётся.
29 Said_We
 
21.05.21
14:58
(28) А судя по примеру в (0) нужно было:
Петя|М|12|a|
Маша|Ж|12|аб|
Анна|Ж|12|a|

т.е. строка сложится не в порядке следования, а в обратном алфавитном. Если без разницы, то гуд.
30 zhukovia
 
22.05.21
14:00
(29) Только не надо забывать что остальные строки просто "выкинет", ТОЛЬКО первые 2!

Маша|Ж|12|б|
Маша|Ж|12|у|
Маша|Ж|12|ш|
Маша|Ж|12|к|
Маша|Ж|12|а|
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший