Чтоб в СКД по таблице значений был порядок!

28.06.21

Разработка - СКД

Сортировка СКД и источник - таблица значений. Заметка.

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

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

Несмотря на правильное описание полей набора, задание порядка на уровне отчёта в целом не срабатывает. Ни через форму, ни кодом. Рассмотрение тела макета компоновки показывает, что порядок из настроек проигнорирован:

ОсновнаяГруппировка=МакетКомпоновки.Тело.Получить(N); // по умолчанию имеет Идентификатор и Имя "Группировка"
// её поле Порядок, т.е. коллекция выражений упорядочивания, будет пусто

Попытки как-либо программно изменить это ничего не дают:

// допустим, основной набор по источнику называется "ОсновнойНабор" и в нём есть поле "Номенклатура"
ЭлементПорядка=ОсновнаяГруппировка.Порядок.Добавить();
// ЭлементПорядка.Автоупорядочение=Истина; // вызывает ошибку синтаксиса СКД
// а, казалось бы, логичная попытка добавить
ЭлементПорядка.Выражение="ОсновнойНабор.Номенклатура";
// просто игнорируется, не вызывая никакой ошибки.

Таким же образом себя ведут настройки для ТелоИерархии и ИерархическийПорядок, если плоская выборка должна включать развёртку иерархии. Ни типизация, ни настройки роли поля набора на это поведение не влияют.

Детальные записи, как младшая и единственная группировка, внесённая нами по умолчанию, и автовыбранные поля на уровне группировки детальных записей, т.е. 

ГруппировкаКД=НастройкиСКД.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ГруппировкаКД.Использование=Истина;

ВыбПоле=ГруппировкаКД.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
ВыбПоле.Использование=Истина;

не считаются процессором за "настоящую" группировку. Не знаю уж, почему - макет компоновки строится без учёта наличия источника - но факт.

Значит, группировку надо прописать явно:

ВыбПолеГр=ГруппировкаКД.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ВыбПолеГр.Поле=Новый ПолеКомпоновкиДанных("Номенклатура"); // именно просто имя колонки таб.значений
ВыбПолеГр.ТипГруппировки=ТипГруппировкиКомпоновкиДанных.Элементы; // тут уже в зависимости от потребности задачи
ВыбПолеГр.Использование=Истина;

Там же сразу можно задать и порядок, если надо совсем жёстко и независимо от интерфейса:

ЭлементПорядка=ГруппировкаКД.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
// итд.

Если на форме размещён элемент порядка, связанный с компоновщиком, обрабатывающим вывод, то теперь он тоже "найдёт" эту свою группировку в структуре, и корректно отработает. Т.е. явная группировка по всем колонкам таблицы значений эмулирует детальные записи, что, кстати, видно по оформлению финального вывода.

Интересно, что при рассмотрении Тела и вложенных Тел из макета компоновки видно - в их коллекциях "Порядок" есть элементы, но, если вывести структуру на форму, табличка покажет, что у старшей группировки нет элемента порядка (только у отчёта в целом и у финальной).

Ещё более интересно, что, при задании сортировки "Номенклатура ВОЗР", в "Порядок" группировки компоновки данных, как элемента того же Тела, всё-таки добавится запись. Причём ровно как пытались делать программно, т.е.  ЭлементПорядка.Выражение = "ОсновнойНабор.Номенклатура"; но теперь оно сработает. И, у него будет включено автоупорядочивание. Причём на всех уровнях, если структура подразумевает несколько группировок вывода отчёта.

При сортировке по реквизитам картина ещё забавнее. Роль поля в наборе по умолчанию не запрещает сортировку по реквизитам, можем сортировать, например "Номенклатура.ТипТовара ВОЗР". Выражение элемента порядка в Теле будет иметь вид "НоменклатураРеквизиты.Номенклатура.ТипТовара", и без автоупорядочения. Без упоминания набора вообще. При этом дочерний набор  "НоменклатураРеквизиты" в явном виде в макете отсутствует.

