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

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

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

Постановка задачи и исходные данные

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

Проблемная задолженность | Контрагент | Дата образования (по договору) | Дата окончания (первоначально по договору) | Дата пролонгации
Да | ТОО АЯК | 01.01.21 | 31.01.21 | 28.02.21
Да | ТОО АЯК | 01.01.21 | 31.01.21 | 31.03.21
Да | ТОО АЯК | 01.01.21 | 31.01.21 | 15.04.21

Мы видим, что для одного и того же контрагента и договора, остальные поля дублируются, а различается только «Дата пролонгации». Желаемый результат – это агрегация всех дат пролонгации в одну ячейку для уникальной строки договора:

Проблемная задолженность | Контрагент | Дата образования (по договору) | Дата окончания (первоначально по договору) | Дата пролонгации
Да | ТОО АЯК | 01.01.21 | 31.01.21 | 28.02.21, 31.03.21, 15.04.21

Или, если поля «Проблемная задолженность», «Дата образования (по договору)» и «Дата окончания (первоначально по договору)» также могут быть разными для одного контрагента (т.е. они являются частью уникальной записи, а не только контрагент), то:

Контрагент | Дата пролонгации
ТОО 1 | 01.01.21, 10.01.21
ТОО 2 | 01.01.21, 10.01.21, 31.01.21

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

Решение: Использование ресурсов СКД и правильной настройки группировок

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

  1. 1. Анализ запроса и получение всех дат

    Прежде всего, убедимся, что наш запрос действительно извлекает все необходимые даты пролонгации для каждого договора. Из представленного текста запроса видно, что таблица ВТ_ВсеДатыПролонгации формируется на основе регистра сведений дог_ДоговорыИДополнительныеСоглашения, а затем соединяется с основной таблицей ВТ_ОстатокНа1273_СуммаДолгаПоУчетнойЦене через ЛЕВОЕ СОЕДИНЕНИЕ по полю Договор. Это гарантирует, что для каждого договора будут получены все записи о его пролонгациях, что является правильным подходом.

    Вот соответствующий фрагмент запроса:

    
    ВЫБРАТЬ
        // ... другие поля ...
        ВТ_ВсеДатыПролонгации.ДатаПролонгации
    ПОМЕСТИТЬ СоединенныеТаблицы
    ИЗ
        ВТ_ОстатокНа1273_СуммаДолгаПоУчетнойЦене КАК ВТ_ОстатокНа1273_СуммаДолгаПоУчетнойЦене
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ВсеДатыПролонгации КАК ВТ_ВсеДатыПролонгации
        ПО ВТ_ОстатокНа1273_СуммаДолгаПоУчетнойЦене.Договор = ВТ_ВсеДатыПролонгации.Договор
    // ... остальные соединения и условия ...
    

    Этот запрос на данном этапе создает несколько строк для одного договора, если у него есть несколько дат пролонгации. Именно это поведение мы и хотим изменить с помощью СКД.

  2. 2. Создание ресурса для агрегации дат

    Для того чтобы собрать все даты пролонгации в одну строку, мы воспользуемся механизмом ресурсов СКД. Перейдите на закладку «Ресурсы» в настройках схемы компоновки данных.

    1. Создайте новый ресурс.
    2. В поле «Поле» укажите ДатаПролонгации.
    3. В поле «Выражение» используйте функцию СоединитьСтроки(). Эта функция предназначена для объединения строковых представлений значений поля в одну строку с использованием заданного разделителя.

    Ваше выражение будет выглядеть так:

    СоединитьСтроки(ДатаПролонгации, ", ")

    При желании вы можете указать другое имя для этого ресурса, например, ВсеДатыПролонгации, для лучшей читаемости. Если вам нужен именно массив дат для дальнейшей программной обработки, а не просто строка, вы можете использовать Массив(ДатаПролонгации), а затем преобразовать его в строку в макете или на клиентском коде. Но для вывода в одну ячейку СоединитьСтроки() является более прямым решением.

  3. 3. Настройка группировок в структуре отчета

    Этот шаг является критически важным. Проблема дублирования строк возникает из-за того, что СКД по умолчанию выводит все детальные записи, полученные запросом. Чтобы агрегировать даты, мы должны определить, какие поля формируют уникальную "шапку" строки, а затем сгруппировать по ним.

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

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

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

  4. 4. Проверка итогового результата

    После выполнения этих шагов ваш отчет должен выглядеть так, как было запланировано:

    Проблемная задолженность | Контрагент | Дата образования (по договору) | Дата окончания (первоначально по договору) | Дата пролонгации
    Да | ТОО АЯК | 01.01.21 | 31.01.21 | 28.02.21, 31.03.21, 15.04.21

    Мы успешно собрали все даты пролонгации в одну ячейку, устранив дублирование остальных данных договора.

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

← На главную