При выполнении операции полного удаления документа в конфигурациях 1С, таких как «Комплексная автоматизация 1.1», разработчики нередко сталкиваются с ошибкой: «Не удалось записать: Состояния электронных документов!». Эта ошибка возникает из-за того, что платформа пытается обновить записи в одноименном регистре сведений при удалении документа, который участвует в обмене электронными документами (ЭДО). Давайте разберем, как правильно и безопасно решить эту задачу, если ссылочная целостность для вас не является критическим фактором.
Когда вы вызываете метод Удалить() для объекта документа, система инициирует множество автоматических процессов, включая подписки на события. В случае с документами, имеющими записи в регистре Состояния электронных документов, платформа блокирует операцию, так как попытка удаления основного документа нарушает логику хранения данных в регистре. Чтобы обойти это ограничение, нам необходимо предварительно очистить все записи в этом регистре, которые ссылаются на наш документ.
Первым делом нам нужно найти и удалить записи в регистре СостоянияЭД, которые относятся к нашему документу. Для этого мы будем использовать объект НаборЗаписей. Рассмотрим подробнее, как это реализовать программно:
// Предположим, ВыбДок - это ссылка на ваш документ, который нужно удалить
НаборЗаписей = РегистрыСведений.СостоянияЭД.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.СсылкаНаОбъект.Установить(ВыбДок);
// Очищаем набор записей по заданному отбору
НаборЗаписей.Записать(Истина);
Важно отметить, что метод Записать() с параметром Истина при пустом наборе записей (но с установленным отбором) полностью удаляет все записи, соответствующие критерию. Вам не нужно предварительно вызывать метод Прочитать(), достаточно просто установить отбор по измерению СсылкаНаОбъект и записать пустой набор.
После того как мы очистили регистр, который препятствовал удалению, можно приступать к самому удалению документа. Для этого необходимо сначала получить объект документа по ссылке, а затем вызвать метод Удалить().
ОбъектДокумент = ВыбДок.ПолучитьОбъект();
// Если ссылочная целостность не важна, отключаем подписки на события
ОбъектДокумент.ОбменДанными.Загрузка = Истина;
ОбъектДокумент.Удалить();
Использование свойства ОбменДанными.Загрузка = Истина является профессиональным приемом при необходимости «жесткого» удаления данных. Оно отключает выполнение большинства подписок на события, что предотвращает появление дополнительных ошибок и ускоряет процесс удаления.
Рассмотрим, на что еще стоит обратить внимание при выполнении подобных операций:
Удалить() удаляет документ безвозвратно. Если на этот документ есть ссылки в других местах (например, в счетах на оплату, движениях по регистрам или отчетах), они превратятся в «битые» ссылки, что приведет к ошибкам «Объект не найден» в будущем.ПометкаУдаления = Истина и воспользуйтесь типовой обработкой «Удаление помеченных объектов». Этот путь является наиболее безопасным для стабильности базы данных.Теперь вы знаете, как справиться с блокировкой регистра при удалении документов в 1С. Проанализируйте свои задачи, убедитесь, что удаление данных действительно необходимо, и используйте предложенный алгоритм очистки записей перед вызовом основного метода удаления.