Многие разработчики и администраторы систем на базе 1С:Предприятие сталкиваются с неприятной ситуацией: после планового обновления конфигурации (например, 1С:Управление торговлей 11 или ERP) в привычных отчетах, построенных на Системе компоновки данных (СКД), «ломается» сортировка. Особенно это заметно в иерархических отчетах, где товары или статьи затрат внутри своих групп начинают выводиться в хаотичном порядке, игнорируя настройки по Артикулу или Наименованию. Рассмотрим подробно, почему это происходит и как вернуть отчету правильный вид.
Проанализируем техническую сторону вопроса. Как показывает практика и расследования на технических форумах, корень проблемы кроется не в ошибке кода конкретного отчета, а в изменении логики работы самой платформы 1С, начиная с версии 8.3.13. Для массовой проверки отчетов и поиска подобных ошибок в разных базах можно настроить программного робота для автоматизации действий пользователя.
В этой версии (и всех последующих, включая 8.3.14–8.3.25) разработчики 1С изменили внутренний алгоритм построения иерархических запросов в СКД. Целью была благая задача — оптимизация скорости формирования отчетов. Однако эта оптимизация привела к тому, что в режиме совместимости 8.3.13 и выше СКД отдает приоритет внутреннему идентификатору ссылки или системному порядку при построении дерева. Пользовательские настройки сортировки внутри групп иерархии в некоторых случаях начинают игнорироваться, так как они вступают в конфликт с новым «быстрым» планом запроса платформы.
Если ваша конфигурация после обновления перешла на новый режим совместимости (например, с 8.3.12 на 8.3.14), вы автоматически попадаете в зону действия этой «фичи». Для регулярного обслуживания нескольких баз в таких условиях удобно автоматизировать их архивирование, обновление и тестирование.
Посмотрим, какие действия обычно предпринимают в первую очередь и почему они могут не сработать:
УПОРЯДОЧИТЬ ПО в тексте запроса, СКД пытается добавить к этому списку свои поля для обеспечения работы иерархии и группировок. Это часто приводит к ошибкам исполнения запроса или вовсе игнорируется системой компоновки, которая считает, что настройки на вкладке «Настройки» имеют более высокий приоритет.Артикулу в группировке с типом «Иерархия» может игнорироваться, если платформа решит, что это замедляет построение дерева.Наиболее стабильный и правильный способ обойти ограничение платформы — это разделить иерархию и элементы на две разные группировки. Рассмотрим, как это сделать в конструкторе СКД:
Вместо одной группировки Номенклатура с типом «Иерархия», создадим следующую структуру:
Номенклатура.Номенклатура.Артикул).При такой структуре СКД сначала строит дерево папок, а затем для каждого узла выводит вложенные элементы, применяя к ним правила сортировки отдельно от логики построения дерева. Это гарантирует, что внутри каждой папки ваши товары будут стоять строго по артикулу.
Посмотрим на ситуацию под другим углом. Если мы не хотим менять структуру отчета, можно попробовать «подсказать» СКД, как именно нужно упорядочивать поле на уровне метаданных самого отчета.
Номенклатура.Артикул или Наименование.Этот метод заставляет СКД использовать указанное поле в качестве основного критерия сортировки при формировании временных таблиц иерархии еще до того, как в дело вступят настройки варианта отчета.
Если строковый артикул сортируется неверно (например, из-за наличия префиксов или разной длины), проанализируем вариант с вычисляемыми полями:
АртикулДляСортировки.Иногда простое добавление дублирующего поля в сортировку заставляет оптимизатор запросов СКД пересмотреть план выполнения и корректно применить порядок элементов.
Столкнувшись с проблемой сортировки после обновления на платформу 8.3.13+, не спешите переписывать весь запрос. Выясним причину: скорее всего, это «оптимизация» иерархических связей. Самым надежным решением является переход от группировки «Иерархия» к связке «Только иерархия» + «Детальные записи». Это требует минимальных правок в настройках отчета и гарантирует корректный результат на любых современных релизах платформы 1С:Предприятие.