Как установить порядок вывода колонок в отчете СКД в разных группировках

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

При разработке сложных отчетов в системе компоновки данных (СКД) программисты часто сталкиваются с неприятной особенностью: 1С самостоятельно меняет порядок колонок в подчиненных группировках. Это происходит в тех случаях, когда состав выбранных полей в родительской и дочерней группировках различается. Например, если в "голове" отчета мы выводим только общие итоги по одному полю, а в детальных записях хотим видеть полный набор реквизитов, СКД может принудительно переместить "уникальные" для нижнего уровня поля в начало таблицы, игнорируя настройки порядка.

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

Почему СКД меняет порядок колонок?

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

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

Способ 1: Использование Групп выбранных полей

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

  1. Перейдем на закладку Настройки в схеме компоновки данных.
  2. Выберем нужную группировку и откроем вкладку Выбранные поля.
  3. Нажмем правую кнопку мыши и выберем пункт Новая группа выбранных полей.
  4. В настройках группы укажем вариант расположения: Горизонтально.
  5. Переместим внутрь этой группы все поля, порядок которых нам важен.

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

Способ 2: Управление расположением реквизитов

Иногда проблема кроется в том, как система обрабатывает реквизиты объектов. Рассмотрим настройку, которая часто игнорируется разработчиками:

В настройках конкретной группировки перейдем на вкладку Другие настройки. Там найдем параметр Расположение реквизитов. По умолчанию он установлен в значение Авто. Попробуем изменить его на Отдельно. Чтобы лучше понимать структуру, полезно изучить дерево метаданных конфигурации и свойства объектов.

В режиме Отдельно система перестает пытаться сгруппировать реквизиты (например, «Артикул» или «Код» номенклатуры) вместе с основным полем группировки. Это заставляет СКД выделять под каждый реквизит свою колонку в строгом соответствии с порядком, заданным в списке выбранных полей, не пытаясь оптимизировать их положение.

Способ 3: Использование пустых вычисляемых полей

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

Разберем алгоритм действий:

  1. На закладке Вычисляемые поля создадим новое поле с тем же заголовком, что и проблемное поле, но в выражении укажем NULL или пустую строку "".
  2. Добавим это пустое вычисляемое поле в Выбранные поля родительской группировки.
  3. В подчиненной группировке оставим реальное поле с данными.

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

Способ 4: Принудительная установка порядка через макеты оформления

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

Проанализируем процесс создания макета:

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

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

Способ 5: Проверка автополей и ручное управление

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

Рекомендация: Для строгого контроля структуры отчета рекомендуется полностью удалять элемент Авто из всех группировок. Перечисляйте все необходимые поля вручную в каждой группировке, соблюдая идентичную последовательность. Если поле не должно отображать данные в родителе — лучше использовать метод с NULL, чем просто удалять его из списка.

Способ 6: Программная постобработка (Метод из практики)

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

После того как метод СкомпоноватьРезультат() отработал, мы получаем ТабличныйДокумент. Мы можем программно найти нужные области и переставить колонки местами. Хотя этот метод считается «костыльным», в экстренных ситуациях он работает безотказно.


// Пример логики в модуле объекта отчета
Процедура ПриКомпоновкеРезультата(РезультатИтерации, ДанныеРасшифровки, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    // Настраиваем компоновщик и выводим в промежуточный табличный документ
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(РезультатИтерации);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
    // Здесь можно выполнить постобработку РезультатИтерации
    // Например, УдалитьОбласть() или ВставитьОбласть() для перемещения колонок
КонецПроцедуры

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

Мы рассмотрели различные подходы к решению проблемы порядка колонок в СКД. Подведем краткий итог:

Выбор метода зависит от сложности вашего отчета и того, насколько часто он будет подвергаться изменениям в будущем. Использование штатных настроек (группы и вычисляемые поля) предпочтительнее, так как их легче поддерживать, чем программный код или жесткие макеты.

← На главную