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