Как вывести последнее событие для каждого контрагента в отчете СКД

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

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

Способ 1: Использование вложенного запроса с получением максимальной даты

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

Рассмотрим пример построения такого запроса:


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

Важный нюанс: Если в одну секунду создано два события, запрос с фильтром по дате может вернуть обе записи. Чтобы избежать этого, рекомендуется использовать МАКСИМУМ(Событие.Ссылка) или МАКСИМУМ(Событие.МоментВремени) вместо даты, так как ссылка в 1С имеет внутренний порядок и всегда уникальна.

Способ 2: Настройка ресурсов СКД и функции нумерации

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

  1. Добавим в набор данных поле Дата и Событие.
  2. Перейдем на закладку Ресурсы и добавим новый ресурс. В качестве выражения укажем НомерПоПорядкуВГруппировке(). Рассчитывать этот ресурс нужно по той группировке, которая отвечает за участника (контрагента).
  3. В настройках отчета создадим группировку по Контрагенту, а внутри нее — детальные записи или группировку по Событию.
  4. Для вложенной группировки установим Упорядочивание по полю Дата в порядке Убывания.
  5. На закладке Отбор этой группировки установим условие: наш созданный ресурс Номер = 1.

Таким образом, система сначала отсортирует все события по дате от новых к старым внутри каждого контрагента, присвоит им порядковые номера, а затем отсечет все, кроме первого (самого свежего).

Отображение всех контрагентов (Левое соединение)

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

Чтобы в итоговом отчете не было пустых строк или некорректных группировок для контрагентов без событий, проанализируем настройки ролей полей. В схеме компоновки данных для поля Событие на закладке «Наборы данных» стоит установить флаг Игнорировать значения NULL. Это позволит СКД корректно обрабатывать записи, где связь не нашла соответствия в таблице документов.

Оптимизация производительности

Рассмотрим рекомендации по ускорению работы такого отчета, если база данных содержит сотни тысяч записей:

Итоги настройки группировок

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

← На главную