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