Разработка и Конфигурация · 11 мин
Как убрать пустые строки в 1С: рабочие способы с примерами кода
Как убрать пустые строки в 1С в табличной части документа, таблице значений, запросе и динамическом списке. Код, условия выбора метода, типичные ошибки и FAQ.
Пустые строки в 1С появляются в разных местах: в табличной части документа, в таблице значений при обработке данных, в результате запроса и в динамическом списке. Универсальной кнопки «удалить пустые строки» в типовых конфигурациях нет, поэтому способ зависит от того, где именно возникла проблема и кто её решает — пользователь или разработчик.
Под «пустой строкой» обычно понимают одно из трёх: строку, где не заполнены ключевые реквизиты (номенклатура, контрагент); строку с нулевым количеством и суммой; строку, где все поля содержат пустые значения. Перед удалением важно определить, какие именно строки считаются пустыми в вашей задаче, иначе можно удалить нужные данные.
Ниже разобраны основные сценарии: ручное удаление в форме документа, программная очистка табличной части и таблицы значений, фильтрация в запросе и в динамическом списке, а также типичные ошибки и проверка результата.
Определите, какие строки считать пустыми
Прежде чем писать код или удалять строки вручную, зафиксируйте критерий пустоты. Самый частый вариант — не заполнен ключевой реквизит, например «Номенклатура» в табличной части «Товары». Такая строка не несёт смысла и мешает проведению документа или выгрузке данных.
Более строгий критерий — пусты все реквизиты строки. Он нужен, когда данные приходят из внешних источников (загрузка из Excel, обмен), и строка может содержать частичный «мусор». Третий вариант — строка с нулевыми количеством и суммой: формально она заполнена, но фактически бесполезна и часто искажает итоги и отчёты.
Удалять смело — смысловой нагрузки нет
Проверить, не нужна ли она для истории изменений
Проверить все колонки, часто пуста только часть
Не удалять данные — настроить отбор в отчёте
Удаление пустых строк в форме документа вручную
Если пустых строк немного, проще всего удалить их вручную прямо в форме документа. Установите курсор на строку табличной части и нажмите кнопку «Удалить» на командной панели таблицы либо сочетание клавиш Shift+Del. В управляемых формах также работает пункт контекстного меню «Удалить» по правой кнопке мыши.
Чтобы удалить несколько строк подряд, выделите их с зажатой клавишей Shift или Ctrl и нажмите «Удалить». После удаления проверьте итоги документа: суммы и количество пересчитываются автоматически в большинстве типовых документов, но в самописных решениях пересчёт может быть отключён.
Ручной способ подходит для разовой чистки. Если пустые строки появляются регулярно — например, после каждой загрузки прайса — их нужно устранять на уровне обработки загрузки, а не руками.
Программное удаление пустых строк из табличной части
Для программной очистки табличной части документа используется цикл с конца коллекции. Обход с конца обязателен: если удалять строки в прямом цикле, индексы сместятся, и часть строк будет пропущена.
ТабличнаяЧасть = Объект.Товары;
Для Индекс = 1 По ТабличнаяЧасть.Количество() Цикл
СтрокаТаблицы = ТабличнаяЧасть[ТабличнаяЧасть.Количество() - Индекс];
Если НЕ ЗначениеЗаполнено(СтрокаТаблицы.Номенклатура) Тогда
ТабличнаяЧасть.Удалить(СтрокаТаблицы);
КонецЕсли;
КонецЦикла;
Если критерий пустоты шире — например, не заполнены номенклатура, количество и сумма одновременно — объедините условия через «И»:
Если НЕ ЗначениеЗаполнено(СтрокаТаблицы.Номенклатура)
И СтрокаТаблицы.Количество = 0
И СтрокаТаблицы.Сумма = 0 Тогда
ТабличнаяЧасть.Удалить(СтрокаТаблицы);
КонецЕсли;
Такой код удобно разместить в процедуре «ПередЗаписью» документа или в команде формы «Очистить пустые строки». В типовых конфигурациях доработку лучше выполнять через расширение, чтобы не потерять её при обновлении.
- 1Определите критерий пустой строки: незаполненный реквизит или нулевые значения
- 2Напишите цикл с конца коллекции по индексу
- 3Добавьте проверку условия и вызов метода Удалить()
- 4Протестируйте на копии документа с реальными данными
- 5Проверьте итоги документа и проведение после очистки
Очистка таблицы значений в обработке
В таблице значений логика та же — обход с конца и удаление по условию. Но здесь доступен альтернативный приём: вместо удаления можно найти все пустые строки методом «НайтиСтроки» и удалить их списком, либо наоборот — скопировать непустые строки в новую таблицу через «Выгрузить» с отбором.
// Вариант 1: удаление через НайтиСтроки
Отбор = Новый Структура("Номенклатура", Неопределено);
ПустыеСтроки = ТаблицаДанных.НайтиСтроки(Отбор);
Для Каждого СтрокаТаблицы Из ПустыеСтроки Цикл
ТаблицаДанных.Удалить(СтрокаТаблицы);
КонецЦикла;
// Вариант 2: проверка всех колонок строки
Функция СтрокаПустая(СтрокаТаблицы, ТаблицаДанных)
Для Каждого Колонка Из ТаблицаДанных.Колонки Цикл
Если ЗначениеЗаполнено(СтрокаТаблицы[Колонка.Имя]) Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
Учтите ограничение метода «НайтиСтроки»: он сравнивает значения на строгое равенство, поэтому не подойдёт для условий вида «количество меньше или равно нулю». Для таких проверок используйте цикл. Также помните, что пустое значение ссылочного типа и «Неопределено» — разные вещи: функция «ЗначениеЗаполнено» корректно обрабатывает оба случая, а прямое сравнение с «Неопределено» — нет.
Отбор пустых строк в запросе и динамическом списке
Когда пустые строки нужно не удалить, а исключить из выборки, правильнее использовать запрос. Условие добавляется в секцию «ГДЕ»:
ВЫБРАТЬ
Товары.Номенклатура,
Товары.Количество,
Товары.Сумма
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Товары
ГДЕ
Товары.Номенклатура <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
И Товары.Количество > 0
В динамическом списке аналогичный эффект достигается настройкой отбора: откройте «Ещё — Настроить список», добавьте условие «Номенклатура не равно пустое значение» или «Количество больше 0». Это не удаляет данные, а только скрывает их из отображения, что безопасно и обратимо.
В отчётах на СКД пустые строки часто возникают из-за группировок с пустыми значениями измерений. Здесь решение — отбор по ресурсам (например, «Сумма оборот не равно 0») или проверка настроек группировки, а не чистка данных.
Сравнение вариантов
Подходит для разовой чистки нескольких строк. Не масштабируется и требует внимательности
Универсальный программный способ для табличной части и таблицы значений. Требует обхода с конца
Быстрее читается, но работает только с точным равенством значений
Не меняет данные, только скрывает строки. Оптимально для отчётов и списков
Типичные ошибки и проверка результата
Самая распространённая ошибка — удаление строк в прямом цикле «Для Каждого». При удалении текущей строки коллекция перестраивается, итератор сбивается, и часть пустых строк остаётся на месте или возникает ошибка обращения к несуществующему элементу. Всегда обходите коллекцию с конца по индексу.
Вторая ошибка — неверный критерий пустоты. Сравнение строки с пустой строкой «""» не сработает для реквизита ссылочного типа, а сравнение с «Неопределено» пропустит пустую ссылку. Используйте функцию «ЗначениеЗаполнено» — она учитывает все типы данных платформы.
После очистки обязательно проверьте результат: количество строк до и после, итоговые суммы документа, успешность проведения. Если чистили таблицу значений в обработке загрузки — сверьте количество загруженных строк с источником.
Как проверить результат
Уменьшилось ровно на число пустых строк
Удалено больше, чем ожидалось — ошибка в условии
Суммы совпадают с ожидаемыми или пересчитались корректно
Итоги обнулились или изменились непредсказуемо
Документ проводится без ошибок
Ошибки проведения из-за потерянных строк
Список «к удалению» содержит только действительно пустые строки
В список попали заполненные строки
FAQ
Как удалить пустые строки в табличной части, если документов много?
Напишите внешнюю обработку: запросом выберите документы, у которых в табличной части есть строки с незаполненной номенклатурой, затем в цикле откройте каждый объект, очистите табличную часть обходом с конца и запишите. Обязательно предусмотрите тестовый режим без записи и выполняйте обработку на копии базы.
Почему после удаления строк в цикле остаются пустые строки?
Скорее всего, используется прямой обход коллекции («Для Каждого» или цикл с начала по индексу). При удалении элемента индексы смещаются, и следующая строка пропускается. Решение — обход коллекции с конца: от последнего индекса к первому.
Как убрать пустые строки в отчёте, не трогая данные?
В отчёте на СКД добавьте отбор по ресурсу — например, «Сумма оборот не равно 0», либо отбор по измерению «не равно пустое значение». Если пустые строки возникают из-за группировки, проверьте, не включена ли группировка по полю, которое не заполнено у части данных.
Чем ЗначениеЗаполнено лучше сравнения с пустой строкой?
Функция «ЗначениеЗаполнено» универсальна: она корректно определяет пустоту для строк, чисел, дат, ссылок и значения «Неопределено». Прямое сравнение работает только для одного типа и даёт ложные результаты для ссылочных реквизитов, где пустое значение — это пустая ссылка конкретного вида.
Можно ли запретить добавление пустых строк в документ?
Да. В процедуре «ОбработкаПроверкиЗаполнения» модуля объекта проверьте каждую строку табличной части и вызовите отказ с сообщением, если ключевой реквизит не заполнен. В типовых конфигурациях такая проверка часто уже есть — тогда пустая строка просто не даст провести документ.
Как удалить строки с нулевым количеством, но оставить строки с нулевой ценой?
Разделите условия: удаляйте только строки, где количество равно нулю, независимо от цены. Строки с нулевой ценой могут быть легитимными (бонусы, образцы, безвозмездная передача), поэтому включать их в критерий пустоты без анализа учётной политики нельзя.
Что важно запомнить
Способ удаления пустых строк в 1С зависит от контекста: в форме — вручную, в табличной части и таблице значений — циклом с конца с функцией ЗначениеЗаполнено, в запросе и списке — отбором без изменения данных. Перед массовой очисткой определите точный критерий пустоты, сделайте тестовый прогон и резервную копию.