Как вывести в СКД две независимые таблицы, объединенные одним полем

Публикация № 1072903

Программирование - Работа с интерфейсом

Система компоновки данных СКД

6
Надо вывести в отчет на СКД 2 таблицы, которые содержат различные данные, объединяемые одним полем. Количество строк в каждой таблице может быть произвольным. Если выводить с помощью обычного соединения таблиц, то мы получим перемножение строк. Чтобы его избежать обычно используются циклы. Но в данной статье мы разберемся как это сделать только средствами СКД.

 

Разбираться будем на упрощенном примере. Исходные таблицы и нужный результат на рисунке

Для начала создадим в СКД 3 таблицы:

1) Контрагенты+Номер. В этой таблице будет дополнительная колонка "Номер", по которой будет в дальнейшем объединение всех таблиц. В моем примере я создам эту таблицу вручную, в реальной жизни можно использовать создание нумерации запросом, с нужной глубиной.

2) Контрагенты+Договоры. Здесь и в следующей таблице нумерация также сделана упрощенно. В реальных запросах нумерацию справочников можно выполнить во временной таблице. Например, как описано в этой статье Нумерация строк в запросе.

3) Контрагенты+Адреса

 

Текст запроса

 

 

ВЫБРАТЬ
    "Контрагент 1" КАК Контрагент,
    1 КАК Номер
ПОМЕСТИТЬ КонтрагентыНомера

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

ВЫБРАТЬ
    "Контрагент 1",
    2

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

ВЫБРАТЬ
    "Контрагент 1",
    3

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

ВЫБРАТЬ
    "Контрагент 1",
    4

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

ВЫБРАТЬ
    "Контрагент 1",
    5

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

ВЫБРАТЬ
    "Контрагент 2",
    1

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

ВЫБРАТЬ
    "Контрагент 2",
    2

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

ВЫБРАТЬ
    "Контрагент 2",
    3

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

ВЫБРАТЬ
    "Контрагент 2",
    4

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

ВЫБРАТЬ
    "Контрагент 2",
    5
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    "Контрагент 1" КАК Контрагент,
    1 КАК Номер,
    "Договор 1" КАК Договор
ПОМЕСТИТЬ КонтрагентыДоговоры

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

ВЫБРАТЬ
    "Контрагент 1",
    2,
    "Договор 2"

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

ВЫБРАТЬ
    "Контрагент 2",
    1,
    "Договор 1"
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    "Контрагент 1" КАК Контрагент,
    1 КАК Номер,
    "Адрес 1" КАК Адрес
ПОМЕСТИТЬ КонтрагентыАдреса

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

ВЫБРАТЬ
    "Контрагент 1",
    2,
    "Адрес 2"

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

ВЫБРАТЬ
    "Контрагент 1",
    3,
    "Адрес 3"
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    КонтрагентыНомера.Контрагент КАК Контрагент,
    КонтрагентыДоговоры.Договор КАК Договор,
    КонтрагентыАдреса.Адрес КАК Адрес
ИЗ
    КонтрагентыНомера КАК КонтрагентыНомера
        ЛЕВОЕ СОЕДИНЕНИЕ КонтрагентыДоговоры КАК КонтрагентыДоговоры
        ПО КонтрагентыНомера.Контрагент = КонтрагентыДоговоры.Контрагент
            И КонтрагентыНомера.Номер = КонтрагентыДоговоры.Номер
        ЛЕВОЕ СОЕДИНЕНИЕ КонтрагентыАдреса КАК КонтрагентыАдреса
        ПО КонтрагентыНомера.Контрагент = КонтрагентыАдреса.Контрагент
            И КонтрагентыНомера.Номер = КонтрагентыАдреса.Номер
ГДЕ
    (НЕ КонтрагентыДоговоры.Договор ЕСТЬ NULL
            ИЛИ НЕ КонтрагентыАдреса.Адрес ЕСТЬ NULL)

 

 

Настраиваем схему вывода с помощью детальных записей. В вашем запросе это могут быть любые нужные группировки.

 