А если говорить не о "последней" (или единственной) эмулирующей группировке, а о нескольких группировках вывода, то, кроме всегда добавляемых "<ИмяНабора>.<ИмяКолонки>" автоупорядочиваемых полей старших группировок, на промежуточных уровнях автоматически добавляются в Порядок соответствующего Тела ещё и такие записи:
"НоменклатураРеквизиты.Номенклатура.ТипТовара.ПолеУпорядочивания"
"НоменклатураРеквизиты.Номенклатура.ТипТовара.ПолеУпорядочивания2",
и они тоже всегда с выключенным автоупорядочением. 
Найти логику в составе этих записей мне пока не удалось. Их всегда две. Ни от глубины структуры, ни от свойств роли, ни от типизации не зависят. Возможно, это автодобавленные поля-индексы временной выборки для внутреннего представления и разыменования, или для разных направлений... Кто знает - пишите. Может, где-то в этой специфике скрывается недопустимость деревьев значений как источников СКД...

Если всё это давно известно, а я дремучий дикарь, то тухлые помидоры приветствуются.

Расписывать все нюансы не вижу смысла - на практике остальное либо очевидно, либо крайне редко нужно.

p.s. Интересно, как себя ведёт компоновщик макета в случае временных таблиц, подача которых на вход СКД с недавнего времени стала возможна.
 

Вступайте в нашу телеграмм-группу Инфостарт

СКД упорядочение сортировка таблица значений макет компоновки

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

16500 руб.

02.09.2020    254184    1401    421    

1153

Инструментарий разработчика СКД Программист 1С 8.3 Бесплатно (free)

В этой статье представлен СКДБилдер — общий модуль-обёртка над объектной моделью СКД, который сокращает код в 3-4 раза и делает его читаемым.

29.01.2026    6241    327    shapa_pro    25    

69

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Статья написана по результатам проведенного внутреннего обучающего вебинара для разработчиков ГК «СофтБаланс». Если осилить 25 000 знаков - задача для вас непосильная, где-то на бескрайних просторах интернета видео есть (или будет). Но здесь информация точнее. Разберем, чем запрос для СКД принципиально отличается от обычного запроса и как модифицируется в зависимости от настроек. Изучим «базовый рецепт» написания запроса для СКД, сформируем чек-лист. Полезно будет всем – от стажеров до тех. лидов. Всем, кто не снимает галку «автозаполнение» и пишет запросы для отчетов в консоли запросов – читать (вдумчиво) обязательно.

29.10.2025    18416    ovetgana    112    

110

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Описан способ заполнения списка доступных значений для полей наборов данных и параметров в схеме компоновки данных для любых конфигураций (с использованием БСП или без).

01.07.2025    10703    krasnoshchekovpavel    5    

68

СКД Программист Стажер 1С:Предприятие 8 Россия Бесплатно (free)

Несколько способов управления формами выбора параметров и отборов СКД.

10.04.2025    10231    Neti    0    

41

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Хорошая отчетная форма - сродни искусству. Есть какое-то невероятное эстетическое удовольствие в том, чтобы разобраться в логике учета и анализируемых показателях, спроектировать архитектуру хранения данных так, чтобы оптимально собрать эти показатели вместе с аналитическими разрезами в запросе, а затем настроить отображение так, чтобы, глядя на результат, сразу было понятно, что это за отчет и какие задачи он призван решать. Система компоновки данных - это моя первая, главная и, наверное, единственная "рабочая" любовь. Ее я использую везде, где только можно и где нельзя тоже. Хочу поделиться с вами некоторыми практическими приемами в работе с отчетами на СКД, которые, надеюсь, будут полезны.

27.02.2025    16362    ovetgana    50    

93

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

24.12.2024    14006    Akcium    17    

46

СКД Механизмы типовых конфигураций Запросы Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    10763    AlexeyPROSTO_1C    1    

32
Для отправки сообщения требуется регистрация/авторизация