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

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

Как удалить пустые строки в 1С

Способы удалить пустые строки в 1С: очистка табличной части документа, фильтрация в запросе, удаление строк в табличном документе и обработкой. Примеры кода.

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

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

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

Определите, где находятся пустые строки

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

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

Табличная часть документаДанные учёта

Удаление влияет на документ, требуется запись/проведение

Табличный документПечатная форма, отчёт

Удаление влияет только на внешний вид, данные не меняются

Результат запросаВременные данные

Строки не удаляют, а исключают условием ГДЕ

Таблица значенийПрограммный объект

Очищается циклом или свёрткой в коде

Удаление пустых строк в табличной части документа вручную

Если пустых строк немного, проще всего удалить их прямо в форме документа. Установите курсор на строку и нажмите клавишу Del или кнопку «Удалить» (значок с крестиком) на командной панели табличной части. Для удаления нескольких строк выделите их с зажатой клавишей Ctrl или Shift, затем нажмите Del.

В управляемых формах (1С:Предприятие 8.3, интерфейс «Такси») доступна групповая обработка строк: в некоторых конфигурациях есть кнопка «Ещё» → «Удалить пустые строки» или аналогичная команда в меню табличной части. Наличие такой команды зависит от конкретной конфигурации — в типовых «Управлении торговлей» и «ERP» в ряде документов она присутствует, в самописных решениях может отсутствовать.

После удаления строк документ нужно записать, а если он проведён — перепровести. Иначе изменения останутся только в открытой форме и при закрытии будут потеряны либо вызовут вопрос о сохранении.

Ручное удаление строк в документе
  1. 1
    Откройте документ и перейдите на вкладку с табличной частью
  2. 2
    Выделите пустую строку кликом или несколько строк через Ctrl/Shift
  3. 3
    Нажмите Del или кнопку «Удалить» на панели табличной части
  4. 4
    Проверьте, что нужные строки остались на месте
  5. 5
    Запишите и при необходимости перепроведите документ

Программное удаление пустых строк из табличной части

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

Типовой пример очистки табличной части «Товары» от строк без номенклатуры:

Для Индекс = 1 - Объект.Товары.Количество() По 0 Цикл

// обход с конца: индекс отрицательный смещения

КонецЦикла;

// Корректный вариант — обход с конца:

КоличествоСтрок = Объект.Товары.Количество();

Для НомерСтроки = 1 По КоличествоСтрок Цикл

Строка = Объект.Товары[КоличествоСтрок - НомерСтроки];

Если НЕ ЗначениеЗаполнено(Строка.Номенклатура) Тогда

Объект.Товары.Удалить(Строка);

КонецЕсли;

КонецЦикла;

Обратите внимание на функцию ЗначениеЗаполнено() — она корректно распознаёт пустую ссылку, ноль, пустую строку и дату. Если нужно удалять также строки с нулевым количеством, добавьте условие ИЛИ Строка.Количество = 0. Проверка Строка.Номенклатура = "" для ссылочного поля работать не будет — пустая ссылка не равна пустой строке.

bsl
КоличествоСтрок = Объект.Товары.Количество();
Для Номер = 1 По КоличествоСтрок Цикл
    Строка = Объект.Товары[КоличествоСтрок - Номер];
    Если НЕ ЗначениеЗаполнено(Строка.Номенклатура) Тогда
        Объект.Товары.Удалить(Строка);
    КонецЕсли;
КонецЦикла;

Исключение пустых строк в запросе

В языке запросов 1С строки не «удаляют» — их отсекают условием в секции ГДЕ. Это быстрее и правильнее, чем выбирать всё и потом чистить таблицу значений в коде: отбор выполняется на стороне СУБД.

Для ссылочных полей используют сравнение с пустой ссылкой через ЗНАЧЕНИЕ, для чисел — с нулём, для строк — с пустой строкой. Пример отбора только заполненных строк табличной части:

ВЫБРАТЬ

Товары.Номенклатура,

Товары.Количество

ИЗ

Документ.РеализацияТоваровУслуг.Товары КАК Товары

ГДЕ

Товары.Ссылка = &Ссылка

И Товары.Номенклатура <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)

И Товары.Количество > 0

Тонкость: NULL в запросе не равен пустой ссылке и не сравнивается обычными операторами. Если поле может содержать NULL (например, после левого соединения), используйте проверку НЕ Поле ЕСТЬ NULL или функцию ЕСТЬNULL(Поле, ЗНАЧЕНИЕ(...)). Игнорирование NULL — частая причина «фантомных» пустых строк в итоговой выборке.

Удаление строк в табличном документе и таблице значений

Табличный документ

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

