Разработка и Конфигурация · 11 мин
Как удалить область из табличного документа в 1С
Как удалить область из табличного документа 1С: метод УдалитьОбласть, типы сдвига, работа с именованными областями, примеры кода и типичные ошибки разработчиков.
Удаление области из табличного документа — типовая задача при программной работе с печатными формами и отчётами в 1С. Например, нужно убрать строку с пустыми данными, скрыть шапку при повторном выводе или вырезать секцию макета, которая не нужна в конкретном сценарии. Для этого встроенный язык предоставляет метод УдалитьОбласть() объекта ТабличныйДокумент.
Метод работает не только с именованными областями макета, но и с произвольными диапазонами ячеек, заданными адресами вида «R5C2:R10C4». При этом важно понимать, как именно сдвигаются оставшиеся ячейки после удаления: неправильно выбранный тип сдвига способен «разорвать» печатную форму и сместить данные не туда.
Ниже разобран синтаксис метода, варианты типов сдвига, работа с именованными областями, проверка результата и ошибки, которые чаще всего допускают разработчики при удалении областей.
Метод УдалитьОбласть: синтаксис и параметры
Метод вызывается у объекта типа ТабличныйДокумент и имеет два параметра:
ТабДок.УдалитьОбласть(Область, ТипСмещения);
Первый параметр — Область. Здесь можно передать саму область табличного документа (объект ОбластьЯчеекТабличногоДокумента), её имя в виде строки или адрес диапазона в формате «R1C1» (например, "R3C1:R7C5"). Если указанная область не найдена, платформа вызовет исключение, поэтому перед удалением полезно проверять её существование.
Второй параметр — ТипСмещения, значение системного перечисления ТипСмещенияТабличногоДокумента. Он определяет, что произойдёт с ячейками, расположенными рядом с удаляемой областью. Если параметр не указан, по умолчанию используется смещение по вертикали.
Типы смещения: как сдвинутся оставшиеся ячейки
Выбор типа смещения — ключевой момент, от которого зависит целостность документа. Доступны три варианта:
ПоВертикали— ячейки, расположенные ниже удаляемой области, сдвигаются вверх на её высоту. Подходит для удаления целых строк или горизонтальных секций печатной формы.ПоГоризонтали— ячейки справа от области сдвигаются влево на её ширину. Используется при удалении колонок или вертикальных секций.БезСмещения— ячейки области очищаются, но окружающие ячейки остаются на своих местах. Фактически это очистка содержимого и форматирования без изменения структуры.
Если область занимает всю ширину документа (например, полная строка секции), смещение по вертикали работает предсказуемо: весь нижний контент поднимается вверх. Но если удаляется «островок» ячеек в середине таблицы, сдвиг затронет только ячейки в пределах горизонтальных границ области — соседние колонки не изменятся, и таблица может визуально «разъехаться».
Поэтому перед удалением важно ответить на вопрос: область является целой строкой/колонкой документа или частью более широкой структуры? В первом случае смело применяйте смещение, во втором — чаще безопаснее вариант БезСмещения с последующей ручной корректировкой.
Сравнение вариантов
Удаление целых строк и горизонтальных секций. Ограничение: при частичной области сдвинет только ячейки в её границах.
Удаление колонок и вертикальных секций. Ограничение: те же риски при частичных областях.
Очистка содержимого без изменения структуры. Ограничение: пустое место остаётся в документе.
Удаление именованной области из макета
На практике чаще всего удаляют области, выведенные из макета. Типовой сценарий: секция выведена методом Вывести() или Присоединить(), а затем по условию её нужно убрать. Проблема в том, что после вывода имя области в результирующем документе может не сохраниться или совпасть с именами других выведенных экземпляров той же секции.
Надёжный подход — получить ссылку на область сразу после вывода и хранить её до момента удаления:
НачалоСтроки = ТабДок.ВысотаТаблицы + 1;
ТабДок.Вывести(Макет.ПолучитьОбласть("СтрокаТовара"));
ОбластьСтроки = ТабДок.Область(НачалоСтроки, 1, ТабДок.ВысотаТаблицы, ТабДок.ШиринаТаблицы);
// Позже, при необходимости:
ТабДок.УдалитьОбласть(ОбластьСтроки, ТипСмещенияТабличногоДокумента.ПоВертикали);
Если область была создана программно с присвоением имени (Область.Имя = "МояОбласть"), её можно удалить по имени: ТабДок.УдалитьОбласть("МояОбласть"). Учтите, что имена в табличном документе должны быть уникальными — при попытке присвоить занятое имя возникнет ошибка.
- 1Зафиксируйте границы области: запомните ВысотаТаблицы до вывода секции
- 2Выведите или получите область табличного документа
- 3Проверьте, что область существует и её границы корректны
- 4Вызовите УдалитьОбласть с подходящим типом смещения
- 5Проверьте результат: высоту таблицы и содержимое соседних строк
Удаление диапазона по адресу R1C1
Когда имя области неизвестно или не задано, удаляют по координатам. Адрес задаётся строкой в стиле ссылок R1C1: "R5C1:R5C10" — пятая строка с первой по десятую колонку. Этот способ удобен при построчной обработке документа в цикле.
Для НомерСтроки = 2 По ТабДок.ВысотаТаблицы Цикл
ЗначениеЯчейки = ТабДок.Область(НомерСтроки, 1).Текст;
Если ПустаяСтрока(ЗначениеЯчейки) Тогда
ТабДок.УдалитьОбласть("R" + НомерСтроки + "C1:R" + НомерСтроки + "C" + ТабДок.ШиринаТаблицы,
ТипСмещенияТабличногоДокумента.ПоВертикали);
НомерСтроки = НомерСтроки - 1; // компенсируем сдвиг
КонецЕсли;
КонецЦикла;
Обратите внимание на строку с уменьшением счётчика: после удаления со смещением по вертикали все нижние строки поднимаются на одну позицию, и без корректировки индекса цикл пропустит следующую строку. Это одна из самых частых ошибок при построчном удалении. Альтернатива — идти по строкам снизу вверх, тогда сдвиг не влияет на ещё не обработанные строки.
Проверка результата и контроль целостности
После удаления полезно убедиться, что документ остался корректным. Основные контрольные точки: высота и ширина таблицы (ВысотаТаблицы, ШиринаТаблицы) изменились на ожидаемую величину; содержимое строк, соседних с удалённой, соответствует ожиданиям; объединённые ячейки не «разорваны».
Если удаление выполняется внутри сложной логики формирования печатной формы, имеет смысл работать с копией документа или строить форму заново при ошибке. Табличный документ не имеет встроенного механизма отмены операции — восстановить удалённую область можно только повторным выводом из макета.
Как проверить результат
Уменьшилась ровно на высоту удалённой области
Не изменилась или изменилась непредсказуемо
Содержит данные, которые раньше были ниже
Пустая строка или чужие данные
Объединения сохранились и отображаются корректно
Ячейки разъединены или перекрывают соседние данные
Типичные ошибки и ограничения
Первая группа ошибок связана с обращением к несуществующей области: удаление по имени, которое не было присвоено, или по адресу за границами документа вызывает исключение. Перед удалением по имени проверяйте наличие области через поиск или обрабатывайте исключение конструкцией Попытка...Исключение.
Вторая группа — некорректный тип смещения. При смещении по вертикали для области, которая не занимает всю ширину таблицы, колонки вне границ области останутся на месте, и строки станут «ступенчатыми». Третья типичная проблема — попытка удалить область, пересекающуюся с объединёнными ячейками: результат может отличаться от ожидаемого, поэтому такие операции стоит тестировать на реальных макетах.
Также помните об ограничении: метод УдалитьОбласть недоступен на тонком клиенте в некоторых контекстах серверной логики старых версий и не применяется к табличным документам, открытым только для чтения в режиме просмотра, — модификация возможна только программно в доступном для изменения объекте.
Альтернативы удалению: очистка и условный вывод
Не всегда область нужно именно удалять. Если требуется только убрать содержимое, но сохранить структуру и оформление, используйте метод Очистить() у области или удаление с типом БезСмещения. Это безопаснее для форм со сложной сеткой.
Часто лучшая стратегия — не удалять лишнее, а не выводить его вовсе. Условный вывод секций макета (Если НужнаСекция Тогда ТабДок.Вывести(...) КонецЕсли) делает код проще и исключает операции удаления со всеми их рисками. Удаление оправдано, когда решение принимается после вывода — например, при постобработке сформированного документа.
Как выбрать действие
Что важно запомнить
Область удаляется методом УдалитьОбласть с указанием области и типа смещения. Выбирайте смещение по структуре области, проверяйте её существование и корректируйте индексы при удалении в цикле. Где возможно, заменяйте удаление условным выводом секций.
Частые вопросы
Как удалить строку табличного документа по её номеру?
Передайте адрес диапазона всей строки: ТабДок.УдалитьОбласть("R5C1:R5C" + ТабДок.ШиринаТаблицы, ТипСмещенияТабличногоДокумента.ПоВертикали). Нижние строки поднимутся вверх.
Чем УдалитьОбласть отличается от метода Очистить?
УдалитьОбласть убирает ячейки из структуры документа (со смещением соседних или без), а Очистить у области только стирает содержимое и, при соответствующем параметре, оформление, оставляя сетку ячеек на месте.
Почему возникает ошибка «Область не найдена» при удалении по имени?
Имя существует в макете, но не переносится автоматически в результирующий табличный документ при выводе, либо область с таким именем уже удалена. Получайте ссылку на область сразу после вывода или присваивайте имя программно.
Как удалить несколько строк в цикле, не пропуская строки?
Обходите строки снизу вверх (от ВысотаТаблицы к первой) — тогда сдвиг после удаления не влияет на ещё не проверенные строки. При обходе сверху вниз уменьшайте счётчик на единицу после каждого удаления.
Можно ли отменить удаление области?
Встроенной отмены нет. Восстановить область можно только повторным выводом из макета, поэтому при сложной логике работайте с копией табличного документа или перестраивайте форму заново.
Работает ли УдалитьОбласть с объединёнными ячейками?
Метод работает, но при пересечении границ области с объединёнными ячейками результат может отличаться от ожидаемого. Проверяйте такие случаи на реальном макете и при необходимости используйте тип БезСмещения.