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