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

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

При работе с Системой Компоновки Данных (СКД) в 1С часто возникает задача вывода информации из нескольких, по сути, независимых наборов данных или "коллекций" (например, данные за "Весну23" и "Осень23") таким образом, чтобы каждая коллекция представляла собой отдельный столбец в отчете, а данные не дублировались и агрегировались корректно. Однако, на практике, мы сталкиваемся с дублированием столбцов, отсутствием нужных данных или их неверным "умножением" при агрегации.

Понимание проблемы: Дублирование колонок и некорректные агрегаты

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

Давайте выясним основные причины таких проблем:

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

Рассмотрим подробнее подходы к решению этих проблем.

Решение 1: Настройка связей наборов данных и группировок

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

Использование нескольких наборов данных и их связей

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

Корректные группировки

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

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

Решение 2: Корректное использование детальных записей

Настройка детальных записей играет ключевую роль в выводе "основных данных" (не ресурсов).

  1. Что такое детальные записи: В СКД <Детальные записи> – это группировка, которая отображает каждую строку, возвращаемую запросом, без дополнительной агрегации. Она присутствует в любом отчете СКД.
  2. Вывод "основных данных": Если мы хотим видеть колонки "КоличествоМагазинов", "ОтклонениеОтМаксимума", "ОтклонениеОтМинимума" и другие, которые не являются агрегированными ресурсами, нам необходимо включить их в выбор полей детальных записей.
    • На вкладке "Настройки" отчета, если вы используете сложную структуру (например, с группировками строк и колонок), убедитесь, что в настройках для <Детальные записи> или для той группировки, где эти поля должны отображаться, они выбраны для вывода.
    • Если у вас нет явных группировок, и вы хотите вывести все поля из запроса, просто выберите их в "Выбранных полях".
  3. Влияние на ресурсы: Если вы выбираете только поля-ресурсы, группировка <Детальные записи> может быть автоматически преобразована в общий итог, что приведет к отсутствию детальной информации. Поэтому важно включать в выбор поля, которые не являются ресурсами, чтобы сохранить детальность.

Решение 3: Правильная настройка ресурсов и агрегатных функций

Проблема "умножения на 2" или более, когда значения ресурсов отображаются некорректно, является одной из самых частых. Она возникает из-за того, что данные дублируются на этапе формирования запроса, а затем СКД агрегирует (суммирует, усредняет) эти дублированные значения.

Диагностика и устранение "умножения на 2"

  1. Проверка запроса на дублирование строк:
    • Причина: Чаще всего, дублирование возникает из-за некорректных соединений (JOIN) в запросе. Например, если одна строка из основной таблицы соединяется с несколькими строками из подчиненной таблицы, то исходная строка будет повторена столько раз, сколько соответствий найдено.
    • Решение: В консоли запросов или отладчиком запросов проверьте, какие строки возвращает ваш запрос до того, как они попадут в СКД. Если вы видите, что какие-то записи дублируются, используйте ключевое слово РАЗЛИЧНЫЕ в вашем запросе, чтобы выбрать только уникальные строки. Однако, будьте осторожны, РАЗЛИЧНЫЕ может повлиять на другие расчеты, если вам нужны все строки.
      
      ВЫБРАТЬ РАЗЛИЧНЫЕ
          Таблица1.Поле1,
          Таблица1.Поле2
      ИЗ
          РегистрНакопления.Продажи КАК Таблица1
      
    • Корректировка связей: Пересмотрите связи между таблицами в запросе. Возможно, вам нужно изменить тип соединения или добавить дополнительные условия в ГДЕ, чтобы уменьшить количество возвращаемых строк.
  2. Правильная настройка агрегатных функций для ресурсов:

    Для каждого ресурса (например, "КоличествоМагазинов", "ОтклонениеОтМаксимума") необходимо явно указать подходящую агрегатную функцию на вкладке "Ресурсы" схемы компоновки данных. Не оставляйте функцию по умолчанию, если она не подходит.

    • Для подсчета уникальных значений: Если "КоличествоМагазинов" должно быть количеством уникальных магазинов, используйте функцию Количество(Различные Магазин).

      Например, в поле "Выражение" для ресурса "КоличествоМагазинов":

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

      Например, для ресурса "ОтклонениеОтМаксимума":

      Среднее(ОтклонениеОтМаксимума)
    • Для сумм: Для обычных сумм используйте Сумма.
    • Для сложных расчетов: Иногда требуется использовать более сложные выражения, включающие несколько функций или условия, чтобы получить нужный результат.
  3. Исключение лишних полей из ресурсов:

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

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

Решение 4: Применение макетов компоновки данных (СКД)

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

