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