И получаем результат

 

Вложил пример отчета с описанной выше схемой СКД.

6

Скачать файлы

Наименование Файл Версия Размер
Как вывести в СКД две независимые таблицы, объединенных одним полем: пример отчета из статьи
.erf 5,63Kb
05.06.19
0
.erf 5,63Kb Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. qwinter 588 06.06.19 11:54 Сейчас в теме
Использование функции Массив() было бы логичней для такого случая. И наглядней.
3. swimdog 629 06.06.19 12:36 Сейчас в теме
(1) Так полей может быть много, это у меня в примере по 1 полю. Все через массив выводить?
5. qwinter 588 06.06.19 12:43 Сейчас в теме
(3) а какая разница сколько полей?) Добавить в ресурс и написать Массив(Различные Договор) даже для 30 полей быстрее написания такого запроса)))
8. swimdog 629 06.06.19 12:54 Сейчас в теме
(5) Можете прислать пример этого отчета на СКД на моих данных из статьи? Например, в личку скинуть. Я не очень понимаю, как это должно выглядеть в схеме.
9. qwinter 588 06.06.19 13:00 Сейчас в теме
11. swimdog 629 06.06.19 15:29 Сейчас в теме
(9) Вариант хороший, но есть одна тонкость. Поля в разных колонках могут не совпасть, если есть пустые значения. Например, есть
договор 1, 100 руб.
договор 2, 0 руб.
договор 3, 150 руб.

Если выводить через массив или ТЗ, то СКД выведет примерно так:
Договоры | Суммы
договор 1 | 100 руб.
договор 2 | 150 руб.
договор 3 |

Поэтому я и написал, что когда полей много, то с выводом приходится заморачиваться. Либо я чего-то не знаю))
12. qwinter 588 06.06.19 16:28 Сейчас в теме
(11) Это все решаемые частности)) К тому же прямо противоречат названию темы, все таки это связанные поля))

Прилепил скд с двумя полями.
Прикрепленные файлы:
ТестСвязи УФ.erf
13. swimdog 629 06.06.19 16:43 Сейчас в теме
(12) Это не противоречит теме. В рамках каждой таблицы это связанные данные. Но между двумя таблицами связь по 1-2 полям.
10. qwinter 588 06.06.19 14:52 Сейчас в теме
(8) И чуть более замороченный вариант для управляемых форм с вычисляемыми полями.
Прикрепленные файлы:
ТестСвязи УФ.erf
2. mishinas1987 24 06.06.19 12:31 Сейчас в теме
4. dhurricane 06.06.19 12:41 Сейчас в теме
Прошу прощения, но на мой взгляд заголовок и описание статьи не соответствуют ее содержанию. По сути вся соль решения заключается в правильной подготовке данных запросом, СКД здесь никоим образом не участвует, а используется лишь для вывода данных. Тот же прием применим как для обычной консоли запросов, таки и для формирования печатной формы - меняется лишь способ вывода результата запроса.

Кажется, что стоило больше заострить внимание на нумерации данных в запросе и привести более "жизненный" пример, а не нумеровать записи "вручную".
6. swimdog 629 06.06.19 12:45 Сейчас в теме
(4) Нумерация хорошо описана в других статьях. В том числе в приведенной по ссылке. Смысл разжевывать то, что уже разжевано?
А пример позволяет, не углубляясь в детали, понять суть.
Да, СКД имеет опосредованное отношение, если смотреть со стороны запроса. А если смотреть со стороны задачи (нужно сделать отчет на СКД), то отношение к СКД будет прямое. Заголовок сделан так, чтобы люди, которым надо нарисовать такой отчет, смогли найти эту статью.
7. dhurricane 06.06.19 12:52 Сейчас в теме
(6) Что ж, идея, лежащая в основе статьи, теперь мне понятно лучше, спасибо. Не считаю в таком случае, что она "тянет" на целую статью, но тут Вы в праве со мной не согласиться.
Оставьте свое сообщение