Разработка и Конфигурация · 10 мин
Как удалить строку табличного документа в 1С
Как удалить строку табличного документа в 1С: методы УдалитьОбласть, Очистить, циклы по строкам, удаление по условию. Примеры кода и типичные ошибки.
Табличный документ в 1С — это объект, который платформа использует для печатных форм, отчётов и макетов. В отличие от таблицы значений, у него нет типового метода «УдалитьСтроку»: работа со строками выполняется через области ячеек. Из-за этого у начинающих разработчиков возникает вопрос, как корректно удалить одну строку или группу строк, не разрушив структуру документа.
Основной инструмент — метод УдалитьОбласть(), который удаляет прямоугольную область и сдвигает оставшиеся ячейки в указанном направлении. Дополнительно применяются методы Очистить(), Область() и свойство ВысотаТаблицы для определения границ. Правильный выбор зависит от задачи: удалить одну строку, очистить всё содержимое или убрать строки по условию.
Важно понимать разницу между табличным документом и табличной частью объекта (например, документа «Реализация»). Если нужно удалить строку в табличной части документа базы данных, используется совсем другой подход — метод Удалить() коллекции строк. В этой статье рассмотрены оба сценария, но акцент сделан именно на табличном документе.
Чем табличный документ отличается от табличной части
Прежде чем удалять строку, нужно точно определить, с каким объектом вы работаете. Табличный документ (тип ТабличныйДокумент) — это аналог листа Excel: сетка ячеек с адресами по номерам строк и колонок. Он существует в памяти, формируется программно или выводится пользователю на экран и в печать.
Табличная часть — это коллекция строк, хранящаяся внутри объекта базы данных: документа, справочника, обработки. Каждая строка — структурированная запись с реквизитами. Удаление строк здесь выполняется через коллекцию, а не через области ячеек.
Путаница между этими объектами — самая частая причина ошибок. Если код выдаёт сообщение «Метод объекта не обнаружен», проверьте тип переменной: возможно, вы пытаетесь применить метод табличной части к табличному документу или наоборот.
Удаление строки методом УдалитьОбласть
Метод УдалитьОбласть() принимает два параметра: область, которую нужно удалить, и тип смещения — куда сдвинутся оставшиеся ячейки. Для удаления целой строки область задаётся по номеру строки без указания колонок, а смещение выбирается ПоВертикали, чтобы нижние строки поднялись вверх.
// Удаление 5-й строки табличного документа
ТабДок = Новый ТабличныйДокумент;
// ... заполнение документа ...
ОбластьСтроки = ТабДок.Область(5, , 5, );
ТабДок.УдалитьОбласть(ОбластьСтроки, ТипСмещенияТабличногоДокумента.ПоВертикали);Обратите внимание на синтаксис обращения к области: ТабДок.Область(5, , 5, ) — первый и третий параметры задают номера первой и последней строки, а пустые второй и четвёртый означают «все колонки». Такая область охватывает строку целиком.
Если нужно удалить несколько подряд идущих строк, например с 5-й по 8-ю, укажите диапазон: ТабДок.Область(5, , 8, ). Все четыре строки будут удалены за один вызов, что работает быстрее, чем четыре отдельных удаления.
Удаление строк по условию в цикле
Типовая задача — удалить все строки, где ячейка пустая или содержит определённое значение. Здесь есть важный нюанс: при удалении строки нумерация нижележащих строк смещается, поэтому перебирать строки нужно снизу вверх, от последней к первой.
// Удаление строк с пустой первой колонкой
НомерСтроки = ТабДок.ВысотаТаблицы;
Пока НомерСтроки >= 1 Цикл
ЗначениеЯчейки = ТабДок.Область(НомерСтроки, 1).Текст;
Если Не ЗначениеЗаполнено(ЗначениеЯчейки) Тогда
ТабДок.УдалитьОбласть(
ТабДок.Область(НомерСтроки, , НомерСтроки, ),
ТипСмещенияТабличногоДокумента.ПоВертикали);
КонецЕсли;
НомерСтроки = НомерСтроки - 1;
КонецЦикла;Обход снизу вверх гарантирует, что смещение строк не нарушит логику цикла: удалённые строки находятся ниже текущей позиции и не влияют на нумерацию ещё не проверенных. Если идти сверху вниз, после удаления следующая строка «перепрыгнет» проверку, и часть данных останется необработанной.
Свойство ВысотаТаблицы возвращает номер последней заполненной строки документа. Используйте его как верхнюю границу цикла — не задавайте номера строк «с запасом», иначе получите лишние итерации или обращения к несуществующим областям.
Полная очистка документа методом Очистить
Если нужно удалить все строки разом, используйте метод Очистить() без параметров. Он удаляет всё содержимое табличного документа: ячейки, форматирование, рисунки и именованные области. После вызова документ становится пустым, ВысотаТаблицы равна нулю.
// Полная очистка табличного документа
ТабДок.Очистить();
// Теперь документ можно заполнить зановоМетод удобен при переформировании печатной формы: например, пользователь изменил параметры на форме, и отчёт нужно построить заново. Вместо создания нового объекта достаточно очистить существующий реквизит формы типа «ТабличныйДокумент» и вывести в него новые данные.
Учтите, что Очистить() удаляет и параметры расшифровки, и настройки печати, заданные программно. Если часть настроек нужно сохранить, запомните их в переменные перед очисткой и восстановите после заполнения.
Удаление строки табличной части объекта
Когда речь идёт не о печатной форме, а о табличной части документа или справочника, подход другой. Коллекция строк поддерживает методы Удалить() (по строке или индексу) и Очистить() для полного удаления. Строки также можно удалять интерактивно: в форме документа выделите строку и нажмите клавишу Delete или кнопку с изображением красного крестика.
// Удаление строки табличной части документа
ДокументОбъект.Товары.Удалить(0); // удалить первую строку по индексу
// Удаление конкретной строки
СтрокаТЧ = ДокументОбъект.Товары.Найти(НоменклатураСсылка, "Номенклатура");
Если СтрокаТЧ <> Неопределено Тогда
ДокументОбъект.Товары.Удалить(СтрокаТЧ);
КонецЕсли;
// Удаление всех строк
ДокументОбъект.Товары.Очистить();Индексы строк табличной части начинаются с нуля, а не с единицы — это отличается от нумерации строк табличного документа. При удалении в цикле действует то же правило обхода снизу вверх, что и для табличного документа.
Сравнение вариантов
Удаляет строки из печатной формы со сдвигом остальных. Подходит для постобработки отчётов, не влияет на данные в базе
Удаляет строку из данных объекта. Требует последующей записи объекта, иначе изменения потеряются
Удаляет всё содержимое разом. Быстро, но не позволяет удалять выборочно
Проверка результата и границы безопасной работы
После удаления строки из табличного документа проверьте результат визуально: выведите документ на экран или в предварительный просмотр. Контрольные признаки: количество строк уменьшилось, итоговые строки (если они вычислялись при формировании) соответствуют новым данным, форматирование соседних строк не сбилось.
Как проверить результат
Уменьшилась на число удалённых строк
Не изменилась — область удалена без смещения или удаление не выполнилось
Номера строк идут подряд, итоги совпадают с данными
Пропуски в нумерации, итоги посчитаны по старым данным
Строка исчезла, объект записан без ошибок
Изменения видны на форме, но после закрытия пропадают — объект не записан
Главный риск при работе с табличной частью — забыть записать объект после удаления строк. Изменения в коллекции существуют только в памяти; без вызова Записать() данные в базе останутся прежними. Перед массовым удалением строк из документов базы сделайте резервную копию или выполняйте операцию в транзакции с возможностью отката.
Что важно запомнить
Строки табличного документа удаляются методом УдалитьОбласть() со смещением ПоВертикали, при выборочном удалении цикл идёт снизу вверх. Для табличных частей объектов используется метод Удалить() коллекции с обязательной последующей записью объекта.
Частые вопросы
Как удалить последнюю строку табличного документа?
Получите номер последней строки через свойство ВысотаТаблицы и удалите область с этим номером: ТабДок.УдалитьОбласть(ТабДок.Область(ТабДок.ВысотаТаблицы, , ТабДок.ВысотаТаблицы, ), ТипСмещенияТабличногоДокумента.ПоВертикали). Если документ пуст, ВысотаТаблицы равна нулю, и удалять нечего.
Почему после удаления строки в цикле удаляются не все нужные строки?
Цикл идёт сверху вниз. При удалении строки все нижние смещаются на одну позицию вверх, и счётчик пропускает следующую строку. Перестройте цикл на обход от последней строки к первой — тогда смещение не затронет ещё не обработанные строки.
Чем отличается Очистить() от УдалитьОбласть()?
Очистить() удаляет всё содержимое документа целиком, включая форматирование и именованные области. УдалитьОбласть() работает точечно с заданным диапазоном ячеек и сдвигает оставшееся содержимое. Для удаления отдельных строк подходит только второй вариант.
Удалил строку из табличной части, но после закрытия документа она снова на месте. В чём причина?
Объект не был записан после изменения. Метод Удалить() изменяет данные только в памяти. Вызовите Записать() у объекта документа, чтобы зафиксировать изменения в базе данных.
Можно ли удалить строку табличного документа интерактивно, без кода?
В режиме редактирования табличного документа можно выделить строку и удалить её содержимое клавишей Delete, но сама строка как структура сетки останется. Полноценное удаление со сдвигом выполняется только программно через УдалитьОбласть().
Как удалить строки, содержащие определённый текст?
Пройдите циклом от последней строки к первой, читайте текст нужной ячейки через ТабДок.Область(НомерСтроки, НомерКолонки).Текст, сравнивайте с искомым значением и при совпадении вызывайте УдалитьОбласть() для этой строки со смещением ПоВертикали.