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

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

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

Анализ проблемы: Почему "Левое соединение" не подходит?

Рассмотрим типичную ситуацию: у нас есть документ Циклы, в котором созданы две табличные части: ТаблицаТП и ТаблицаТЦ. В обеих таблицах есть похожие поля: Заказ, ИсполняемыйПрибор, Подразделение и числовые показатели (ресурсы).

Первая интуитивная попытка — использовать ЛЕВОЕ СОЕДИНЕНИЕ табличных частей по ключевым полям (Ссылка, Заказ, Прибор). Проанализируем, к чему это приводит:

  1. Дублирование строк (эффект декартова произведения): Если в первой таблице по одному заказу 3 строки, а во второй — 2, то при соединении в результате может получиться 6 строк. Это приведет к тому, что итоговые суммы в отчете будут завышены в несколько раз.
  2. Потеря данных: Если мы используем ЛЕВОЕ СОЕДИНЕНИЕ, а данные присутствуют только во второй таблице (но отсутствуют в первой), такие строки вообще не попадут в отчет.
  3. Сложность сопоставления: Когда подразделения указаны внутри табличных частей, а не в шапке документа, корректно "склеить" их по горизонтали практически невозможно.

Эффективное решение: Использование конструкции ОБЪЕДИНИТЬ ВСЕ

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

Проанализируем структуру запроса, который позволяет собрать данные из разных источников в единый поток. Для того чтобы в отчете можно было отличить, из какой таблицы пришли данные, мы добавим специальное поле-маркер (флаг).


ВЫБРАТЬ
    ЦиклыТаблицаТП.Ссылка.Заказ КАК Заказ,
    ЦиклыТаблицаТП.Ссылка.Дата КАК Дата,
    ЦиклыТаблицаТП.Подразделение КАК Подразделение,
    ИСТИНА КАК ЭтоТП,
    ЦиклыТаблицаТП.ИсполняемыйПрибор КАК ИсполняемыйПрибор,
    ЦиклыТаблицаТП.КоличествоИсполняемогоПрибора КАК КоличествоИсполняемогоПрибора,
    ЦиклыТаблицаТП.КоличествоНаВыходеСУчастка КАК КоличествоНаВыходеСУчастка,
    ЦиклыТаблицаТП.Брак КАК Брак,
    ЦиклыТаблицаТП.ОсталосьСделать КАК ОсталосьСделать
ИЗ
    Документ.Циклы.ТаблицаТП КАК ЦиклыТаблицаТП

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ЦиклыТаблицаТЦ.Ссылка.Заказ,
    ЦиклыТаблицаТЦ.Ссылка.Дата,
    ЦиклыТаблицаТЦ.Подразделение,
    ЛОЖЬ,
    ЦиклыТаблицаТЦ.ИсполняемыйПрибор,
    ЦиклыТаблицаТЦ.КоличествоИсполняемогоПрибора,
    ЦиклыТаблицаТЦ.КоличествоНаВыходеСУчастка,
    ЦиклыТаблицаТЦ.Брак,
    ЦиклыТаблицаТЦ.ОсталосьСделать
ИЗ
    Документ.Циклы.ТаблицаТЦ КАК ЦиклыТаблицаТЦ

Важные моменты в этом запросе:

Настройка СКД для наглядного представления

После того как запрос написан, нам нужно сделать отчет читаемым для пользователя. Рассмотрим, как использовать созданное поле ЭтоТП.

Во-первых, мы можем настроить Условное оформление. Вместо того чтобы выводить в отчет "Да" или "Нет", мы можем заменить представление этих значений. В настройках СКД на закладке "Условное оформление" создадим правило: если ЭтоТП равно Истина, то текст оформления — "Технологический процесс". Если Ложь — "Технологический цикл".

Во-вторых, проанализируем структуру группировок. Чтобы данные не перемешивались, в настройках отчета (вкладка "Настройки") добавим следующую иерархию:

  1. Группировка по полю ЭтоТП.
  2. Группировка по полю Подразделение.
  3. Детальные записи.

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

Оптимизация производительности: Уходим от "точек"

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

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

Архитектурный совет: Регистры vs Табличные части

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

Рассмотрим правильную схему:

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

Заключение

Мы разобрали, как объединить данные из нескольких табличных частей с помощью запроса ОБЪЕДИНИТЬ ВСЕ. Этот метод является наиболее надежным для получения точных цифр без дублирования строк. Помните, что использование временных таблиц и правильная настройка группировок в СКД делают ваш код профессиональным, а отчеты — удобными для конечного пользователя.

← На главную