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