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