При попытке массовой пометки на удаление старых документов пользователи и администраторы 1С часто сталкиваются с ошибками вида: «Реквизиты документа автоматически не заполнены» или «Не удалось записать документ». Это происходит потому, что при штатной установке пометки удаления платформа выполняют процедуру записи объекта, вызывая все встроенные проверки заполнения реквизитов и логику в модулях.
Если документы устарели, данные по ликвидированным контрагентам утеряны, а количество таких объектов исчисляется сотнями, заполнять их вручную нецелесообразно. Рассмотрим подробно основные способы решения этой проблемы — от безопасных типовых обработок до программных методов с отключением проверок.
Проанализируем ситуация, почему 1С не дает пометить документ на удаление:
ПередЗаписью и ПриЗаписи проверяют корректность данных или запрещают редактировать старые записи.Так как документы все равно подлежат удалению, конкретные значения реквизитов не имеют значения. Заполним незаполненные поля любыми допустимыми данными, после чего пометим документы штатным образом.
Для этого выполним следующие шаги:
Разберем программный способ пометки на удаление. Для обхода встроенных проверок модуля объекта и подписок на события используем флаг ОбменДанными.Загрузка = Истина.
Важно: Вызов метода УстановитьПометкуУдаления(Истина) в режиме загрузки данных вызывает системную ошибку платформы. Чтобы пометить документ программно, необходимо напрямую изменить свойство ПометкаУдаления и вызвать метод Записать().
Рассмотрим пример кода внешней обработки:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.ПометкаУдаления = ЛОЖЬ
| И РеализацияТоваровУслуг.Дата < &ДатаОграничения";
Запрос.УстановитьПараметр("ДатаОграничения", Дата('20180101'));
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();
// Если документ проведен, сначала отменяем проведение или очищаем движения
Если ДокументОбъект.Проведен Тогда
ДокументОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
КонецЕсли;
// Отключаем проверки платформы и БСП
ДокументОбъект.ОбменДанными.Загрузка = Истина;
ДокументОбъект.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов", Истина);
ДокументОбъект.ПометкаУдаления = Истина;
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
КонецЦикла;
Посмотрим на особенности этого метода: флаг ОбменДанными.Загрузка = Истина отключает большинство проверок в модуле объекта. Однако если документ был проведен, перед пометкой его необходимо обязательно распровести (установить РежимЗаписиДокумента.ОтменаПроведения), чтобы в базе не осталось «зависших» движений по регистрам.
В конфигураторе для роли пользователя можно включить право «Интерактивное удаление» для проблемного вида документов. Это позволит удалять документы непосредственно из базы нажатием комбинации клавиш Shift + Del в обход проверки заполнения реквизитов и процесса установки пометки.
Проанализируем риски данного подхода:
<Объект не найден>) в других связанных документах и регистрах.Если даже при программной записи документ отказывается сохраняться, изучим причину с помощью системного инструмента: