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

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

Как очистить объект в 1С: инструкция для разработчика и администратора

Как очистить объект в 1С: методы Очистить() для таблиц и реквизитов, удаление объектов из базы, очистка регистров и типичные ошибки разработчика.

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

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

Материал охватывает оба сценария: программную очистку реквизитов и коллекций в коде и безопасное удаление объектов из базы. Примеры приведены для управляемых форм и типового синтаксиса платформы 8.3.

Очистка табличной части и таблицы значений методом Очистить()

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

Объект.Товары.Очистить();

// После этого можно заполнять табличную часть заново

Для Каждого СтрокаОтбора Из РезультатЗапроса Цикл

НоваяСтрока = Объект.Товары.Добавить();

НоваяСтрока.Номенклатура = СтрокаОтбора.Номенклатура;

НоваяСтрока.Количество = СтрокаОтбора.Количество;

КонецЦикла;

Тот же метод работает для таблиц значений, деревьев значений и динамических списков, заполняемых программно. Если таблица значений больше не нужна вовсе, можно присвоить переменной Неопределено — сборщик освободит память при выходе из области видимости.

Важный нюанс: Очистить() изменяет данные только в памяти. Если это объект, существующий в базе (например, открытый документ), изменения попадут в базу только после вызова Объект.Записать(). Если запись не выполнить, при повторном чтении объекта табличная часть вернётся в исходное состояние.

bsl
Объект.Товары.Очистить();
Объект.Записать(РежимЗаписиДокумента.Запись);

Очистка реквизитов объекта

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

Объект.Контрагент = Справочники.Контрагенты.ПустаяСсылка();

Объект.Комментарий = "";

Объект.СуммаДокумента = 0;

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

Для реквизитов составного типа присваивание Неопределено — корректный способ очистки: тип значения сбрасывается, и при следующем обращении реквизит будет не заполнен. Проверить заполненность можно функцией ЗначениеЗаполнено().

Очистка регистров сведений и накопления

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

НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Номенклатура.Установить(НужнаяНоменклатура);

НаборЗаписей.Записать(); // записи по отбору удалены

Для подчинённых регистров (с регистратором) записи удаляются через набор с отбором по регистратору. Это штатный способ очистить движения документа: платформа делает это автоматически при отмене проведения, но программно тот же приём используют в обработках исправления данных.

Удалять записи регистров напрямую запросом УДАЛИТЬ на уровне СУБД категорически не рекомендуется: это нарушает логику платформы, может привести к рассогласованию итогов и ошибкам при проведении документов.

Удаление объекта из базы: пометка и непосредственное удаление

Штатный путь удаления объекта из информационной базы двухэтапный. Сначала объект помечается на удаление — интерактивно по клавише Delete или программно методом УстановитьПометкуУдаления(Истина). Помеченный объект остаётся в базе, но исключается из большинства выборок и отчётов.

Затем выполняется удаление помеченных объектов: в режиме «Предприятие» через раздел «Администрирование» → «Удаление помеченных объектов». Платформа проверяет ссылочную целостность: если на объект есть ссылки из других документов или справочников, удаление будет заблокировано, и система покажет список мест использования.

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

Проверка результата и границы безопасной работы

После программной очистки проверьте результат прямым чтением: количество строк табличной части должно быть равно нулю (Объект.Товары.Количество() = 0), реквизиты — не заполнены (НЕ ЗначениеЗаполнено(Объект.Контрагент)). Для регистров — запросом убедитесь, что записи по нужному отбору отсутствуют.

После удаления помеченных объектов полезно запустить тестирование и исправление информационной базы с проверкой ссылочной целостности, если удалялся большой массив данных. Это выявит оставшиеся битые ссылки до того, как на них наткнутся пользователи.

Граница самостоятельной работы проходит там, где начинаются массовые операции над рабочей базой: очистка регистров за длительный период, удаление тысяч объектов, изменение данных напрямую в обход бизнес-логики. Такие задачи выполняют в копии базы, с резервной копией и, при наличии сложных связей данных, с привлечением специалиста по 1С.

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

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

Табличная часть после Очистить()
Норма

Количество строк равно 0, после записи и переоткрытия строк нет

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

После переоткрытия строки вернулись — объект не был записан

Удаление объекта из базы
Норма

Объект отсутствует в списках, ссылок на него не осталось

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

В документах появились значения «Объект не найден»

Очистка регистра
Норма

Запрос по отбору возвращает пустой результат, итоги корректны

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

Удалились лишние записи — отбор набора записей не был установлен

Итог

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

Коллекции очищают методом Очистить(), реквизиты — присваиванием пустых значений, регистры — записью пустого набора с отбором. Удаление объектов из базы выполняют через пометку удаления и штатную обработку с контролем целостности. Любая массовая операция — только после резервной копии.

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

Чем отличается Очистить() от Удалить() для табличной части?

Очистить() удаляет все строки коллекции разом. Удалить() у табличной части удаляет одну конкретную строку по индексу или по самой строке: Объект.Товары.Удалить(0). Для полной очистки всегда используйте Очистить() — это быстрее и проще, чем цикл с Удалить().

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

Потому что очистка изменила данные только в памяти. Объект, существующий в базе, нужно записать после изменений: Объект.Записать(). Без записи база сохраняет прежнюю версию объекта.

Как удалить объект, если платформа пишет, что на него есть ссылки?

Запустите удаление помеченных объектов — платформа покажет список мест использования. Откройте эти объекты и замените или очистите ссылки, затем повторите удаление. Автоматически «оборвать» ссылки штатными средствами нельзя, это сделано для защиты целостности данных.

Можно ли очистить проведённый документ, не отменяя проведение?

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

Как очистить массив в 1С?

У массива нет метода Очистить(). Присвойте переменной новый пустой массив: Массив = Новый Массив; — старый массив будет освобождён, если на него не осталось других ссылок.

Опасно ли удалять объекты через прямые запросы к базе SQL?

Да. Прямое удаление на уровне СУБД обходит механизмы платформы: остаются битые ссылки, рассогласовываются итоги регистров и служебные таблицы. Все операции с данными выполняйте средствами встроенного языка или штатными обработками.