Разбираться будем на упрощенном примере. Исходные таблицы и нужный результат на рисунке
Для начала создадим в СКД 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)
Настраиваем схему вывода с помощью детальных записей. В вашем запросе это могут быть любые нужные группировки.
И получаем результат
Вложил пример отчета с описанной выше схемой СКД.
Использование функции Массив() было бы логичней для такого случая. И наглядней.
Поучительно, спасибо.
(1) Так полей может быть много, это у меня в примере по 1 полю. Все через массив выводить?
Прошу прощения, но на мой взгляд заголовок и описание статьи не соответствуют ее содержанию. По сути вся соль решения заключается в правильной подготовке данных запросом, СКД здесь никоим образом не участвует, а используется лишь для вывода данных. Тот же прием применим как для обычной консоли запросов, таки и для формирования печатной формы — меняется лишь способ вывода результата запроса.
Кажется, что стоило больше заострить внимание на нумерации данных в запросе и привести более «жизненный» пример, а не нумеровать записи «вручную».
(3) а какая разница сколько полей?) Добавить в ресурс и написать Массив(Различные Договор) даже для 30 полей быстрее написания такого запроса)))
(4) Нумерация хорошо описана в других статьях. В том числе в приведенной по ссылке. Смысл разжевывать то, что уже разжевано?
А пример позволяет, не углубляясь в детали, понять суть.
Да, СКД имеет опосредованное отношение, если смотреть со стороны запроса. А если смотреть со стороны задачи (нужно сделать отчет на СКД), то отношение к СКД будет прямое. Заголовок сделан так, чтобы люди, которым надо нарисовать такой отчет, смогли найти эту статью.
(6) Что ж, идея, лежащая в основе статьи, теперь мне понятно лучше, спасибо. Не считаю в таком случае, что она «тянет» на целую статью, но тут Вы в праве со мной не согласиться.
(5) Можете прислать пример этого отчета на СКД на моих данных из статьи? Например, в личку скинуть. Я не очень понимаю, как это должно выглядеть в схеме.
(8)
(8) И чуть более замороченный вариант для управляемых форм с вычисляемыми полями.
(9) Вариант хороший, но есть одна тонкость. Поля в разных колонках могут не совпасть, если есть пустые значения. Например, есть
договор 1, 100 руб.
договор 2, 0 руб.
договор 3, 150 руб.
Если выводить через массив или ТЗ, то СКД выведет примерно так:
Договоры | Суммы
договор 1 | 100 руб.
договор 2 | 150 руб.
договор 3 |
Поэтому я и написал, что когда полей много, то с выводом приходится заморачиваться. Либо я чего-то не знаю))
(11) Это все решаемые частности)) К тому же прямо противоречат названию темы, все таки это связанные поля))
Прилепил скд с двумя полями.
(12) Это не противоречит теме. В рамках каждой таблицы это связанные данные. Но между двумя таблицами связь по 1-2 полям.