Почему в отчете СКД группируются одинаковые записи из табличной части документа?

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

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

Анализируем исходную проблему

Изначально мы имеем запрос, который выбирает данные из документа "БюджетПроекта" и его табличной части "ФОТПодрядчики". Проблема заключается в том, что в отчете СКД две абсолютно одинаковые записи из табличной части документа, например, для одного и того же подрядчика с одинаковой суммой, объединяются в одну строку, хотя в источнике данных это две разные строки.

Пример запроса, который выбирает данные:


ВЫБРАТЬ
    БюджетПроекта.Дата КАК ДатаБюджета,
    БюджетПроекта.Ссылка КАК БюджетПроекта,
    БюджетПроекта.Проект КАК Проект,
    БюджетПроектаФОТПодрядчики.Месяц КАК ДатаФОТ,
    БюджетПроектаФОТПодрядчики.Специалист КАК Подрядчик,
    ПараметрыСотрудника.Подразделение КАК ПодразделениеПодрядчика,
    БюджетПроектаФОТПодрядчики.ТипСтавки КАК ТипСтавки,
    БюджетПроектаФОТПодрядчики.КоличествоЧасов КАК КоличествоЧасов,
    БюджетПроектаФОТПодрядчики.Ставка КАК Ставка,
    БюджетПроектаФОТПодрядчики.Сумма КАК Сумма,
    ПараметрыСотрудника.Подразделение.Руководитель КАК РуководительПодрядчика
ИЗ
    Документ.БюджетПроекта КАК БюджетПроекта
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.БюджетПроекта.ФОТПодрядчики КАК БюджетПроектаФОТПодрядчики
        ПО БюджетПроекта.Ссылка = БюджетПроектаФОТПодрядчики.Ссылка
        И (МЕСЯЦ(БюджетПроекта.Дата) = МЕСЯЦ(БюджетПроектаФОТПодрядчики.Месяц))
        И (ГОД(БюджетПроекта.Дата) = ГОД(БюджетаПроектаФОТПодрядчики.Месяц))
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПараметрыСотрудника КАК ПараметрыСотрудника
        ПО БюджетПроектаФОТПодрядчики.Специалист = ПараметрыСотрудника.КонтактноеЛицо
ГДЕ
    НЕ БюджетПроектаФОТПодрядчики.Специалист ЕСТЬ NULL
    И БюджетПроекта.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания

В этом запросе мы выбираем различные параметры, связанные с проектом и ФОТ подрядчиков. Именно по данным, которые выбираются этим запросом и затем используются в группировках СКД, происходит агрегация.

Понимание принципов работы группировок в СКД

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

Принцип агрегации данных. СКД объединяет (агрегирует) данные на основе полей, которые мы указываем в настройках группировки. Если для нескольких исходных строк из набора данных все значения полей, участвующих в текущей группировке, оказываются идентичными, СКД автоматически "схлопывает" эти строки в одну логическую группу. Если в отчете присутствуют поля-ресурсы (например, "Сумма", "КоличествоЧасов"), их значения будут автоматически просуммированы или агрегированы другим способом (в зависимости от настроек ресурса) для этой объединенной группы. Например, если у нас есть две строки: (Проект А, Подрядчик Б, Сумма 100) и (Проект А, Подрядчик Б, Сумма 100), и мы группируем по "Проект" и "Подрядчик", то при выведенной "Сумме" в отчете мы увидим (Проект А, Подрядчик Б, Сумма 200). Это происходит потому, что для СКД эти две записи, при текущем уровне группировки, являются одним и тем же объектом.

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

Выявляем причину группировки

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

В нашем случае, как было описано, в одном и том же документе "БюджетПроекта" в табличной части "ФОТПодрядчики" присутствуют две строки для одного и того же подрядчика с абсолютно одинаковыми значениями по всем полям, которые мы выводим в отчете. Без дополнительного уникального поля, СКД не сможет их различить. То есть, с точки зрения полей, которые мы выбрали для группировки, эти две строки не имеют никаких различий.

Решение проблемы: Добавление уникального поля в группировку

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

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

Пошаговая инструкция по реализации

