Как пометить на удаление или удалить документы с незаполненными обязательными реквизитами в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

Выясним причины возникновения проблемы

Проанализируем ситуация, почему 1С не дает пометить документ на удаление:

  1. Проверка заполнения обязательных реквизитов: На уровне конфигурации для реквизитов установлено свойство проверки заполнения. При записи объекта платформа блокирует операцию, если хотя бы одно из таких полей пустое.
  2. Проведенное состояние документа: Пометка на удаление проведенного документа инициирует его распроведение. Если в системе включен контроль остатков или переписана логика отмены проведения, запись завершается ошибкой.
  3. Дата запрета изменения: Если документ относится к закрытому периоду, срабатывает механизм защиты данных.
  4. Подписки на события: Обработчики ПередЗаписью и ПриЗаписи проверяют корректность данных или запрещают редактировать старые записи.

Способ 1. Заполнение обязательных реквизитов значениями по умолчанию

Так как документы все равно подлежат удалению, конкретные значения реквизитов не имеют значения. Заполним незаполненные поля любыми допустимыми данными, после чего пометим документы штатным образом.

Для этого выполним следующие шаги:

  1. Воспользуемся типовой обработкой «Изменение выделенных элементов» (входит в состав Библиотеки Стандартных Подсистем).
  2. Откроем список нужных документов, выделим их и выберем пункт «Изменить выделенные».
  3. Укажем значение по умолчанию для не заполненных реквизитов (например, укажем условного контрагента или договор).
  4. В дополнительных настройках обработки включим режим записи без выполнения проверок на форме.
  5. Запишем изменения и выполним стандартную пометку на удаление.

Способ 2. Программирование: запись объекта с отключением проверок (ОбменДанными.Загрузка)

Разберем программный способ пометки на удаление. Для обхода встроенных проверок модуля объекта и подписок на события используем флаг ОбменДанными.Загрузка = Истина.

Важно: Вызов метода УстановитьПометкуУдаления(Истина) в режиме загрузки данных вызывает системную ошибку платформы. Чтобы пометить документ программно, необходимо напрямую изменить свойство ПометкаУдаления и вызвать метод Записать().

Рассмотрим пример кода внешней обработки:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	РеализацияТоваровУслуг.Ссылка КАК Ссылка
    |ИЗ
    |	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    |ГДЕ
    |	РеализацияТоваровУслуг.ПометкаУдаления = ЛОЖЬ
    |	И РеализацияТоваровУслуг.Дата < &ДатаОграничения";

Запрос.УстановитьПараметр("ДатаОграничения", Дата('20180101'));
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
    ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();
    
    // Если документ проведен, сначала отменяем проведение или очищаем движения
    Если ДокументОбъект.Проведен Тогда
        ДокументОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
    КонецЕсли;
    
    // Отключаем проверки платформы и БСП
    ДокументОбъект.ОбменДанными.Загрузка = Истина;
    ДокументОбъект.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов", Истина);
    
    ДокументОбъект.ПометкаУдаления = Истина;
    ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
КонецЦикла;

Посмотрим на особенности этого метода: флаг ОбменДанными.Загрузка = Истина отключает большинство проверок в модуле объекта. Однако если документ был проведен, перед пометкой его необходимо обязательно распровести (установить РежимЗаписиДокумента.ОтменаПроведения), чтобы в базе не осталось «зависших» движений по регистрам.

Способ 3. Интерактивное удаление (Shift + Del) и очистка ссылок

В конфигураторе для роли пользователя можно включить право «Интерактивное удаление» для проблемного вида документов. Это позволит удалять документы непосредственно из базы нажатием комбинации клавиш Shift + Del в обход проверки заполнения реквизитов и процесса установки пометки.

Проанализируем риски данного подхода:

  1. Интерактивное удаление может привести к появлению «битых» ссылок (неразрешенных ссылок вида <Объект не найден>) в других связанных документах и регистрах.
  2. После массового интерактивного удаления обязательно выполните процедуру Тестирование и исправление информационной базы (ТИИ) в Конфигураторе с настройкой «Создавать ссылки» или «Очищать ссылки» для восстановления целостности данных.

Диагностика ошибок записи

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

  1. Перейдем в меню Администрирование — Обслуживание — Журнал регистрации.
  2. Установим отбор по уровню «Ошибка» и объекту документа.
  3. В тексте ошибки проанализируем конкретную причину: блокировку закрытого периода, сбой подписки на событие или отказ регистров накопления.
  4. При необходимости временно отключим даты запрета изменения данных на время работы администратора.
← На главную