СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

12.11.19

Разработка - СКД

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

Предыдущие статьи по СКД можно посмотреть по ссылкам ниже:

До сих пор, мы рассматривали схему компоновки с одним единственны набором данных «Запрос». Это самый распространенный вариант применения СКД. Однако, система позволяет создавать наборы данных других типов. А также создавать несколько наборов данных. Все эти действия выполняются на закладке «Наборы данных» конструктора схемы компоновки:

Закладка "Наборы данных"

Оглавление

  1. Типы наборов данных СКД
  1. Связи наборов данных
  1. Иерархия в отчетах на СКД
  1. Вложенные отчеты на СКД

 

Типы наборов данных СКД

Рассмотрим, какие типы наборов данных можно создать в схеме компоновки данных:

  • Набор данных запрос – произвольный запрос к базе данных (самый распространенный вариант),
  • Набор данных объект – произвольный, внешний набор данных (например таблица значений),
  • Набор данных объединение – объединение нескольких наборов данных в один результирующий.

Набор данных объект

Мы еще не рассматривали набор данных объект, по этому, остановимся на нем более подробно. Создавая набор данных этого типа, необходимо описать только выходные поля этого набора и его наименование:

Настройка набора данных Объект

Этого достаточно, чтобы указать все действия по дальнейшей обработке данных: расчет итогов, построение структуры отчета, настройка отборов, сортировки и прочие настройки.

Сам механизм для формирования данных необходимо описывать программно, и передавать процессору компоновки. Такие внешние данные могут быть следующих видов:

  • Таблица значений,
  • Выборка из результата запроса,
  • Область ячеек табличного документа,
  • Набор записей регистров,
  • Любой объект конфигурации или его табличная часть.

Наиболее распространенный тип внешних данных – это таблица значений. Ниже пример программного кода для передачи внешних данных процессору компоновки:

ТЗ = новый ТаблицаЗначений;
…
ВнешниеНаборы = новый Структура;
ВнешниеНаборы.Вставить("ИмяНабораДанных", ТЗ);
ПроцессорКомпоновки = новый ПроцессорКомпоновкиДанных();
ПроцессорКомпановки.Инициализировать(МакетКомпоновки, ВнешниеНаборы); 

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

Набор данных объединение

Набор данного типа, по своей сути, не является набором как таковым. Он служит для объединения нескольких наборов данных любого типа в один, результирующий.

Может быть построена разветвленная структура объединений наборов данных. Отдельные наборы можно перетаскивать мышкой по структуре.

Существует ограничение: подчиненные наборы могут быть только у наборов данных объединение.

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

Доступные реквизиты у подчиненного набора

Отсутствуют следующие реквизиты:

  • Автозаголовок,
  • Роль,
  • Выражения представления и упорядочивания,
  • Проверка иерархии,
  • Оформление,
  • Параметры редактирования.

 

Связи наборов данных

Раз уж можно создавать несколько наборов данных, необходимо их как-то связывать между собой. Существует два способа связи наборов данных: объединение и соединение.

Связь - объединение

Объединение выполняется с помощью отдельного набора данных «Набор данных объединение», который описан выше.

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

Поля объединяемых наборов с одинаковым значением реквизита «Путь» сворачиваются в одно. Автоматической группировки строк по полям с одинаковым реквизитом «Путь» - не происходит.

Поля с разными значениями реквизита «Путь», образуют отельные поля в итоговом наборе.

Из выше сказанного можно сделать вывод, не должно быть четкого соответствия между количеством и последовательностью полей объединяемых наборов. Но, если нам нужно, чтобы какие-либо значения из двух наборов объединились в одну колонку, это также возможно, путем указанием одного и того же реквизита «Путь».

Связь - соединение

Это более сложный вид связи двух наборов данных. Для настройки соединения наборов предназначена специальная закладка конструктора схемы компоновки «Связи наборов данных»:

Связи наборов данных

Соединение двух наборов выполняется по аналогии с соединением таблиц в запросе. На закладке «Связи наборов данных», по аналогии с конструктором запросов можно выбрать наборы данных и поля наборов (выражения), по которым необходимо выполнить соединение.

Важно:

  • Вид соединения по умолчанию всегда «ЛЕВОЕ ВНЕШНЕЕ». Источником связи выступает основной набор данных, приемником связи – подчиненный.
  • Выполнять соединение можно только для наборов данных верхнего уровня. То-есть, наборы данных, которые входят в наборы «Объединения» соединять нельзя. 

