К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как удалить область в табличном документе 1С

Как удалить область в табличном документе 1С: метод УдалитьОбласть, типы смещения, работа со строками и колонками, примеры кода и типичные ошибки разработчиков.

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

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

Ниже разобраны синтаксис метода, варианты смещения, практические сценарии удаления строк и колонок, а также ошибки, которые чаще всего допускают разработчики при работе с областями.

Что представляет собой область табличного документа

Область — это прямоугольный диапазон ячеек табличного документа. Область можно получить двумя способами: по имени, заданному в макете (ТабДок.Область("Шапка")), или по координатам — номерам строк и колонок (ТабДок.Область("R5:R10") или ТабДок.Область(5, 1, 10, 5)).

Именованные области обычно создаются в макете табличного документа в конфигураторе: разработчик выделяет строки или ячейки и присваивает им имя. Адресные области формируются динамически, когда структура документа заранее неизвестна — например, при построчном выводе данных из запроса.

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

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

Метод вызывается у объекта типа ТабличныйДокумент и имеет два параметра:

ТабДок.УдалитьОбласть(Область, ТипСмещения);

Первый параметр — Область — принимает объект области табличного документа, полученный методом Область(). Второй параметр — ТипСмещения — определяет, как сдвинутся оставшиеся ячейки. Используются значения системного перечисления ТипСмещенияТабличногоДокумента:

  • ПоВертикали — ячейки ниже удаляемой области сдвигаются вверх; применяется при удалении строк;
  • ПоГоризонтали — ячейки справа сдвигаются влево; применяется при удалении колонок;
  • БезСмещения — содержимое ячеек очищается, но соседние ячейки не сдвигаются; фактически область просто очищается.

Если второй параметр не указан, по умолчанию используется смещение по вертикали. Тем не менее рекомендуется всегда указывать тип смещения явно — это делает код читаемым и защищает от ошибок при доработке.

// Удаление строк 10–15 со сдвигом вверх

ОбластьСтрок = ТабДок.Область(10, , 15, );

ТабДок.УдалитьОбласть(ОбластьСтрок, ТипСмещенияТабличногоДокумента.ПоВертикали);

// Удаление именованной области из макета

ОбластьШапка = ТабДок.Область("СлужебнаяШапка");

ТабДок.УдалитьОбласть(ОбластьШапка, ТипСмещенияТабличногоДокумента.ПоВертикали);

Как удалить строки табличного документа

Удаление строк — самый частый сценарий. Типичный пример: в макете есть служебная строка-разделитель или блок, который нужен только при определённом условии. Если условие не выполняется, блок удаляют после вывода.

Чтобы удалить целые строки, получите область с указанием только номеров строк, без колонок: ТабДок.Область(НомерПервойСтроки, , НомерПоследнейСтроки, ). Пустые второй и четвёртый параметры означают «все колонки». После удаления со смещением по вертикали все строки ниже поднимутся, а общая высота документа уменьшится.

// Удаляем строку-разделитель, если нет данных для раздела

Если Не ЕстьДанныеРаздела Тогда

ОбластьРазделитель = ТабДок.Область("РазделительРаздела");

ТабДок.УдалитьОбласть(ОбластьРазделитель,

ТипСмещенияТабличногоДокумента.ПоВертикали);

КонецЕсли;

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

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

Как удалить колонки табличного документа

Удаление колонок требуется реже — например, когда широкая печатная форма должна адаптироваться под набор выбранных пользователем полей. Колонка задаётся областью с указанием только номеров колонок: ТабДок.Область(, НомерКолонки, , НомерКолонки).

Для колонок тип смещения указывают ПоГоризонтали — тогда ячейки справа от удалённой колонки сдвинутся влево. Ошибка в выборе смещения здесь критична: если при удалении колонки указать смещение по вертикали, содержимое документа сдвинется непредсказуемым образом, и структура таблицы будет разрушена.

// Удаляем третью колонку

ОбластьКолонки = ТабДок.Область(, 3, , 3);

ТабДок.УдалитьОбласть(ОбластьКолонки,

ТипСмещенияТабличногоДокумента.ПоГоризонтали);

Как и со строками, при удалении нескольких колонок в цикле двигайтесь справа налево — от большего номера колонки к меньшему. Это исключает пересчёт координат после каждой итерации.

Удаление именованных областей и блоков макета

Именованные области удаляются так же, как адресные, но с ними связаны дополнительные нюансы. Во-первых, область должна существовать в документе на момент удаления: если она не выводилась из макета, попытка получить её вызовет ошибку. Безопасный приём — обернуть обращение в попытку или проверить структуру документа заранее.

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

