При работе с платформой «1С:Предприятие 8.3» многие разработчики сталкиваются с ситуацией, когда после удаления предопределенного элемента в Конфигураторе, он продолжает отображаться в режиме Предприятие. Попытка интерактивного удаления такого объекта обычно заканчивается ошибкой, так как система все еще считает его «особенным». Особенно это актуально для справочника ПоказателиРасчетаЗарплаты, который имеет сложную структуру и тесно связан с механизмами расчета.
В этой статье мы разберем по шагам, почему так происходит и как корректно очистить базу от ненужных элементов, используя программные и интерактивные методы.
Проанализируем ситуацию: начиная с версии платформы 8.3.6, механизм работы с предопределенными данными изменился. Теперь связь между объектом в метаданных и записью в таблице базы данных является «мягкой». Когда вы удаляете элемент в Конфигураторе, платформа не удаляет саму запись в базе данных автоматически, чтобы избежать потери ссылочной целостности. Внутри записи в базе данных остается заполненным служебный реквизит ИмяПредопределенныхДанных. Пока он заполнен строковым идентификатором, элемент считается предопределенным, даже если в дереве конфигурации его уже нет.
Рассмотрим самый простой способ, который не требует написания кода. Воспользуемся стандартной обработкой «Групповое изменение реквизитов», которая присутствует в большинстве современных конфигураций (ЗУП 3.1, ERP, КА 2).
Показатели расчета зарплаты.После этой операции элемент перестанет подсвечиваться специальной иконкой «шарика» в списке и станет обычным элементом справочника. Теперь его можно пометить на удаление и удалить стандартным способом через «Удаление помеченных объектов».
Если групповая обработка по каким-то причинам не помогает или требуется массовая очистка по сложному условию, воспользуемся программным методом. Проанализируем пример кода, который позволяет снять признак предопределенности.
Основная хитрость здесь заключается в использовании свойства ОбменДанными.Загрузка = Истина. Это позволяет обойти прикладные проверки в модуле объекта, которые могут блокировать изменение предопределенных данных.
// Выбираем нужный элемент (например, по наименованию или ссылке)
ЭлементСсылка = Справочники.ПоказателиРасчетаЗарплаты.НайтиПоНаименованию("ВашПоказатель");
Если Не ЭлементСсылка.Пустая() Тогда
// Получаем объект для изменения
ОбъектПоказатель = ЭлементСсылка.ПолучитьОбъект();
// Очищаем имя предопределенных данных
ОбъектПоказатель.ИмяПредопределенныхДанных = "";
// Переименовываем для удобства поиска при удалении
ОбъектПоказатель.Наименование = "УДАЛИТЬ_" + ОбъектПоказатель.Наименование;
// Устанавливаем пометку удаления
ОбъектПоказатель.ПометкаУдаления = Истина;
// Включаем режим загрузки, чтобы обойти проверки бизнес-логики
ОбъектПоказатель.ОбменДанными.Загрузка = Истина;
// Записываем объект
Попытка
ОбъектПоказатель.Записать();
Сообщить("Элемент успешно преобразован в обычный и помечен на удаление.");
Исключение
Сообщить("Ошибка при записи: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
Выясним причину, почему в некоторых случаях даже этот код может не сработать. Если в конфигурации настроены жесткие подписки на события перед записью, они могут проверять пометку удаления даже при Загрузка = Истина. В таком случае сначала запишите только очистку ИмяПредопределенныхДанных, а уже вторым шагом помечайте на удаление интерактивно.
Посмотрим на ситуацию со стороны системного администрирования. Если вы удалили множество элементов в конфигураторе и не хотите обрабатывать каждый вручную в Предприятии, можно воспользоваться встроенным механизмом очистки.
ИмяПредопределенныхДанных у «осиротевших» записей).Этот метод хорош тем, что он централизованно проверяет всю базу на соответствие метаданным. После завершения процесса все элементы, которых нет в конфигураторе, станут обычными, и их можно будет удалить через интерфейс.
Проанализируем риски. Справочник ПоказателиРасчетаЗарплаты — это не просто список строк. На эти показатели ссылаются:
Совет: Прежде чем окончательно удалять элемент, всегда используйте кнопку «Найти ссылки на объект». Если ссылки найдены в документах прошлых периодов, лучше не удалять показатель, а просто переименовать его в "НЕ ИСПОЛЬЗОВАТЬ (Удалить)" и очистить ИмяПредопределенныхДанных, чтобы он не мешался в коде, но сохранил целостность базы данных.
Таким образом, мы рассмотрели три основных способа решения проблемы. Наиболее эффективным для разового удаления является Способ 2 (программный), так как он гарантирует обход большинства блокировок платформы.