Давайте по шагам разберем, как добавить НомерСтроки в группировку нашего отчета СКД.

  1. Откройте схему компоновки данных. Перейдите к настройкам отчета, который вызывает проблему, и откройте его схему компоновки данных (например, через конфигуратор, выбрав нужный отчет и открыв его макет).

  2. Перейдите на вкладку "Наборы данных". Убедитесь, что ваш запрос выбирает поле НомерСтроки. Если его нет в исходном запросе, мы можем добавить его. Дополним наш запрос, чтобы он выбирал НомерСтроки табличной части БюджетПроектаФОТПодрядчики:

    
    ВЫБРАТЬ
        БюджетПроекта.Дата КАК ДатаБюджета,
        БюджетПроекта.Ссылка КАК БюджетПроекта,
        БюджетПроекта.Проект КАК Проект,
        БюджетПроектаФОТПодрядчики.Месяц КАК ДатаФОТ,
        БюджетПроектаФОТПодрядчики.Специалист КАК Подрядчик,
        ПараметрыСотрудника.Подразделение КАК ПодразделениеПодрядчика,
        БюджетПроектаФОТПодрядчики.ТипСтавки КАК ТипСтавки,
        БюджетПроектаФОТПодрядчики.КоличествоЧасов КАК КоличествоЧасов,
        БюджетПроектаФОТПодрядчики.Ставка КАК Ставка,
        БюджетПроектаФОТПодрядчики.Сумма КАК Сумма,
        БюджетПроектаФОТПодрядчики.НомерСтроки КАК НомерСтрокиФОТ, // Добавляем НомерСтроки
        ПараметрыСотрудника.Подразделение.Руководитель КАК РуководительПодрядчика
    ИЗ
        Документ.БюджетПроекта КАК БюджетПроекта
            ЛЕВОЕ СОЕДИНЕНИЕ Документ.БюджетПроекта.ФОТПодрядчики КАК БюджетПроектаФОТПодрядчики
            ПО БюджетПроекта.Ссылка = БюджетПроектаФОТПодрядчики.Ссылка
            И (МЕСЯЦ(БюджетПроекта.Дата) = МЕСЯЦ(БюджетПроектаФОТПодрядчики.Месяц))
            И (ГОД(БюджетПроекта.Дата) = ГОД(БюджетаПроектаФОТПодрядчики.Месяц))
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПараметрыСотрудника КАК ПараметрыСотрудника
            ПО БюджетПроектаФОТПодрядчики.Специалист = ПараметрыСотрудника.КонтактноеЛицо
    ГДЕ
        НЕ БюджетПроектаФОТПодрядчики.Специалист ЕСТЬ NULL
        И БюджетПроекта.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
    

    Мы добавили поле БюджетПроектаФОТПодрядчики.НомерСтроки КАК НомерСтрокиФОТ. Теперь это поле доступно в схеме компоновки данных в списке доступных полей набора данных.

  3. Перейдите на вкладку "Настройки". Здесь мы видим структуру нашего отчета с различными группировками (например, по "Проекту", "Подрядчику" и т.д.). Эта вкладка определяет, как данные будут агрегированы и представлены пользователю.

  4. Найдите проблемную группировку. Это та группировка, на уровне которой происходит объединение строк. Как правило, это самая нижняя или одна из нижних группировок, которая должна выводить детальные записи, но вместо этого их схлопывает. Если у вас есть иерархическая структура группировок (например, "Проект" -> "Подрядчик" -> "Детализация"), то добавлять НомерСтрокиФОТ следует на тот уровень, где мы ожидаем видеть каждую отдельную запись, но видим их объединенными. Часто это уровень детализации, который следует непосредственно за последней смысловой группировкой.

  5. Добавьте НомерСтрокиФОТ в поля группировки. Для выбранной группировки откройте ее свойства (обычно двойным щелчком или через контекстное меню) и в списке "Поля группировки" добавьте наше новое поле НомерСтрокиФОТ. Нажмите кнопку "Добавить поле группировки" и выберите НомерСтрокиФОТ из списка доступных полей набора данных.

    Важно: Вы можете решить не выводить это поле в самом отчете для пользователя, если оно не несет для него смысловой нагрузки. Для этого на вкладке "Выбранные поля" для данной группировки просто не включайте НомерСтрокиФОТ в список выводимых полей. Однако его наличие в "Полях группировки" будет обеспечивать уникальность строк, предотвращая их объединение.

  6. Проверьте отчет. Сформируйте отчет заново. Теперь СКД будет рассматривать каждую строку табличной части документа как уникальную, поскольку ее НомерСтрокиФОТ будет отличаться, и соответственно, все записи будут выводиться отдельно, как и ожидалось. Вы должны увидеть две отдельные строки для вашего подрядчика с одинаковыми суммами.

Альтернативные и более сложные сценарии

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

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

    
    ВЫБРАТЬ
        // ... другие поля ...
        БюджетПроекта.Ссылка КАК СсылкаДокумента,
        БюджетПроектаФОТПодрядчики.НомерСтроки КАК НомерСтрокиФОТ,
        ВЫРАЗИТЬ(БюджетПроекта.Ссылка КАК СТРОКА) + "_" + ВЫРАЗИТЬ(БюджетПроектаФОТПодрядчики.НомерСтроки КАК СТРОКА) КАК УникальныйИдентификаторСтрокиФОТ,
        // ... остальные поля ...
    ИЗ
        // ... ваш запрос ...
    

    В этом примере мы создали строковое поле УникальныйИдентификаторСтрокиФОТ, которое объединяет строковое представление ссылки на документ и строковое представление номера строки. Гарантируя, что каждый такой идентификатор будет уникальным, мы можем использовать его для группировки. Затем это новое поле УникальныйИдентификаторСтрокиФОТ добавляется в "Поля группировки" на вкладке "Настройки" СКД, аналогично тому, как мы добавляли НомерСтрокиФОТ.

  2. Использование ссылки на строку табличной части. Если в конфигурации существуют ссылки на строки табличных частей (что бывает реже для стандартных табличных частей, но встречается в некоторых специфических решениях или в сложных объектах, таких как Планы видов характеристик или некоторые справочники), то это поле также является уникальным идентификатором и может быть использовано в группировке. Например, это может быть поле типа "СтрокаТабличнойЧастиДокументаСсылка.БюджетПроекта_ФОТПодрядчики".

Заключение

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

← На главную