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