Почему не работает фиксация колонок в табличном документе отчета 1С и как настроить ее программно?

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

При разработке отчетов разработчики нередко сталкиваются с ситуацией: в макете через меню конфигуратора (пункт Таблица — Зафиксировать) настроена фиксация шапки или левых колонок, при просмотре макета горизонтальная и вертикальная прокрутка работают корректно, однако после формирования отчета в режиме «1С:Предприятие» зафиксированные области исчезают или прокручиваются вместе с остальными данными. Разберем детально, почему интерактивная настройка макета не переносится в сформированный документ и как правильно управлять фиксацией строк и колонок через программный код.

Причина поведения платформы: различие между макетом и результирующим документом

Проанализируем механику работы табличного документа. Макет отчета — это всего лишь шаблон областей данных. Когда в коде вызывается метод ПолучитьОбласть(), а затем результат выводится в результирующую таблицу с помощью Вывести() или Присоединить(), платформа переносит в отчет исключительно содержимое и визуальное оформление ячеек (шрифты, границы, фон, параметры). Глобальные свойства самого документа при этом не копируются.

К таким свойствам относятся:

  1. Параметры фиксации областей (ФиксацияСлева, ФиксацияСверху).
  2. Отображение сетки и заголовков строк/колонок.
  3. Режим защиты ячеек и запрет редактирования (ТолькоПросмотр).
  4. Параметры печати и масштабирования.

Поскольку результирующий отчет формируется в отдельном объекте ТабличныйДокумент (например, в элементе формы ЭлементыФормы.ПолеОтчета), любые настройки фиксации требуется передавать именно этому объекту, а не исходному макету или отдельным выводимым областям.

Типичные ошибки при программной настройке фиксации

Рассмотрим частые ошибки, которые возникают при попытке задать фиксацию колонок в коде модуля формы:

  1. Попытка вызова свойства как метода: разработчики нередко пишут ЭлементыФормы.ПолеОтчета.ФиксацияСлева(8); или ОбластьШапка.ФиксацияСлева(8);. Платформа 1С в таком случае возвращает ошибку «Метод объекта не обнаружен (ФиксацияСлева)». Свойство ФиксацияСлева имеет тип Число и предназначено для чтения и записи через оператор присваивания (=).
  2. Обращение к области вместо табличного документа: метод ФиксацияСлева отсутствует у объекта ОбластьЯчеекТабличногоДокумента. Зафиксировать колонки «только внутри шапки» невозможно: фиксация всегда применяется ко всей видимой области табличного документа сверху донизу.
  3. Сброс фиксации очисткой документа: вызов метода Очистить() или повторная инициализация свойств поля с установкой ФиксацияСверху = 0; перед выводом строк могут обнулять ранее заданные границы прокрутки.

Пошаговое решение: программное задание границ фиксации

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


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

Разберем, как работает этот фрагмент:

  1. Мы обращаемся непосредственно к результирующему элементу ЭлементыФормы.ПолеОтчета.
  2. Используем конструкцию присваивания значения числу колонок: ТабДок.ФиксацияСлева = 8;. Это фиксирует первые восемь колонок документа, оставляя их видимыми при горизонтальной прокрутке отчета вправо.
  3. Фиксация строк шапки устанавливается через свойство ФиксацияСверху, значение которого равно количеству зафиксированных строк (высоте области шапки).

Важные нюансы и ограничения платформы

Рассмотрим специфические ситуации, с которыми можно столкнуться при использовании фиксации колонок:

  1. Объединенные ячейки на границе фиксации: следите за тем, чтобы линия фиксации не проходила сквозь объединенную область колонок. Если, к примеру, ячейки с 7 по 9 объединены в общую колонку, а в свойстве ФиксацияСлева указано число 8, платформа не сможет корректно разделить ячейку. Это приведет к визуальным артефактам или к принудительному сдвигу границы фиксации до внешнего края объединенной группы ячеек.
  2. Ширина зафиксированной части: если суммарная ширина зафиксированных колонок превышает видимую ширину элемента управления на экране монитора пользователя, незафиксированные данные полностью скроются за границей экрана, а горизонтальная полоса прокрутки перестанет выполнять свою функцию.
  3. Разница между просмотром на экране и печатью: свойства ФиксацияСлева и ФиксацияСверху управляют отображением только внутри экранной формы. Они не дублируют колонки или строки при выводе документа на физический принтер. Чтобы шапка и боковик таблицы автоматически повторялись на каждом бумажном листе, необходимо использовать специальные свойства печати: ПовторятьПриПечатиСтроки и ПовторятьПриПечатиКолонки, передавая в них соответствующую область ячеек.
← На главную