ТОП-6 инструментов для разработчика 1С

Подборка лучших инструментов для разработчика 1С включает Toolkit, DCT, OneDebugger, PrintWizard, DataFormWizard и Infostart MCP. Любой инструмент со скидкой 20% при покупке от двух решений.

Вступайте в нашу телеграмм-группу Инфостарт

Наборы данных соединения наборов собственная иерархия использование вложенных схем

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

16500 руб.

02.09.2020    273913    1523    422    

1185

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Как решить проблему с отборами по полям СКД, когда с одинаковым отбором Отчет показывает одно, а Консоль запросов другое.

16.06.2026    4983    sapervodichka    45    

51

Инструментарий разработчика СКД Программист 1С 8.3 Бесплатно (free)

В этой статье представлен СКДБилдер — общий модуль-обёртка над объектной моделью СКД, который сокращает код в 3-4 раза и делает его читаемым.

29.01.2026    8348    412    shapa_pro    27    

71

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Статья написана по результатам проведенного внутреннего обучающего вебинара для разработчиков ГК «СофтБаланс». Если осилить 25 000 знаков - задача для вас непосильная, где-то на бескрайних просторах интернета видео есть (или будет). Но здесь информация точнее. Разберем, чем запрос для СКД принципиально отличается от обычного запроса и как модифицируется в зависимости от настроек. Изучим «базовый рецепт» написания запроса для СКД, сформируем чек-лист. Полезно будет всем – от стажеров до тех. лидов. Всем, кто не снимает галку «автозаполнение» и пишет запросы для отчетов в консоли запросов – читать (вдумчиво) обязательно.

29.10.2025    24331    ovetgana    112    

117

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Описан способ заполнения списка доступных значений для полей наборов данных и параметров в схеме компоновки данных для любых конфигураций (с использованием БСП или без).

01.07.2025    14094    krasnoshchekovpavel    7    

68

СКД Программист Стажер 1С:Предприятие 8 Россия Бесплатно (free)

Несколько способов управления формами выбора параметров и отборов СКД.

10.04.2025    13560    Neti    0    

43

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Хорошая отчетная форма - сродни искусству. Есть какое-то невероятное эстетическое удовольствие в том, чтобы разобраться в логике учета и анализируемых показателях, спроектировать архитектуру хранения данных так, чтобы оптимально собрать эти показатели вместе с аналитическими разрезами в запросе, а затем настроить отображение так, чтобы, глядя на результат, сразу было понятно, что это за отчет и какие задачи он призван решать. Система компоновки данных - это моя первая, главная и, наверное, единственная "рабочая" любовь. Ее я использую везде, где только можно и где нельзя тоже. Хочу поделиться с вами некоторыми практическими приемами в работе с отчетами на СКД, которые, надеюсь, будут полезны.

27.02.2025    18672    ovetgana    50    

94

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

24.12.2024    16477    Akcium    17    

48
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. пользователь 26.07.19 15:17
Сообщение было скрыто модератором.
...
2. Reznik_Nikolay 26.07.19 22:28 Сейчас в теме
Эх, крутая статья. Раньше бы такое прочитать, сам 2-3 дня назад раскурил, как из внешнего набора данных красиво собрать свою иерархию.

Но всё равно спасибо.
kristina; Izumov; reneyr; +3 Ответить
3. ids79 8851 27.07.19 07:42 Сейчас в теме
(2)Спасибо. Я старался.
youalex; kristina; zloybot; vadim92; Чародей; portwein; frkbvfnjh; ffrriill; Filkkore; +9 Ответить
4. bulpi 218 10.08.19 15:32 Сейчас в теме
Автор, Вам бы внимательно вычитать статьи. Очень полезны, но, когда внимательно читаешь, видны мелкие описки и недочеты.
5. ids79 8851 10.08.19 18:54 Сейчас в теме
(4)Да, грешу этим. Воде стараюсь проверять, но наверно не все замечаю. Глаз замыливается. Если что видите, пишите, исправлю.
Дмитрий74Чел; +1 Ответить
6. bulpi 218 11.08.19 10:55 Сейчас в теме
(5)
1)ТаблицаЗнаений

2)<destinationExpression>ТоварИерархия.Товар</destinationExpression>