Если документ уже сформирован, область строки удаляется так: ТабДок.УдалитьОбласть(ТабДок.Область("R" + НомерСтроки), СпособСмещенияОбластей.ПоВертикали). Учтите, что удаление областей в большом документе — медленная операция; при массовой чистке выгоднее пересобрать документ заново без лишних строк.

Таблица значений

Для таблицы значений логика та же, что и для табличной части: обход с конца с методом Удалить() либо построение новой таблицы через отбор. Альтернатива без цикла — метод НайтиСтроки() с структурой отбора, но он не подходит для проверки «на пустоту» сложных условий, только на точное равенство значений.

Если задача — не удалить строки, а сгруппировать их (например, убрать дубли с пустыми дополнительными полями), используйте метод Свернуть(). Он объединяет строки с одинаковыми значениями измерений и суммирует числовые колонки, что часто решает проблему «лишних» строк без явного удаления.

Способы очистки таблицы значений

Цикл с конца + Удалить()

Универсальный вариант, подходит для любых условий; требует аккуратности с индексами

НайтиСтроки() + удаление найденных

Быстро для точного совпадения значений; не работает со сложными условиями

Свернуть()

Убирает дубли и объединяет строки; не удаляет строки по условию пустоты

Запрос с ГДЕ

Самый быстрый для данных из БД; применим только если данные ещё не выбраны

Массовая очистка через обработки и по всей базе

Когда пустые строки накопились во многих документах, ручная чистка непрактична. В типовых конфигурациях на БСП (Библиотека стандартных подсистем) есть обработка «Групповое изменение реквизитов» — она позволяет отобрать документы по условию и выполнить произвольный код, в том числе очистку табличных частей. Обработка доступна пользователям с правами администратора в разделе «Администрирование» → «Обслуживание» → «Корректировка данных».

Для разовой массовой операции можно написать внешнюю обработку: запросом отобрать документы, у которых в табличной части есть пустые строки, затем в транзакции обойти каждый объект, очистить строки и записать. Записывать документы лучше в режиме РежимЗаписиДокумента.Запись, чтобы случайно не изменить движения проведённых документов — если движения зависят от табличной части, потребуется перепроведение, и это нужно делать осознанно.

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

Проверка результата и типичные ошибки

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

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

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

Итоговая сумма документа
Норма

Сумма не изменилась или изменилась ожидаемо

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

Сумма уменьшилась — удалены строки с данными

Движения документа
Норма

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

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

Появились отрицательные остатки или ошибки проведения

Журнал обработки
Норма

Количество удалённых строк соответствует ожиданию

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

Удалено заметно больше строк, чем было пустых

Типичные ошибки
01
Удаление в прямом цикле по индексу — после каждого Удалить() индексы сдвигаются, часть строк пропускается
02
Сравнение ссылочного поля с пустой строкой — условие никогда не сработает, нужна ЗначениеЗаполнено() или пустая ссылка
03
Игнорирование NULL в запросе — строки с NULL проходят отбор и выглядят пустыми в результате
04
Перепроведение документов закрытого периода без согласования — меняются итоги прошлых отчётов
05
Очистка без резервной копии — при ошибке в условии восстановить удалённые строки невозможно
Итог

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

Способ удаления пустых строк зависит от места: в табличной части — Del или цикл с конца с ЗначениеЗаполнено(), в запросе — условие ГДЕ с учётом NULL, в табличном документе — УдалитьОбласть(). Перед массовой очисткой делайте копию базы и проверяйте итоги после обработки.

Частые вопросы

Почему строки удаляются через одну при программной очистке?

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

Как удалить строки с нулевым количеством, но заполненной номенклатурой?

Добавьте в условие проверку количества: Если Строка.Количество = 0 Тогда … Удалить(Строка). В запросе аналог — условие ГДЕ Товары.Количество > 0. Такие строки часто остаются после загрузки прайсов и не влияют на итоги, но засоряют печатные формы.

Можно ли удалить пустые строки в документе без программирования?

Да. Выделите строки в форме и нажмите Del, либо поищите команду «Удалить пустые строки» в меню «Ещё» табличной части — в ряде типовых документов она есть. Для массовой очистки без кода подойдёт обработка «Групповое изменение реквизитов» в конфигурациях на БСП.

Чем отличается пустая ссылка от NULL в запросе?

Пустая ссылка — это конкретное значение ссылочного типа, хранящееся в поле. NULL возникает в результате запроса, когда соединение не нашло соответствующей записи. Сравнение «Поле = ЗНАЧЕНИЕ(...ПустаяСсылка)» не отловит NULL, а «Поле ЕСТЬ NULL» — не отловит пустую ссылку, поэтому условия иногда нужно комбинировать.

Удалятся ли пустые строки из печатной формы автоматически?

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

Опасно ли чистить строки в проведённых документах?

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