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