По идее, должно быть ТоварИерархия.Ссылка
7. ids79 8851 11.08.19 12:52 Сейчас в теме
1. Исправил, спасибо.
2. Нет, как раз ТоварИерархия.Товар.
Попробуйте создать запрос в консоле компоновки. В запросе "Ссылка", а путь для этого поля - "Товар". Он должен соответствовать имени в основном наборе.
r.zdorkin; +1 Ответить
9. vugluscr1991 12 02.12.19 20:52 Сейчас в теме
(7) 2. Может тогда в запросе
Товары.Ссылка КАК Товар,

Не?
8. user1216930 21.11.19 20:05 Сейчас в теме
10. axelerleo 325 09.02.20 19:04 Сейчас в теме
Коллеги, кто пальцем ткнет, где вот про это можно прочитать в оф. документации?

"могут быть следующих видов:
Таблица значений,
Выборка из результата запроса,
Область ячеек табличного документа,
Набор записей регистров,
Любой объект конфигурации или его табличная часть."
Yan_Malyakov; +1 Ответить
11. user1194102 28.02.20 08:49 Сейчас в теме
Каким образом осуществляется связь разных наборов в режиме:
"Связь - объединение
Объединение выполняется с помощью отдельного набора данных «Набор данных объединение», который описан выше"

если явная связь между наборами не прописывается?

(по аналогии с запросами есть Объединить и Объединить ВСЕ, а в наборах по какому типу объединение?)
12. kavg 31.03.20 11:38 Сейчас в теме
На заметку. При автоматическом построении иерархии, система дублирует групповое поле на более низком уровне. То-есть, если у нас есть группа «Продукты», в которую входят: «Молоко» и «Хлеб», в отчете в группу «Продукты» будут входить три элемента: «Молоко», «Хлеб», «Продукты». Это не корректно. Происходит это из-за того, что система компоновки достраивает иерархические записи к тем, что уже есть в выборке.


Корректно, например, в случае вывода иерархии подразделений и принятых на эти подразделения сотрудников. Дубль группового поля нужен для вывода сотрудников, принятых на подразделение, которое является группой:
ОтделОбщ
     - Отдел1
          - Иванов, Менеджер
     - Отдел2
          - Петров, Менеджер
     - ОтделОбщ
          - Сидоров, Руководитель
13. leosoft 169 30.10.20 10:51 Сейчас в теме
Подскажите, пожалуйста - для вложенных отчетов можно как-то писать свою обработку в процедуре
"ПриКомпоновкеРезультата"?
14. Vladimir_D 124 09.02.21 14:04 Сейчас в теме
Можно вопрос? Не уверен в тему ли, но нарисовал совсем простой отчет по справочнику (Номенклатура). Там есть пара моментов с отбором, но никак не могу понять как можно одной галочкой, как отображение группировки, или другим способов, не залезая в настройки, поменять тип группировки с Иерархии на Без иерархии.
Запрос наипростейший
ВЫБРАТЬ
	Номенклатура.Ссылка КАК Ссылка
ИЗ
	Справочник.Номенклатура КАК Номенклатура


В настройка просто группировка по ссылке и отображение некоторых полей. Плюс пара-тройка отборов. Но хотелось бы в панели быстрых настроек отчета выставить тип группивки.
Спасибо.
15. ids79 8851 10.02.21 17:36 Сейчас в теме
(14)Добрый день.
Быстро поменять не получиться - нет такой возможности.
Так что или проваливаться в поля группировки или сделать программную доработку, которая сделаем это.
16. SmArtist 101 20.07.21 13:41 Сейчас в теме
Дмитрий, здравствуйте.
Вы пишете: "Передача параметров в подчиненные наборы

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

скажите, а как осуществляется контроль непротиворечивости данных?
Это все таки два запроса или один? Ведь если два, то при выполнении второго запроса состояние учета уже может измениться, в сравнении с тем. что было при выполнении первого запроса.

