Перейти к содержимому

Соединения

Соединение нужно всякий раз, когда к одной строке набора относится несколько строк другого набора. Откуда взялся правый набор — из общего запроса или из запроса по объекту печати — неважно: механизм один, и работает он как фильтр, а не как соединение таблиц в запросе.

Типичные случаи:

  • Данные, общие для всей формы. Остатки товаров на складах, курсы валют, задолженность контрагентов — набор собран общим запросом, и для конкретной строки формы из него нужны не все строки, а только подходящие.
  • Шапка и табличная часть. Соединение по «Ссылке» связывает строки с их документом — на этом строится вывод реестра, где под каждым документом идут его собственные строки.
  • Подчинённые данные строки. Серии, ГТД, состав комплекта — всё, чего на одну строку товара приходится несколько.
  • Итог по связанным строкам. Когда в форму нужно не перечисление, а сумма или количество: соединение даёт агрегат (Итог.[Поле].[Агрегат]) без отдельного запроса — как в примере ниже.

Вид закладки “Соединения”

Соединять наборы не обязательно: по умолчанию каждый набор свободен и в дереве соединений не участвует. Строка там появляется только тогда, когда связь между наборами действительно нужна.

Рассмотрим колонки таблицы соединений

КолонкаОписание
Левая сторона (набор / поле)Имя набора (или поля) с левой стороны
Правая сторона (набор / поле)Имя набора (или поля) с правой стороны
Имя соединенияИмя соединения (вложенного набора для левой стороны)
Вид набораСпособ формирования коллекции данных набора для использования в печатной форме
№Служебное поле

Над табличной частью располагается командная панель. По умолчанию в ней находятся команды управления табличной частью. Дополнительно добавлены команды:

КомандаОписание
Добавить строку соединения
Добавить строку поля условия соединения

Рассмотрим работу механизма соединений на примере. Пусть у нас есть две таблицы: “Товары” (табличная часть Товары из документа) и “Остатки” (остатки по товарам на складах). В таблице “Товары” строки сразу двух документов — так набор выглядит, когда печатная форма формируется по нескольким объектам печати одновременно.

СсылкаНоменклатураЕд. изм.Количество
Документ № 1 от 01.01.2023Номенклатура 1шт.10
Документ № 1 от 01.01.2023Номенклатура 2шт.10
Документ № 2 от 02.01.2023Номенклатура 1шт.10
НоменклатураСкладОстаток
Номенклатура 1Склад 1100
Номенклатура 1Склад 250
Номенклатура 2Склад 150

Мы хотим вывести в печатную форму таблицу “Товары” + колонка “Остаток”. Классическое левое соединение таблиц “Товары” и “Остатки” по полю “Номенклатура” привело бы к задвоению данных, поскольку “Номенклатура 1” у нас хранится на 2-х складах. Однако, соединение в конструкторе работает скорее как фильтр. Поэтому соединение не приводит к тому, что в таблице “Товары” становится больше строк. При любом раскладе, левая таблица не изменяется. Каждая её строка дополняется вложенным набором — строками правой таблицы, отобранными по заданным критериям.

На закладке “Соединения” это описывается двумя строками — самим соединением и полем условия:

СтрокаЛевая сторонаПравая сторонаИмя соединенияВид набора
СоединениеТоварыОстаткиОстаткиМногострочная коллекция
Поле условияНоменклатураНоменклатура

Два значения здесь определяют дальнейшую работу:

  • Имя соединения — под этим именем вложенный набор появится внутри строки левого набора, и оно же станет сегментом пути к полю;
  • Вид набора — “многострочная коллекция”, потому что нужны все строки по складам. Выбери мы “первую” или “последнюю строку”, во вложенном наборе осталась бы одна строка, и построчного вывода по складам не получилось бы (подробнее про виды наборов).

В нашем случае итоговый набор данных “Товары” будет выглядеть следующим образом:

СсылкаНоменклатураЕд. изм.Кол-воОстатки
Документ № 1 от 01.01.2023Номенклатура 1шт.10НоменклатураСкладОстаток
Номенклатура 1Склад 1100
Номенклатура 1Склад 250
Документ № 1 от 01.01.2023Номенклатура 2шт.10НоменклатураСкладОстаток
Номенклатура 2Склад 150
Документ № 2 от 02.01.2023Номенклатура 1шт.10НоменклатураСкладОстаток
Номенклатура 1Склад 1100
Номенклатура 1Склад 250

То есть, внутри каждой строки мы видим вложенную “копию” таблицы “Остатки” с фильтром по значению колонок “Номенклатура”.

В итоге, для того, чтобы в печатной форме вывести колонку “Остаток”, в соответствующем параметре области макета, необходимо выбрать значение набора:

НаборыДанных.Товары.Строка.Остатки.Итог.Остаток.Сумма

Рассмотрим путь к этому полю:

  • НаборыДанных.Товары.Строка — стандартный путь, когда мы выводим данные по строкам многострочной коллекции;
  • Остатки — имя соединения, то есть вложенный набор внутри строки;
  • Итог.Остаток.Сумма — итог по числовой колонке “Остаток” вложенного набора; последний сегмент — имя агрегата.

Доступные поля набора данных “Товары”

СсылкаНоменклатураЕд. изм.Кол-воОстаток
Документ № 1 от 01.01.2023Номенклатура 1шт.10150
Документ № 1 от 01.01.2023Номенклатура 2шт.1050
Документ № 2 от 02.01.2023Номенклатура 1шт.10150

Строк осталось столько же, сколько было в таблице “Товары”. Остаток по “Номенклатуре 1” — 150: это сумма по обоим складам, а не остаток одного из них. Если в форме нужен остаток по конкретному складу, склад должен быть в левом наборе и участвовать в условии соединения — тогда во вложенный набор попадут только его строки.