Как правильно удалить или скрыть вложенную область в табличном документе 1С 8

Программист IT и автоматизация бизнеса
← На главную

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

Особенности и синтаксис метода УдалитьОбласть()

Платформа 1С предоставляет штатный метод для удаления областей из табличного документа — УдалитьОбласть(). Синтаксис метода выглядит следующим образом:

ТабличныйДокумент.УдалитьОбласть(ИсходнаяОбласть, Сдвиг);

Параметры метода:

  1. ИсходнаяОбласть — область ячеек (тип ОбластьЯчеекТабличногоДокумента), которую требуется удалить.
  2. Сдвиг — параметр типа ТипСмещенияТабличногоДокумента, определяющий, как будут смещаться соседние ячейки (например, ПоВертикали, ПоГоризонтали или БезСмещения). По умолчанию используется значение БезСмещения.

Однако при попытке вырезать произвольный внутренний блок из таблицы вызов УдалитьОбласть() часто приводит к ошибкам или искажению структуры печатной формы. Выясним причину такого поведения:

  1. Разрушение геометрии таблицы: Метод УдалитьОбласть() предназначался для удаления целых строк или колонок по всей ширине/высоте документа. При удалении прямоугольного фрагмента из середины таблицы со смещением сдвигаются только ячейки в пределах этого прямоугольника, что приводит к сдвигу колонок и визуальному перекосу сетки.
  2. Проблемы с объединенными ячейками: Если в удаляемой или смещаемой области присутствуют объединенные ячейки, платформа выдаст ошибку. Перед смещением их требуется предварительно разъединять вызовом метода Разъединить().
  3. Режим БезСмещения: Если передать параметр ТипСмещенияТабличногоДокумента.БезСмещения, физического удаления ячеек из таблицы не происходит — сетка сохраняется, а визуально ячейки остаются на месте.

Альтернативный подход 1: Динамическая сборка печатной формы (Рекомендуемый)

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

  1. В макете табличного документа разбиваем структуру на отдельные самостоятельные области (например, Шапка, ОсновнойБлок, ДополнительныйБлок, Подвал).
  2. В программном коде проверяем необходимые условия бизнеса.
  3. Последовательно выводим в итоговый ТабличныйДокумент только те секции, которые должны отображаться пользователю.

Посмотрим на пример реализации кода:


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

ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапка);

ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаТаблицы");
// Заполнение параметров области
ТабДок.Вывести(ОбластьСтрока);

Если ВыводитьДопИнформацию Тогда
    ОбластьДоп = Макет.ПолучитьОбласть("ДополнительныйБлок");
    ТабДок.Вывести(ОбластьДоп);
КонецЕсли;

ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ТабДок.Вывести(ОбластьПодвал);

Этот способ полностью исключает необходимость удаления ячеек и гарантирует сохранение точной разметки печатной формы.

Альтернативный подход 2: Очистка содержимого и скрытие строк

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

  1. Очистка значений ячеек: Если геометрию таблицы менять нельзя, но нужно удалить текст, рамки или форматирование внутри области, используется метод Очистить():
    
    ОбластьОчистки = ТабДок.Область("R5C2:R10C5");
    ОбластьОчистки.Очистить(Истина, Истина, Истина);
    
    Параметры метода определяют необходимость очистки текста, форматирования и рамок соответственно.
  2. Управление видимостью и высотой строк: Если вложенный блок занимает целые строки табличного документа, их можно скрыть, установив нулевую высоту строк или отключив их видимость:
    
    ОбластьСтрок = ТабДок.Область("R5:R10");
    ОбластьСтрок.ВысотаСтроки = 0;
    

Таким образом, для корректной работы с табличными документами в 1С рекомендуется отдавать предпочтение поэтапному выводу секций с помощью метода Вывести(), избегая прямого вырезания внутренних ячеек из готового документа.

← На главную