При разработке сложных отчетов в системе компоновки данных (СКД) программисты часто сталкиваются с неприятной особенностью: 1С самостоятельно меняет порядок колонок в подчиненных группировках. Это происходит в тех случаях, когда состав выбранных полей в родительской и дочерней группировках различается. Например, если в "голове" отчета мы выводим только общие итоги по одному полю, а в детальных записях хотим видеть полный набор реквизитов, СКД может принудительно переместить "уникальные" для нижнего уровня поля в начало таблицы, игнорируя настройки порядка.
В этой статье мы подробно разберем, почему это происходит, и рассмотрим все доступные способы решения данной проблемы — от простых настроек в пользовательском режиме до программной обработки результата, используя универсальные инструменты для работы с запросами и СКД.
Прежде чем переходить к решениям, проанализируем ситуацию. В СКД заложен внутренний алгоритм оптимизации отрисовки табличного документа. Когда система видит, что в родительской группировке поле скрыто (отключено в выбранных полях), а в дочерней оно должно выводиться, она пытается перестроить структуру ячеек так, чтобы минимизировать количество объединений и разрывов. Система стремится выстроить колонки по принципу «от общих к частным».
Для СКД поля, которые есть только в дочерней записи, являются «специфичными», и она часто выносит их в крайние позиции (обычно в самое начало), чтобы не «разрывать» общие поля родителя. Это поведение часто конфликтует с требованиями бизнес-заказчиков, которым нужен строго определенный порядок следования данных.
Одним из самых эффективных и быстрых способов зафиксировать последовательность является объединение полей в специальные группы, что особенно актуально, если вы используете инструменты расширенной настройки СКД на стороне клиента. Давайте разберем по шагам, как это сделать:
Горизонтально.Почему это работает: Когда поля объединены в группу, СКД воспринимает эту группу как единый неделимый блок. Системе становится значительно сложнее произвольно перемещать поля внутри этого блока, так как она обязана соблюдать целостность группы при отрисовке ТабличныйДокумент.
Иногда проблема кроется в том, как система обрабатывает реквизиты объектов. Рассмотрим настройку, которая часто игнорируется разработчиками:
В настройках конкретной группировки перейдем на вкладку Другие настройки. Там найдем параметр Расположение реквизитов. По умолчанию он установлен в значение Авто. Попробуем изменить его на Отдельно. Чтобы лучше понимать структуру, полезно изучить дерево метаданных конфигурации и свойства объектов.
В режиме Отдельно система перестает пытаться сгруппировать реквизиты (например, «Артикул» или «Код» номенклатуры) вместе с основным полем группировки. Это заставляет СКД выделять под каждый реквизит свою колонку в строгом соответствии с порядком, заданным в списке выбранных полей, не пытаясь оптимизировать их положение.
Если 1С «подтягивает» поле подчиненной группировки вперед из-за того, что оно отсутствует в родительской, мы можем «обмануть» систему. В крайне редких случаях для разделения логики применяют две разных схемы в одном отчете. Выясним причину: СКД считает поле уникальным для нижнего уровня. Значит, нам нужно сделать его «не уникальным».
Разберем алгоритм действий:
NULL или пустую строку "".Теперь для механизма компоновки данное поле присутствует на обоих уровнях иерархии. СКД больше не видит смысла перемещать его в начало, так как структура колонок становится идентичной для всех уровней. Чтобы пустая колонка в родителе не портила вид, можно воспользоваться Условным оформлением, установив минимальную ширину колонки или скрыв текст, если это необходимо.
Когда стандартные настройки бессильны, на помощь приходит профессиональный инструмент — создание собственного макета. Этот способ гарантирует 100% результат, так как вы берете управление отрисовкой на себя.
Проанализируем процесс создания макета:
Заголовок или Тело).При использовании макета СКД обязана вывести данные строго в те ячейки, которые вы определили в шаблоне. Алгоритмы «оптимизации» порядка колонок в этом случае полностью игнорируются.
Типичная ошибка, приводящая к хаосу в колонках — использование элемента Авто в выбранных полях. Рассмотрим ситуацию: в родительской группировке вы вручную определили поля, а в дочерней оставили Авто. СКД начнет подтягивать поля из общих настроек отчета, что почти всегда приводит к непредсказуемому порядку.
Рекомендация: Для строгого контроля структуры отчета рекомендуется полностью удалять элемент Авто из всех группировок. Перечисляйте все необходимые поля вручную в каждой группировке, соблюдая идентичную последовательность. Если поле не должно отображать данные в родителе — лучше использовать метод с NULL, чем просто удалять его из списка.
Если отчет уже сложный, а времени на переделку макетов нет, можно прибегнуть к программному изменению сформированного документа. Рассмотрим пример логики, которую можно применить в модуле отчета:
После того как метод СкомпоноватьРезультат() отработал, мы получаем ТабличныйДокумент. Мы можем программно найти нужные области и переставить колонки местами. Хотя этот метод считается «костыльным», в экстренных ситуациях он работает безотказно.
// Пример логики в модуле объекта отчета
Процедура ПриКомпоновкеРезультата(РезультатИтерации, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Настраиваем компоновщик и выводим в промежуточный табличный документ
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(РезультатИтерации);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Здесь можно выполнить постобработку РезультатИтерации
// Например, УдалитьОбласть() или ВставитьОбласть() для перемещения колонок
КонецПроцедуры
Мы рассмотрели различные подходы к решению проблемы порядка колонок в СКД. Подведем краткий итог:
Отдельно.Автополей в пользу явного указания состава колонок.Выбор метода зависит от сложности вашего отчета и того, насколько часто он будет подвергаться изменениям в будущем. Использование штатных настроек (группы и вычисляемые поля) предпочтительнее, так как их легче поддерживать, чем программный код или жесткие макеты.