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