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