Как в СКД объединить несколько документов в одну строку при совпадении условий

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

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

Рассмотрим детально, как реализовать такой функционал, проанализируем настройки ресурсов и разберем механизмы расшифровки, которые позволяют превратить список ссылок в удобный интерактивный инструмент.

Анализ исходной структуры данных

Прежде всего, проанализируем запрос, который служит источником данных. В нашей ситуации используется объединение нескольких таблиц (Доставка, Забор, Транзит) через оператор ОБЪЕДИНИТЬ ВСЕ. Это правильный подход для сбора разнородных документов в единый поток данных. Однако стандартная группировка в самом тексте запроса (SQL-группировка) не позволит нам «склеить» ссылки в строку — она либо выберет одну (первую попавшуюся) ссылку, либо потребует перечисления всех ссылок в блоке СГРУППИРОВАТЬ ПО, что снова приведет к размножению строк.

Посмотрим на пример структуры запроса, который мы будем использовать в качестве фундамента для СКД:


ВЫБРАТЬ
    Доставка.Ссылка КАК СсылкаДокумент,
    Доставка.Клиент КАК Клиент,
    Доставка.АдресДоставки КАК Адрес,
    Доставка.ДатаВыдачи КАК ДатаИсполнения,
    Доставка.Курьер КАК Сотрудник,
    1 КАК Количество
ИЗ
    Документ.Доставка КАК Доставка
ГДЕ
    Доставка.Проведен = ИСТИНА

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Забор.Ссылка,
    Забор.Клиент,
    Забор.АдресДоставки,
    Забор.ДатаВыдачи,
    Забор.Курьер,
    1
ИЗ
    Документ.Забор КАК Забор
ГДЕ
    Забор.Проведен = ИСТИНА

Главная хитрость заключается в том, что объединение строк мы будем делать не в запросе, а на уровне выражений ресурсов СКД.

Настройка ресурсов: Функция СоединитьСтроки

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

Разберем шаги по настройке вкладки Ресурсы:

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

Проанализируем, почему мы используем именно такую конструкцию в выражении ресурса. Функция Массив() собирает все значения ссылок, попавших в текущую группировку, в коллекцию. Затем функция СоединитьСтроки() берет этот массив, извлекает представления объектов (названия документов) и объединяет их через указанный разделитель (в нашем случае — запятая с пробелом). Параметр "Нет дублей" гарантирует, что если один и тот же документ по какой-то причине попал в выборку дважды, он не будет дублироваться в строке.

Настройка группировок для выполнения условий

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

Рассмотрим правильный порядок настройки группировок:

  1. В структуре отчета создаем одну группировку.
  2. В поле Группируемые поля добавляем те реквизиты, которые должны быть одинаковыми для объединения:
    • Клиент
    • Адрес
    • ДатаИсполнения
    • Сотрудник
  3. На вкладке Выбранные поля этой группировки добавляем:
    • Поля группировки (Клиент, Адрес и т.д.).
    • Наш ресурс СсылкаДокумент.
    • Наш ресурс Количество.

Важно помнить: мы не используем детальные записи (пустую группировку) под этой основной группировкой, иначе мы снова получим по одной строке на каждый документ.

Сохранение интерактивности ссылок (Расшифровка)

Один из самых частых вопросов: «Если я соединю ссылки в строку, они станут просто текстом. Как мне открыть документ?». В СКД реализован встроенный механизм обработки массивов в ресурсах.

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

Если же требуется более специфичное поведение (например, открыть сразу все документы или выполнить расчет), мы можем воспользоваться событием ОбработкаРасшифровки в модуле формы отчета. Рассмотрим пример программной обработки:


Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
    
    ПеременнаяДанные = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
    Поля = ПеременнаяДанные.Элементы[Расшифровка].ПолучитьПоля();
    
    ПолеДокумент = Поля.Найти("СсылкаДокумент");
    Если ПолеДокумент <> Неопределено Тогда
        Если ТипЗнч(ПолеДокумент.Значение) = Тип("Массив") Тогда
            СтандартнаяОбработка = Ложь;
            Для Каждого Док Из ПолеДокумент.Значение Цикл
                ОткрытьЗначение(Док);
            КонецЦикла;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Визуальное оформление: Группировка в строку

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

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

Рекомендации по оптимизации запроса

Поскольку мы работаем с большим количеством документов через UNION ALL, проанализируем ситуацию с производительностью. Чтобы отчет работал быстро даже при больших объемах данных, придерживайтесь следующих правил:

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

← На главную