Как построить расписание занятий в СКД на основе данных документа без дублирования записей?

Программист 1С v8.3 (Управляемые формы) Сфера услуг, туризм и социальный сектор
← На главную

При попытке вывести расписание занятий с помощью системы компоновки данных (СКД), обращаясь напрямую к табличным частям документов, разработчики часто сталкиваются с двумя проблемами: «задвоением» колонок при использовании автоматического дополнения периода и невозможностью вывести несколько одинаковых уроков в рамках одного дня, так как СКД автоматически группирует идентичные записи.

Рассмотрим пошагово, как подготовить данные и настроить отчет, чтобы получить корректную сетку расписания.

Этап 1: Подготовка данных в запросе

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

В первом запросе пакета выберем исходные данные и приведем дату к началу дня. Важно использовать РАЗЛИЧНЫЕ, чтобы исключить случайные дубли на входе:


ВЫБРАТЬ РАЗЛИЧНЫЕ
    УчебныйДеньУроки.Предмет КАК Предмет,
    НАЧАЛОПЕРИОДА(УчебныйДеньУроки.Ссылка.Дата, ДЕНЬ) КАК ДатаЗанятия,
    УчебныйДеньУроки.Ссылка.Дата КАК ПолнаяДата
ПОМЕСТИТЬ ДанныеСвернуто
ИЗ
    Документ.УчебныйДень.Уроки КАК УчебныйДеньУроки
ГДЕ
    УчебныйДеньУроки.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода;

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


ВЫБРАТЬ
    ДанныеСвернуто.Дата КАК ДатаЗанятия,
    ДанныеСвернуто.Предмет КАК Предмет,
    КОЛИЧЕСТВО(ДанныеСвернуто1.Предмет) КАК НПП
ИЗ
    ДанныеСвернуто КАК ДанныеСвернуто
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДанныеСвернуто КАК ДанныеСвернуто1
        ПО ДанныеСвернуто.Дата = ДанныеСвернуто1.Дата
            И ДанныеСвернуто.Предмет >= ДанныеСвернуто1.Предмет
ГРУППИРОВАТЬ ПО
    ДанныеСвернуто.Дата,
    ДанныеСвернуто.Предмет

Этап 2: Настройка структуры СКД

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

  1. В структуре отчета создайте элемент Таблица.
  2. В качестве группировки строк укажите Учитель (или другой группировочный признак, если требуется), а вложенной группировкой добавьте поле НПП. Это заставит СКД выводить каждый урок отдельной строкой, даже если предмет и дата совпадают.
  3. Для группировки колонок используйте поле ДатаЗанятия. Перейдите в настройки этой группировки и на вкладке Дополнительные настройки укажите Тип дополнения равным День. Укажите период дополнения, соответствующий вашему отчетному периоду.
  4. Если поле НПП визуально мешает в отчете, вы можете скрыть его заголовок или настроить оформление, чтобы ячейки с нумерацией не выводились пользователю.

Этап 3: Устранение проблем с пустыми ячейками

Если вы заметили, что пустые даты не отображаются в отчете, проверьте настройки группировки ДатаЗанятия. Важно, чтобы в настройках таблицы (на вкладке Другие настройки) параметр Выводить пустые записи был установлен в значение Да. Это критично для корректного отображения сетки расписания, где в некоторые дни у конкретного преподавателя может не быть занятий.

Важное примечание: Если вы используете временные таблицы, убедитесь, что все поля, участвующие в группировках, передаются в итоговую выборку корректно. Если поле НПП или другие технические поля вызывают сбои при выводе, установите для них роль Обязательное в наборе данных СКД — это гарантирует, что система не исключит их из запроса при оптимизации структуры отчета.

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

← На главную