Как вывести горизонтальный разделитель страниц в табличном документе 1С?

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

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

Рассмотрим подробно причины возникновения этих ошибок и разберем правильные способы установки и удаления разделителей страниц в 1С.

Выясним причину ошибки «Поле объекта недоступно для записи»

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

Ключевое ограничение платформы заключается в следующем: свойство КонецСтраницы доступно для записи только для областей типа «Строки» или «Колонки». Если попытаться установить это свойство для отдельной ячейки или прямоугольного диапазона (тип Прямоугольник), платформа выбросит исключение.

Посмотрим на ошибочный код:


// Ошибка! Область ячейки имеет тип "Прямоугольник"
ТабДок.Область("R5C2").КонецСтраницы = Истина;

Чтобы разделитель установился корректно, необходимо обращаться к области, охватывающей всю строку целиком.

Способ 1. Установка разделителя страниц для строки табличного документа

Если табличный документ уже выведен на форму и нам необходимо вставить разделитель страниц после строки, в которой находится текущая ячейка, нужно получить номер этой строки и обратиться к области всей строки.

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


&НаКлиенте
Процедура ВставитьГоризонтальныйРазделитель(Команда)
    // Получаем текущую выделенную область из элемента формы
    ТекущаяОбласть = Элементы.ТабДокПроектДокумента.ТекущаяОбласть;
    Если ТекущаяОбласть <> Неопределено Тогда
        // Передаем номер нижней строки выделенной области на сервер
        ВставитьРазделительНаСервере(ТекущаяОбласть.Низ);
    КонецЕсли;
КонецПроцедуры

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

Обратите внимание: обращение ТабДок.Область(НомерСтроки, , НомерСтроки, ) выбирает именно область строки, для которой свойство КонецСтраницы доступно для записи.

Способ 2. Использование формата R1C1 и именованных областей

Альтернативный способ обращения к области строки — использование формата нотации R1C1 или именованных областей строк.

Рассмотрим пример обращения через имя строки в формате R<номер_строки>:


&НаСервере
Процедура ВставитьРазделительПоИмениСтроки(НомерСтроки)
    // Формируем имя строки без группировки разрядов
    ИмяСтроки = "R" + Формат(НомерСтроки, "ЧГ=0");
    
    // Присваиваем свойство КонецСтраницы для всей строки
    ТабДокПроектДокумента.Область(ИмяСтроки).КонецСтраницы = Истина;
КонецПроцедуры

Если в табличном документе заранее созданы именованные области строк (например, при формировании отчета или печатной формы), можно обращаться непосредственно к ним по имени:


// Сброс или установка разделителя для именованной области
ТабличныйДокумент.Область("ИмяСтроковойОбласти").КонецСтраницы = Ложь;

Способ 3. Использование метода ВывестиГоризонтальныйРазделительСтраниц()

Метод ВывестиГоризонтальныйРазделительСтраниц() предназначен для использования в момент последовательного формирования (заполнения) табличного документа из макета. На уже сформированном документе этот метод выведет разделитель в самый конец таблицы, а не в произвольное место.

Посмотрим, как правильно применять этот метод при программном выводе областей макета:


ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");

ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

// Выводим шапку
ТабДок.Вывести(ОбластьШапка);

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

Как удалить разделитель страниц

Чтобы убрать ранее установленный разделитель страниц с конкретной строки, достаточно присвоить свойству КонецСтраницы значение Ложь:


// Удаление разделителя со строки
ТабДокПроектДокумента.Область(НомерСтроки, , НомерСтроки, ).КонецСтраницы = Ложь;

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

  1. Для установки разделителя страниц на сформированном документе используйте свойство КонецСтраницы = Истина.
  2. Свойство КонецСтраницы доступно для записи только у областей строк или колонок. Убедитесь, что получаете область через ТабДок.Область(НомерСтроки, , НомерСтроки, ) или по имени строки "R1".
  3. Метод ВывестиГоризонтальныйРазделительСтраниц() применяйте исключительно при последовательном формировании табличного документа с помощью метода Вывести().
← На главную