Спасибо
17. Intenso 30.07.21 13:52 Сейчас в теме
А как при построении такой иерархии посчитать итоги на каждом вложенном уровне?
19. user1459868 20.12.21 12:11 Сейчас в теме
Добрый день!
Спасибо за статью! Пригодилась только-что для создания отчета с собственной иерархией.
Но оказалось, что отбор "в группе" работает не верно. У меня отчет по документу "задача", который имеет реквизит "ЗадачаРодитель". Создал три набора данных, по подобию как у Вас.
Отчет выводится, но при использовании отбора "в группе" выводится только задача по отбору, а внутри только те задачи, которые не имеют подзадач, то есть не являются "группами". Отбор пробовал накладывать на группировку или на отчет.
Подскажите, пожалуйста, в чем может быть ошибка или что-то необходимо донастроить.
20. eXplode 21.02.22 08:29 Сейчас в теме
Добрый день. Подскажите, "Вид соединения по умолчанию всегда «ЛЕВОЕ ВНЕШНЕЕ»". Можно ли как-то сделать внутреннее или полное?
21. ids79 8851 21.02.22 10:02 Сейчас в теме
(20)При соединении наборов данных только Левое Внешнее
22. Dmitryi_KK 12 22.09.22 15:51 Сейчас в теме
Добрый день. Подскажите пожалуйста, а как можно реализовать схему при которой в зависимости от варианта отчета меняется связь наборов данных, а то СКД дорисовывает то, чего не надо...
23. Dmitryi_KK 12 22.09.22 16:04 Сейчас в теме
(22) Пока писал, сам сделал. Если что, может кому пригодится:
</
Для каждого стр из СхемаКомпоновкиДанных.СвязиНаборовДанных Цикл
Если стр.ВыражениеИсточник = "Подразделение" и стр.НаборДанныхИсточник = "ОсновныеДанные" и стр.НаборДанныхПриемник = "ПоКлиентам" тогда
СхемаКомпоновкиДанных.СвязиНаборовДанных.Удалить(стр);
КонецЕсли;
КонецЦикла;
/>
24. avbolshakov 15.10.22 16:47 Сейчас в теме
Добрый день! Может кто-то сможет подсказать - как сделать так чтобы иерархия выводилась не вся. Скажем есть справочник "структура предприятия", иерархический, иерархия элементов. запросом получаем плоскую таблицу: Подразделение - Количество сотрудников. В СКД выводим отчет, структура "Подразделение - Детальные записи", в выбранных полях - количество сотрудников. У поля подразделение "Иерархия". И если установить отбор на какое-то подразделение, то выводится все иерархия включаю родительские. И никак не удается убрать верхний уровень.
По служебному полю "Уровень" нельзя отсечь, тк если в отборе выберут самое верхнее подразделение, то сейчас выводит все ок, тк и надо выводить всю иерархию
Прикрепленные файлы:
Student1C; +1 Ответить
27. Student1C 61 22.11.23 13:38 Сейчас в теме
(24) удалось сделать?
25. ProstoProgrammist 6 17.05.23 08:28 Сейчас в теме
В примере Иерархические детальные записи убрал параметр и получил тот же результат, автор попробуй.
26. Student1C 61 22.11.23 13:35 Сейчас в теме
Как сделать, чтобы при отборе по Родителю по условию "В группе" не выводил верхние уровни?
28. roman-sln 60 23.09.24 17:28 Сейчас в теме
Использую два набора данных с датами (как из примера) и запрос к виртуальной таблице "обороты" регистра накопления, между которыми настроена связь по периоду. Проблема в том, что если во втором наборе использую условие по периоду в операторе "где", то все отрабатывает корректно (рис.1):
ГДЕ
	ДоходыИРасходыОбороты.Период МЕЖДУ &НачалоПериод И &КонецПериод

, а если использую периоды в параметрах виртуальной таблицы, то отбора не происходит (рис. 2):
ИЗ
	РегистрНакопления.ДоходыИРасходы.Обороты(&НачалоПериод,&КонецПериод,Месяц

Подскажите, что делаю не так в первом случае.
Прикрепленные файлы:
29. roman-sln 60 24.09.24 10:09 Сейчас в теме
(28)
, а если использую периоды в параметрах виртуальной таблицы, то отбора не происходит (рис. 2):

Точнее наборы данных соединяются в этом случае как перекрестный запрос.
30. roman-sln 60 24.09.24 19:50 Сейчас в теме
не в ту тему написал, прошу прощения.
вопрос закрыт
31. 1giga 18.08.25 18:10 Сейчас в теме
просто структурированных хэлп для тех, кто знает как эти механизмы работают... а как они работают - так ничего и не понятно.
32. tulakin_s 21.08.26 14:29 Сейчас в теме
Статья обрывается на середине. Что случилось? Вроде раньше была полная.
Для отправки сообщения требуется регистрация/авторизация