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



Надо вывести в отчет на СКД 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)

 

 

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

 

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

 

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

13 Comments

  1. qwinter

    Использование функции Массив() было бы логичней для такого случая. И наглядней.

    Reply
  2. mishinas1987

    Поучительно, спасибо.

    Reply
  3. swimdog

    (1) Так полей может быть много, это у меня в примере по 1 полю. Все через массив выводить?

    Reply
  4. dhurricane

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

    Кажется, что стоило больше заострить внимание на нумерации данных в запросе и привести более «жизненный» пример, а не нумеровать записи «вручную».

    Reply
  5. qwinter

    (3) а какая разница сколько полей?) Добавить в ресурс и написать Массив(Различные Договор) даже для 30 полей быстрее написания такого запроса)))

    Reply
  6. swimdog

    (4) Нумерация хорошо описана в других статьях. В том числе в приведенной по ссылке. Смысл разжевывать то, что уже разжевано?

    А пример позволяет, не углубляясь в детали, понять суть.

    Да, СКД имеет опосредованное отношение, если смотреть со стороны запроса. А если смотреть со стороны задачи (нужно сделать отчет на СКД), то отношение к СКД будет прямое. Заголовок сделан так, чтобы люди, которым надо нарисовать такой отчет, смогли найти эту статью.

    Reply
  7. dhurricane

    (6) Что ж, идея, лежащая в основе статьи, теперь мне понятно лучше, спасибо. Не считаю в таком случае, что она «тянет» на целую статью, но тут Вы в праве со мной не согласиться.

    Reply
  8. swimdog

    (5) Можете прислать пример этого отчета на СКД на моих данных из статьи? Например, в личку скинуть. Я не очень понимаю, как это должно выглядеть в схеме.

    Reply
  9. qwinter

    (8)

    Reply
  10. qwinter

    (8) И чуть более замороченный вариант для управляемых форм с вычисляемыми полями.

    Reply
  11. swimdog

    (9) Вариант хороший, но есть одна тонкость. Поля в разных колонках могут не совпасть, если есть пустые значения. Например, есть

    договор 1, 100 руб.

    договор 2, 0 руб.

    договор 3, 150 руб.

    Если выводить через массив или ТЗ, то СКД выведет примерно так:

    Договоры | Суммы

    договор 1 | 100 руб.

    договор 2 | 150 руб.

    договор 3 |

    Поэтому я и написал, что когда полей много, то с выводом приходится заморачиваться. Либо я чего-то не знаю))

    Reply
  12. qwinter

    (11) Это все решаемые частности)) К тому же прямо противоречат названию темы, все таки это связанные поля))

    Прилепил скд с двумя полями.

    Reply
  13. swimdog

    (12) Это не противоречит теме. В рамках каждой таблицы это связанные данные. Но между двумя таблицами связь по 1-2 полям.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *