Почему колонки с неделями в отчете СКД выводятся не по порядку и как это исправить?

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

При разработке сложных отчетов в системе компоновки данных (СКД), особенно кросс-таблиц, программисты часто сталкиваются с тем, что колонки (например, недели или месяцы) выводятся в хаотичном порядке. Даже если в тексте запроса указано УПОРЯДОЧИТЬ ПО, а в настройках отчета задана сортировка, результат может оставаться неудовлетворительным. В данной статье мы разберем, почему это происходит, и рассмотрим пошаговое решение проблемы на примере формирования отчета по неделям.

Проанализируем причину проблемы

Основная причина «хаоса» в колонках заключается в том, как СКД обрабатывает данные. Если поле, по которому строится группировка колонок, является строковым (например, вы вручную склеили строку вида "Неделя №..."), система будет сортировать его как обычный текст по алфавиту. В таком случае «Неделя 10» может оказаться раньше «Недели 2», потому что единица меньше двойки.

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


// Фрагмент формирования временной таблицы недель
ВЫБРАТЬ
    ГОД(ПредставленияПериоды.Период) КАК Год,
    НЕДЕЛЯ(ПредставленияПериоды.Период) КАК НомерНедели,
    МИНИМУМ(ПредставленияПериоды.Период) КАК НачалоНедели,
    МАКСИМУМ(ПредставленияПериоды.Период) КАК КонецНедели
ПОМЕСТИТЬ ВТНедели
ИЗ
    ПредставленияПериоды КАК ПредставленияПериоды
СГРУППИРОВАТЬ ПО
    ГОД(ПредставленияПериоды.Период),
    НЕДЕЛЯ(ПредставленияПериоды.Период);

В данном примере автор пытался создать сложное строковое представление периода через функции ПОДСТРОКА и арифметические операции с датами прямо в запросе. Это не только перегружает код, но и создает проблемы с сортировкой, так как итоговое поле ПериодЗаказа становится длинной строкой.

Решение №1: Настройка «Выражения упорядочивания» в Наборе данных

Это самый надежный способ заставить СКД сортировать данные так, как нам нужно. Рассмотрим этот механизм подробнее. В конструкторе схемы компоновки данных перейдем на закладку «Наборы данных». Найдем в списке полей наше представление периода (например, ПериодЗаказа), которое мы выводим в колонки.

В колонке «Выражение упорядочивания» для этого поля необходимо указать другое поле, которое имеет числовой тип или тип даты и по которому логически должен строиться порядок. Например, если ПериодЗаказа — это строка "Заказано 01.01.2023 - 07.01.2023", то в выражении упорядочивания мы укажем НачалоНеделиЗаказа.

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

Решение №2: Использование функции Формат в СКД

Вместо того чтобы городить сложные конструкции в SQL-запросе для получения красивого названия недели, мы рекомендуем использовать стандартные возможности СКД. Рассмотрим, как упростить формирование представления периода:

  1. В запросе выберем только чистую дату начала недели: НАЧАЛОПЕРИОДА(ДатаДокумента, НЕДЕЛЯ) КАК НачалоНедели.
  2. В СКД на закладке «Наборы данных» для этого поля в колонке «Выражение представления» напишем: "Заказано " + Формат(НачалоНедели, "ДФ=dd.MM.yyyy") + " - " + Формат(КонецНедели, "ДФ=dd.MM.yyyy").
  3. Теперь поле остается датой для системы (и отлично сортируется), но пользователь видит красивую строку.

Решение №3: Сортировка внутри настроек группировки

Если отчет представляет собой таблицу (кросс-таблицу), общая сортировка отчета может не срабатывать для колонок. Проверим настройки конкретной группировки:

  1. Перейдем на закладку «Настройки».
  2. В дереве настроек слева выберем именно ту группировку, которая отвечает за колонки (наш период).
  3. В нижней части экрана перейдем на вкладку «Сортировка» (она относится именно к выбранной группировке).
  4. Добавим туда поле, отвечающее за хронологию (например, НомерНедели или НачалоНедели).
  5. Убедимся, что флажок «Использовать автосортировку» снят, если мы хотим задать свой жесткий порядок.

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

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


ВЫБРАТЬ 0 КАК Цифра ПОМЕСТИТЬ ВТЦифры ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1 ... // и так далее до 9

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, т1.Цифра + т10.Цифра * 10 + т100.Цифра * 100) КАК Дата
ПОМЕСТИТЬ ВТКалендарь
ИЗ
    ВТЦифры КАК т1, ВТЦифры КАК т10, ВТЦифры КАК т100
ГДЕ
    ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, т1.Цифра + т10.Цифра * 10 + т100.Цифра * 100) <= &КонецПериода;

ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(ВТКалендарь.Дата, НЕДЕЛЯ) КАК НачалоНедели,
    КОНЕЦПЕРИОДА(ВТКалендарь.Дата, НЕДЕЛЯ) КАК КонецНедели,
    НЕДЕЛЯ(ВТКалендарь.Дата) КАК НомерНедели,
    ГОД(ВТКалендарь.Дата) КАК Год
ИЗ
    ВТКалендарь КАК ВТКалендарь
СГРУППИРОВАТЬ ПО
    НАЧАЛОПЕРИОДА(ВТКалендарь.Дата, НЕДЕЛЯ),
    КОНЕЦПЕРИОДА(ВТКалендарь.Дата, НЕДЕЛЯ),
    НЕДЕЛЯ(ВТКалендарь.Дата),
    ГОД(ВТКалендарь.Дата)

Имея такой набор полей в СКД, мы можем настроить сортировку по полю НачалоНедели (тип Дата) или по комбинации Год + НомерНедели (тип Число). Это гарантирует правильную последовательность колонок слева направо.

Дополнительные советы

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

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

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

← На главную