Почему после обновления 1С перестала работать сортировка в отчете СКД с иерархией и как это исправить?

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

Многие разработчики и администраторы систем на базе 1С:Предприятие сталкиваются с неприятной ситуацией: после планового обновления конфигурации (например, 1С:Управление торговлей 11 или ERP) в привычных отчетах, построенных на Системе компоновки данных (СКД), «ломается» сортировка. Особенно это заметно в иерархических отчетах, где товары или статьи затрат внутри своих групп начинают выводиться в хаотичном порядке, игнорируя настройки по Артикулу или Наименованию. Рассмотрим подробно, почему это происходит и как вернуть отчету правильный вид.

Выясняем причину: «Оптимизация» платформы 8.3.13

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

В этой версии (и всех последующих, включая 8.3.14–8.3.25) разработчики 1С изменили внутренний алгоритм построения иерархических запросов в СКД. Целью была благая задача — оптимизация скорости формирования отчетов. Однако эта оптимизация привела к тому, что в режиме совместимости 8.3.13 и выше СКД отдает приоритет внутреннему идентификатору ссылки или системному порядку при построении дерева. Пользовательские настройки сортировки внутри групп иерархии в некоторых случаях начинают игнорироваться, так как они вступают в конфликт с новым «быстрым» планом запроса платформы.

Если ваша конфигурация после обновления перешла на новый режим совместимости (например, с 8.3.12 на 8.3.14), вы автоматически попадаете в зону действия этой «фичи». Для регулярного обслуживания нескольких баз в таких условиях удобно автоматизировать их архивирование, обновление и тестирование.

Разберем по шагам: почему стандартные методы не помогают?

Посмотрим, какие действия обычно предпринимают в первую очередь и почему они могут не сработать:

  1. Очистка пользовательских настроек. Часто предполагается, что кэш настроек «запомнил» старое состояние. Но если проблема в платформенном механизме, удаление настроек не изменит способ формирования запроса.
  2. Добавление конструкции «УПОРЯДОЧИТЬ ПО» в запрос СКД. Это опасный путь. Проанализируем ситуацию: СКД — это динамический конструктор. Когда мы жестко прописываем УПОРЯДОЧИТЬ ПО в тексте запроса, СКД пытается добавить к этому списку свои поля для обеспечения работы иерархии и группировок. Это часто приводит к ошибкам исполнения запроса или вовсе игнорируется системой компоновки, которая считает, что настройки на вкладке «Настройки» имеют более высокий приоритет.
  3. Включение галок сортировки в настройках группировки. В новых режимах совместимости даже явно включенная сортировка по Артикулу в группировке с типом «Иерархия» может игнорироваться, если платформа решит, что это замедляет построение дерева.

Решение №1: Изменение структуры группировок (Рекомендуемое)

Наиболее стабильный и правильный способ обойти ограничение платформы — это разделить иерархию и элементы на две разные группировки. Рассмотрим, как это сделать в конструкторе СКД:

Вместо одной группировки Номенклатура с типом «Иерархия», создадим следующую структуру:

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

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

Решение №2: Использование выражений упорядочивания в наборе данных

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

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

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

Решение №3: Вычисляемые поля для «принудительной» сортировки

Если строковый артикул сортируется неверно (например, из-за наличия префиксов или разной длины), проанализируем вариант с вычисляемыми полями:

  1. Создадим вычисляемое поле, например, АртикулДляСортировки.
  2. В выражении поля можно написать функцию для нормализации строки или просто продублировать значение.
  3. Добавим это поле в настройки сортировки в самый верх списка.

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

Подведем итоги

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

← На главную