// Безопасное удаление именованной области

Попытка

ОбластьБлок = ТабДок.Область("БлокСкидки");

ТабДок.УдалитьОбласть(ОбластьБлок,

ТипСмещенияТабличногоДокумента.ПоВертикали);

Исключение

// Область не выводилась — удалять нечего

КонецПопытки;

Альтернативы удалению: очистка и скрытие

Не всегда область нужно именно удалять. Если задача — просто убрать содержимое ячеек, но сохранить структуру и высоту строк, используйте метод Очистить() у области или удаление с типом смещения БезСмещения. Ячейки останутся на месте, но станут пустыми.

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

Для динамических отчётов на системе компоновки данных табличный документ строится автоматически, и прямое удаление областей в нём применяют редко: правильнее управлять структурой через настройки отчёта, отборы и условное оформление.

Сравнение подходов

УдалитьОбласть со смещением

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

УдалитьОбласть без смещения

Очищает содержимое, но сохраняет размеры области. Подходит, когда структура документа должна остаться неизменной

Не выводить область из макета

Самый безопасный вариант: лишний блок просто не попадает в документ. Требует условной логики при формировании

Типичные ошибки и способы их избежать

Первая распространённая ошибка — удаление области, которая не существует в документе. Обращение ТабДок.Область("Имя") к отсутствующей именованной области вызывает исключение. Проверяйте наличие области или используйте конструкцию Попытка...Исключение.

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

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

Типичные ошибки
01
Удаление в цикле сверху вниз — после смещения пропускаются строки или удаляются не те данные
02
Неверный тип смещения — структура таблицы разрушается, ячейки сдвигаются не в том направлении
03
Обращение к несуществующей именованной области без проверки — исключение и остановка формирования печатной формы
04
Удаление области, пересекающейся с другой именованной областью — потеря границ и имён у оставшихся блоков

Проверка результата после удаления

После удаления области убедитесь, что документ остался корректным. Основные контрольные точки: высота таблицы (ТабДок.ВысотаТаблицы) уменьшилась на число удалённых строк; ширина таблицы (ТабДок.ШиринаТаблицы) уменьшилась на число удалённых колонок; данные, располагавшиеся ниже или правее, находятся на ожидаемых позициях.

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

Контрольные точки

Как проверить результат

Высота таблицы после удаления строк
Норма

Уменьшилась ровно на число удалённых строк

Тревожный признак

Не изменилась или уменьшилась на другое значение — удалена не та область

Положение данных ниже удалённого блока
Норма

Данные сдвинулись вверх и стоят вплотную к предыдущему блоку

Тревожный признак

Появились пустые строки или данные наложились друг на друга

Ширина таблицы после удаления колонок
Норма

Уменьшилась на число удалённых колонок, колонки справа сдвинулись влево

Тревожный признак

Содержимое сдвинулось по вертикали — выбран неверный тип смещения

Часто задаваемые вопросы

Можно ли отменить удаление области?

Нет, метод УдалитьОбласть необратим для текущего экземпляра табличного документа. Чтобы иметь возможность отката, сохраните копию документа перед удалением или формируйте документ заново из макета при изменении условий.

Что произойдёт, если удалить область, которая частично выходит за границы документа?

Будут удалены только те ячейки, которые реально существуют в документе. Однако такая ситуация обычно говорит об ошибке в расчёте координат — стоит проверить логику формирования адресов областей.

Как удалить несколько несмежных строк одним вызовом?

Метод УдалитьОбласть работает только с одним непрерывным прямоугольным диапазоном. Несмежные строки удаляйте отдельными вызовами, двигаясь снизу вверх, чтобы смещение нумерации не влияло на ещё не обработанные строки.

Чем удаление отличается от очистки области?

Очистка (метод Очистить у области или смещение БезСмещения) удаляет только содержимое ячеек — сами ячейки, их размеры и форматирование остаются. Удаление со смещением убирает ячейки из структуры документа, и соседние ячейки занимают их место.

Работает ли УдалитьОбласть с табличным документом, открытым пользователем в форме?

Да, метод можно применять к реквизиту формы типа ТабличныйДокумент, и изменения отобразятся на экране. Но учитывайте, что пользователь мог уже внести правки вручную — программное удаление перезапишет структуру без предупреждения.

Как удалить область в отчёте на СКД?

Напрямую удалять области в результате компоновки не рекомендуется. Вместо этого управляйте выводом через настройки отчёта: отключайте группировки, ресурсы и поля, используйте отборы и условное оформление. Программная коррекция готового табличного документа СКД оправдана только в исключительных случаях.

Итог

Что важно запомнить

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