Когда макеты необходимы?

  1. Сложное форматирование: Если требуется специфичное оформление заголовков, подвалов, ячеек, или если нужно располагать данные из разных коллекций не просто в соседних столбцах, а, например, в определенном порядке или с дополнительными текстовыми вставками.
  2. Нестандартные итоги: Для вывода итогов, которые не могут быть рассчитаны стандартными агрегатными функциями СКД.
  3. Индивидуальный вывод для каждой группировки/поля: Если каждая коллекция должна выводиться с индивидуальным заголовком или иметь свои собственные специфические строки итогов.

Типы макетов, которые мы можем использовать:

Процесс настройки макета для вывода нескольких коллекций:

  1. Создание группировки по "коллекции": В настройках отчета (на вкладке "Настройки") создаем группировку, которая будет разделять наши коллекции (например, группировка по полю ВидКоллекции, которое может принимать значения "Весна23", "Осень23"). Эту группировку помещаем в "Столбцы".
  2. Добавление макета группировки:
    • Выделяем созданную группировку в настройках.
    • Открываем "Дополнительные настройки" (или "Прочие настройки").
    • Находим "Макеты" и нажимаем кнопку "Открыть".
    • Создаем новый макет для "Заголовка группировки", "Подвала группировки" или "Детальных записей группировки".
  3. Настройка областей макета: В открывшемся макете мы можем создать различные области (ячейки), в которые будут выводиться данные.
    • Мы можем объединять ячейки, задавать шрифты, цвета.
    • В каждую ячейку вставляем "Параметр" ([ПолеОтчета]), который будет заполняться значениями из СКД. Например, [КоличествоМагазинов], [ОтклонениеОтМаксимума].
    • Для каждой коллекции мы можем создать свой уникальный набор ячеек и расположить их так, как нам нужно.
  4. Выражения для макета: В свойствах областей макета или в параметрах СКД мы можем использовать выражения для получения нужных значений. Например, если у нас есть поле КоличествоМагазиновВесна и КоличествоМагазиновОсень, мы можем явно вывести их в разные ячейки макета, привязанные к соответствующим группировкам или параметрам.
  5. Пример макета для вывода в отдельных столбцах:

    Предположим, у нас есть поле Сезон в запросе, которое содержит "Весна23" и "Осень23". Мы добавляем группировку по Сезон в столбцы. Затем для полей, которые должны выводиться для каждого сезона, мы можем использовать макеты поля или макеты для заголовков группировок, чтобы явно указать, какие данные и как должны отображаться.

    Допустим, нам нужно вывести КоличествоМагазинов для каждого сезона в своей колонке. Без макетов СКД, если мы просто добавим КоличествоМагазинов в выбранные поля и сгруппируем по Сезон в столбцах, СКД сделает это автоматически. Но если нужно специфическое оформление заголовка для каждого сезона или особая логика, мы идем в макет.

    В макете группировки Сезон (тип "Заголовок") мы можем написать:

    
    Область("ЗаголовокСезона")
        Параметр "НаименованиеСезона" = [Сезон]
        Параметр "ЗаголовокКоличества" = "Кол-во магазинов"
    

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

Ограничения макетов:

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

Комплексный подход к решению

Для эффективного решения вашей задачи, мы рекомендуем следующий комплексный подход:

  1. Анализ запроса: Прежде всего, детально проанализируйте ваш запрос к данным. Убедитесь, что он не возвращает лишних или дублирующихся строк, которые могут стать причиной "умножения" ресурсов или неправильного отображения. Используйте РАЗЛИЧНЫЕ, если это уместно, и проверьте условия соединений.
  2. Настройка наборов данных и связей: Если у вас несколько коллекций, определите их как отдельные наборы данных и настройте между ними правильные связи (Левое, Правое, Полное соединение) по ключевым полям.
  3. Корректная группировка: Используйте группировки (например, по "периоду", "коллекции") в столбцах, чтобы каждая коллекция формировала отдельный столбец.
  4. Тщательная настройка ресурсов: Для каждого поля, которое является агрегатом, явно задайте правильную агрегатную функцию (Сумма, Среднее, Количество(Различные)) на вкладке "Ресурсы". Уберите из ресурсов те поля, которые должны выводиться как обычные детальные записи.
  5. Проверка детальных записей: Убедитесь, что все необходимые "основные данные" (не ресурсы) выбраны для вывода в <Детальные записи> или в соответствующих группировках.
  6. Применение макетов для сложного форматирования: Если после всех предыдущих шагов отчет все еще не выглядит так, как требуется (например, нужно объединить ячейки заголовков, добавить специфические подписи), тогда используйте макеты группировок или макеты полей для точечной настройки вывода каждой колонки и ячейки.

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

← На главную