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