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