При разработке отчетов на системе компоновки данных (СКД) часто возникает задача, когда стандартная сортировка по алфавиту для полей группировки не подходит. Представим ситуацию: у нас есть группировка по полю ВидОперации, внутри которой выводятся документы. По умолчанию 1С отсортирует «Вид операции 1», «Вид операции 2» и так далее. Однако для анализа бизнеса бывает критично увидеть группировки в хронологическом порядке — по дате самого раннего документа в каждой группе.
В этой статье мы подробно разберем, как заставить СКД игнорировать алфавитный порядок и использовать дату первого вложенного документа для ранжирования родительских группировок. Мы рассмотрим три основных метода: через изменение запроса, через выражения упорядочивания и через механизм ресурсов.
Этот метод основан на предварительной подготовке данных еще на уровне SQL-запроса. Наша задача — вычислить минимальную дату для каждого вида операции и присоединить её к основной выборке. Рассмотрим, как это реализовать по шагам.
Проанализируем структуру запроса. Нам необходимо создать временную таблицу, где для каждого уникального значения группировочного поля будет определена точка отсчета (минимальная дата).
ВЫБРАТЬ
Док.ВидОперации КАК ВидОперации,
МИНИМУМ(Док.Дата) КАК ДатаПервогоДокумента
ПОМЕСТИТЬ ВТ_Сортировка
ИЗ
Документ.Продажи КАК Док
СГРУППИРОВАТЬ ПО
Док.ВидОперации
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ОсновнаяТаблица.ВидОперации,
ОсновнаяТаблица.Ссылка КАК Документ,
ОсновнаяТаблица.Дата,
ВТ_Сортировка.ДатаПервогоДокумента
ИЗ
Документ.Продажи КАК ОсновнаяТаблица
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Сортировка КАК ВТ_Сортировка
ПО ОсновнаяТаблица.ВидОперации = ВТ_Сортировка.ВидОперации
После того как мы добавили поле ДатаПервогоДокумента в набор данных, мы можем перейти в настройки СКД. На закладке «Настройки» выберем группировку ВидОперации, перейдем на вкладку «Сортировка» и добавим наше новое поле. Важно помнить: если просто отсортировать запрос в консоли, СКД может переопределить этот порядок при компоновке результата, поэтому настройка в самом отчете обязательна.
Это, пожалуй, самый элегантный и «чистый» способ с точки зрения архитектуры СКД. Он не требует изменения текста запроса и создания временных таблиц. Мы воспользуемся механизмом, который позволяет указать системе, какое значение использовать для сортировки конкретного поля.
Разберем алгоритм настройки:
ВидОперации.Минимум(Дата).Теперь, когда СКД будет строить дерево группировок по полю ВидОперации, она автоматически вычислит минимальную дату для всех записей внутри этой группы и использует её для определения позиции группы в отчете. Это избавляет нас от необходимости добавлять лишние поля в итоговый отчет.
Если мы хотим управлять сортировкой более гибко (например, дать пользователю возможность менять её в настройках варианта отчета), лучше всего использовать механизм ресурсов. Выясним, как это работает.
Для начала сделаем дату ресурсом. Перейдем на закладку «Ресурсы» и добавим поле Дата (или создадим расчетное поле ДатаДляСортировки с выражением Минимум(Дата)). В колонке «Рассчитывать по...» укажем наше поле группировки ВидОперации.
Теперь проанализируем настройки самого отчета:
ВидОперации.Авто. Это критический момент: если оставить Авто, система может отдать приоритет самому полю группировки, и алфавитный порядок сохранится.Преимущество этого метода в том, что он позволяет легко переключаться между сортировкой «по дате первого документа» и «по дате последнего документа» (просто сменив Минимум на Максимум), не меняя структуру запроса.
При реализации хронологической сортировки мы можем столкнуться с проблемой пустых дат. Если в системе есть документы с незаполненной датой, они могут оказаться либо в самом верху, либо в самом низу списка, что может запутать пользователя. Чтобы избежать этого, в Выражении упорядочивания или в расчетном поле можно использовать конструктор ЕСТЬNULL.
Пример выражения для расчетного поля:
ВЫБОР
КОГДА МИНИМУМ(Дата) ЕСТЬ NULL ТОГДА ДАТАВРЕМЯ(3999, 12, 31)
ИНАЧЕ МИНИМУМ(Дата)
КОНЕЦ
Такой подход гарантирует, что группы с некорректными данными всегда будут уходить в конец списка. Также стоит отметить вопрос оптимизации. Метод с «Выражением упорядочивания» внутри СКД (Метод 2) обычно работает быстрее на больших объемах данных, чем соединение с виртуальными таблицами в запросе (Метод 1). Это происходит потому, что СКД рассчитывает итоги и порядок сортировки за один проход по результату основного запроса, не нагружая сервер СУБД дополнительными соединениями (JOIN).
Проанализируем также влияние иерархии. Если ваша группировка ВидОперации имеет иерархическую структуру, убедитесь, что в настройках ресурса стоит расчет по всем уровням иерархии, иначе сортировка родительских узлов может вести себя непредсказуемо.
Подводя итог, можно сказать, что выбор метода зависит от ваших целей: для быстрой и жесткой настройки лучше всего подходит Выражение упорядочивания, а для предоставления выбора пользователю — механизм ресурсов в настройках компоновщика.