Пустые строки в табличной части документа 1С: найти, удалить и больше не допускать
Содержание
Чтобы избавиться от пустых строк в табличной части 1С, выделите их мышью с зажатым Ctrl (или диапазон с Shift) и нажмите Delete, затем запишите документ. Если пустых строк сотни или они разбросаны по многим документам, удаление делают кодом: обратным циклом по табличной части или через НайтиСтроки() с последующей перезаписью документов.
Типичная ситуация: бухгалтер загрузил накладную из Excel, а при проведении 1С выдаёт Не заполнена колонка "Номенклатура" в строке 47 списка "Товары". В файле поставщика после итогов шли пустые строки с рамками, и программа честно их перенесла.
Откуда в табличной части берутся пустые строки
Пустая строка — это строка, в которой не заполнен ключевой реквизит: номенклатура, сотрудник, счёт, контрагент. Количество и сумма в ней могут быть нулевыми или, что хуже, заполненными.
Частые источники:
- 📥 Загрузка из Excel или другого файла. Пустые строки внутри таблицы, итоговые строки, объединённые ячейки, «хвост» из форматированных, но пустых строк в конце листа.
- 🔄 Обмен данными. Номенклатура в базе-источнике не сопоставилась с приёмником, и строка пришла с пустой ссылкой.
- ⌨️ Ручной ввод. Пользователь нажал
Insertили «Добавить», передумал и не удалил строку. - 🗑️ Удалённые элементы справочника. Номенклатуру пометили на удаление и удалили обработкой удаления помеченных с заменой ссылок на пустые — в документах остались строки без товара.
- 🧩 Доработки. Своя процедура заполнения добавляет строку до проверки, есть ли что в неё писать.
- 📄 Копирование документа. Если в исходнике уже была пустая строка, она переедет в копию.
Важно различать: строка с нулевым количеством, но заполненной номенклатурой — не пустая. Её удаление меняет смысл документа, поэтому «очищать по нулям» стоит только осознанно.
Ручное удаление пустых строк в форме документа
Для одного документа это самый безопасный способ.
- Откройте документ и перейдите на вкладку с нужной табличной частью (
Товары,Услуги,Начисленияи т. п.). - Отсортируйте таблицу по колонке с товаром: щёлкните по её заголовку. Пустые строки соберутся вместе — в начале или в конце списка.
- Щёлкните первую пустую строку, зажмите
Shiftи щёлкните последнюю. Для разрозненных строк используйтеCtrl+ щелчок. - Нажмите
Deleteили команду удаления строки на панели таблицы. - Нажмите «Записать» или «Провести и закрыть».
Сортировка по колонке в форме меняет только отображение. Порядок строк в самом документе после записи сохранится прежним, за вычетом удалённых.
Если документ проведён и период закрыт, изменение строк перепроведёт документ и поменяет движения. В закрытом периоде (с установленной датой запрета изменения) записать документ без снятия запрета не получится — согласуйте правку с главным бухгалтером.
Как удалить пустые строки в 1С кодом
Когда пустых строк много или нужно повторять очистку, пишут небольшую процедуру. Её можно оформить командой в расширении конфигурации, чтобы не снимать типовую конфигурацию с поддержки.
Обратный цикл по табличной части
Главная ловушка — удалять строки в прямом цикле Для Каждого. После удаления индексы сдвигаются, и соседняя строка пропускается. Перебирайте коллекцию с конца:
&НаСервере
Процедура УдалитьПустыеСтрокиНаСервере()
ТЧ = Объект.Товары;
Всего = ТЧ.Количество();
Для Сч = 1 По Всего Цикл
Строка = ТЧ[Всего - Сч];
Если НЕ ЗначениеЗаполнено(Строка.Номенклатура) Тогда
ТЧ.Удалить(Строка);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Проверка индексов: при Сч = 1 берётся последняя строка (Всего - 1), при Сч = Всего — первая (0). Удаление строки с конца не сдвигает строки перед ней, поэтому ни одна не теряется. Всего вычисляется один раз до цикла, а не на каждой итерации.
Через НайтиСтроки
Второй приём короче. НайтиСтроки() возвращает отдельный массив, поэтому удалять из табличной части можно в обычном цикле:
&НаСервере
Процедура УдалитьПустыеСтрокиНаСервере()
Отбор = Новый Структура("Номенклатура", Справочники.Номенклатура.ПустаяСсылка());
НайденныеСтроки = Объект.Товары.НайтиСтроки(Отбор);
Для Каждого Строка Из НайденныеСтроки Цикл
Объект.Товары.Удалить(Строка);
КонецЦикла;
КонецПроцедуры
Ограничение: отбор по пустой ссылке не поймает строку, где в составном типе стоит Неопределено. Если колонка составного типа, используйте первый вариант с ЗначениеЗаполнено().
Как подключить команду к форме
В расширении заимствуйте форму документа, добавьте команду формы и вынесите её кнопкой на панель табличной части. Клиентский обработчик вызывает серверную процедуру и помечает форму изменённой, чтобы пользователь не закрыл её без записи:
&НаКлиенте
Процедура УдалитьПустыеСтроки(Команда)
УдалитьПустыеСтрокиНаСервере();
Модифицированность = Истина;
КонецПроцедуры
Серверную процедуру из примеров выше разместите в модуле той же заимствованной формы. Документ при этом не записывается автоматически: пользователь видит результат и сам решает, сохранять ли его.
После удаления на клиенте вызовите пересчёт итогов документа, если в форме есть такая процедура, и запишите объект. В типовых формах итоги «Всего» и «НДС» обычно пересчитываются при записи, но в доработанных формах это стоит проверить.
Поиск документов с пустыми строками запросом
Прежде чем что-то чистить массово, выясните масштаб. Запрос к табличной части покажет все документы с пустыми строками:
ВЫБРАТЬ
Т.Ссылка КАК Документ,
Т.НомерСтроки КАК НомерСтроки,
Т.Количество КАК Количество,
Т.Сумма КАК Сумма
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК Т
ГДЕ
Т.Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
И Т.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
УПОРЯДОЧИТЬ ПО
Т.Ссылка.Дата
Выполнить его можно во внешней обработке «Консоль запросов» в режиме предприятия или в Конфигураторе через конструктор запроса. Имена документов и колонок поменяйте под свою конфигурацию: в БП 3.0 табличная часть поступления называется Товары, а реквизит — Номенклатура.
Что смотреть в результате:
| Что видно | Что это значит | Как поступить |
|---|---|---|
| Количество и сумма нулевые | «Мусорная» строка | Удалять смело |
| Сумма заполнена, товара нет | Не сопоставился товар при загрузке или обмене | Не удалять, а заполнить номенклатуру |
| Документ проведён в закрытом периоде | Правка изменит отчётность | Согласовать, при необходимости — корректировочный документ |
| Строки только в документах одного обмена | Ошибка правил сопоставления | Сначала исправить обмен |
Строку с суммой, но без товара удалять нельзя: из документа пропадёт часть стоимости, разойдутся расчёты с поставщиком и НДС.
Отладка в Конфигураторе
Если пустые строки появляются в новых документах, найдите, кто их создаёт. Поставьте точку останова в обработчике ПередЗаписью модуля объекта и запустите отладку. В табло проверьте Товары.Количество() и содержимое строк. Если пустая строка уже есть до записи — поставьте точку в процедуре заполнения или загрузки, которая её добавляет. Так находят, например, доработку, где Товары.Добавить() стоит перед проверкой исходных данных.
Массовая очистка пустых строк обработкой
Для десятков и сотен документов пишут внешнюю обработку . Логика: запросом выбрать документы, открыть каждый, удалить пустые строки, записать в том же режиме проведения.
&НаСервере
Процедура ОчиститьПустыеСтрокиНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Т.Ссылка КАК Ссылка
|ИЗ
| Документ.ПоступлениеТоваровУслуг.Товары КАК Т
|ГДЕ
| Т.Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
| И Т.Количество = 0
| И Т.Сумма = 0";
Выборка = Запрос.Выполнить().Выбрать();
Счетчик = 0;
Пока Выборка.Следующий() Цикл
ДокОбъект = Выборка.Ссылка.ПолучитьОбъект();
ТЧ = ДокОбъект.Товары;
Всего = ТЧ.Количество();
Для Сч = 1 По Всего Цикл
Строка = ТЧ[Всего - Сч];
Если НЕ ЗначениеЗаполнено(Строка.Номенклатура)
И Строка.Количество = 0 И Строка.Сумма = 0 Тогда
ТЧ.Удалить(Строка);
КонецЕсли;
КонецЦикла;
Попытка
Если ДокОбъект.Проведен Тогда
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
Иначе
ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
Счетчик = Счетчик + 1;
Исключение
Сообщить(СтрШаблон("Не записан %1: %2", Выборка.Ссылка,
КраткоеПредставлениеОшибки(ИнформацияОбОшибке())));
КонецПопытки;
КонецЦикла;
Сообщить(СтрШаблон("Обработано документов: %1", Формат(Счетчик, "ЧГ=0")));
КонецПроцедуры
Что важно в этом коде:
- 🎯 Условие удаления жёсткое: нет товара и нулевые количество с суммой. Строки с деньгами обработка не трогает.
- 🔁 Проведённый документ перепроводится, непроведённый просто записывается — статус не меняется.
- 🧯 Ошибки записи не прерывают проход: документ из закрытого периода попадёт в сообщения, остальные обработаются.
Перепроведение меняет движения документов. Перед запуском сделайте выгрузку базы в .dt или копию каталога файловой базы. Запускайте в нерабочее время: если обработку прервать, часть документов окажется перепроведённой, часть — нет.
Сначала прогоните обработку на копии базы и сверьте оборотно-сальдовую ведомость по 41 и 60 счетам до и после. Если цифры не изменились — пустые строки были действительно пустыми.
Пустые строки в отчётах и печатных формах
Иногда под «пустыми строками» имеют в виду не табличную часть, а отчёт.
Отчёт на СКД показывает строки с пустой группировкой. Откройте настройки отчёта, на вкладке отборов добавьте поле группировки и выберите вид сравнения «Заполнено». Строки с пустым значением исчезнут. Если нужно скрыть строки с нулевыми суммами, добавьте отбор по ресурсу «Не равно 0» — но помните, что он скрывает и реальные позиции с нулевым оборотом.
Печатная форма с пустыми строками. Если в накладной лишние строки, их источник почти всегда — пустые строки в табличной части документа. Удалите их в документе, и печатная форма перестроится.
Выгрузка в Excel. Отчёт, сохранённый в .xlsx, может содержать пустые строки-разделители из оформления. Их проще удалить в самом Excel: выделите столбец, через поиск выберите пустые ячейки и удалите строки целиком.
Как не допустить пустых строк
Чистить один раз — полдела. Лучше, чтобы пустые строки не появлялись.
- Проверка заполнения. В типовых БП 3.0 и УТ 11 колонка товара в документах уже проверяется: документ с пустой строкой не проведётся. Если ваш документ записывается без ошибки, в Конфигураторе у реквизита табличной части посмотрите свойство «Проверка заполнения» и установите «Выдавать ошибку». В типовой конфигурации делайте это через расширение или с ведома того, кто обновляет базу.
- Подготовка файла перед загрузкой. Удалите в Excel итоговые строки, объединённые ячейки и всё ниже последней строки с данными. Проще всего скопировать только диапазон с товарами на чистый лист.
- Правила обмена. Проверьте сопоставление номенклатуры: строка, пришедшая без товара, — сигнал, что объект не нашёлся по ключу.
- Обработка удаления помеченных. Удаляйте только объекты, на которые нет ссылок. Если программа показывает, что элемент используется в документах, не заменяйте ссылки на пустые без разбора.
- Доработки. В своём коде добавляйте строку только после проверки данных: сначала
Если ЗначениеЗаполнено(...), потомДобавить().
В процедуре ОбработкаПроверкиЗаполнения модуля документа можно не только ругаться на пустые строки, но и молча удалять полностью пустые (без товара, количества и суммы). Так поступают в доработках, где пользователи часто вставляют строки «про запас».
Как вернуть данные после неудачной очистки
Если очистка удалила строки, которые были нужны, порядок действий зависит от того, что сохранилось.
История изменений хранится, только если её включили заранее. В типовых конфигурациях на БСП настройка находится в разделе Администрирование → Общие настройки. Включить её после неудачной очистки уже поздно, но для следующего раза полезно.
Не загружайте .dt поверх рабочей базы, чтобы вернуть пару документов: пропадут все изменения, сделанные после выгрузки, у всех пользователей.