При разработке отчетов в Системе компоновки данных (СКД) часто возникает задача вывести документы различных типов (например, ПриходОтПоставщика и ОтгрузкаПокупателю) в единой колонке, чтобы сформировать общий реестр или хронологический список операций.
Начинающие разработчики часто пытаются решить эту задачу путем соединения таблиц с использованием условий ВЫБОР КОГДА ... ЕСТЬ NULL или добавлением отдельных полей для каждого документа. Однако такие подходы приводят либо к дублированию колонок в настройках структуры отчета, либо к некорректному заполнению данных. Рассмотрим, как правильно объединить документы разных типов в одном поле СКД и каких подводных камней следует избегать.
Если в схеме компоновки данных добавить поля ссылок из разных таблиц как отдельные реквизиты набора данных, платформа 1С воспринимает их как независимые поля. В настройках структуры отчета они будут отображаться как разные группировки или колонки (например, Ссылка и Ссылка1).
Для того чтобы результирующее поле содержало ссылки разных документов и выводилось в одной колонке, необходимо объединить выборки на уровне запроса с помощью конструктора ОБЪЕДИНИТЬ ВСЕ (UNION ALL). В этом случае платформа автоматически присвоит полю составной тип данных, включающий типы всех объединяемых документов.
Проанализируем пример запроса, с помощью которого документы поступления и реализации объединяются в единый набор данных с сохранением общих суммовых показателей и аналитики:
ВЫБРАТЬ
ОтгрузкаПокупателюТЧ.Ссылка КАК Документ,
СУММА(ОтгрузкаПокупателюТЧ.НДС) КАК НДС,
ОтгрузкаПокупателюТЧ.СтавкаНДС КАК СтавкаНДС
ПОМЕСТИТЬ ВТ_Данные
ИЗ
Документ.ОтгрузкаПокупателю.ТЧ КАК ОтгрузкаПокупателюТЧ
СГРУППИРОВАТЬ ПО
ОтгрузкаПокупателюТЧ.Ссылка,
ОтгрузкаПокупателюТЧ.СтавкаНДС
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ПриходОтПоставщикаТЧ.Ссылка,
СУММА(ПриходОтПоставщикаТЧ.НДС),
ПриходОтПоставщикаТЧ.СтавкаНДС
ИЗ
Документ.ПриходОтПоставщика.ТЧ КАК ПриходОтПоставщикаТЧ
СГРУППИРОВАТЬ ПО
ПриходОтПоставщикаТЧ.Ссылка,
ПриходОтПоставщикаТЧ.СтавкаНДС
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_Данные.Документ КАК Документ,
ВТ_Данные.НДС КАК НДС,
ВТ_Данные.СтавкаНДС КАК СтавкаНДС
ИЗ
ВТ_Данные КАК ВТ_Данные
Благодаря использованию оператора ОБЪЕДИНИТЬ ВСЕ поле Документ становится составным и содержит ссылки как на отгрузки, так и на приходные документы. В настройках СКД такое поле выводится в одной колонке.
При использовании составных полей в СКД следует учитывать несколько технических нюансов, влияющих на производительность и внешний вид отчета:
Документ.Контрагент) вызывает неявное левое соединение (LEFT JOIN) ко всем таблицам документов, входящим в составной тип. Чтобы избежать снижения скорости работы отчета, реквизиты рекомендуется выбирать непосредственно внутри каждого блока ОБЪЕДИНИТЬ ВСЕ запроса или использовать явное приведение типа через ВЫРАЗИТЬ().Дата или МоментВремени и настроить выражение упорядочивания на вкладке «Наборы данных» или задать сортировку на вкладке «Настройки».ТипЗначения(), например: ВЫБОР КОГДА ТипЗначения(Документ) = Тип("Документ.ПриходОтПоставщика") ТОГДА ... ИНАЧЕ ... КОНЕЦ.Регистратор изначально имеет составной тип и избавляет от необходимости вручную объединять таблицы документов.Разберем также важную деталь, с которой часто сталкиваются на практике: если при проверке отчета вы видите документы только одного типа, убедитесь в наличии данных за выбранный период и проверьте отсутствие установленных отборов в настройках компоновки данных.