Как исправить ошибку «Предопределенный элемент отсутствует в данных» при обновлении 1С?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

Рассмотрим частую и довольно неприятную ситуацию, с которой сталкиваются пользователи и специалисты при обновлении типовых конфигураций (например, «Бухгалтерия предприятия» редакции 3.0). В процессе обновления базы на новую версию платформа внезапно прерывает работу и выдает сообщение: Справочник.ВидыРегистровУчета.РегистрыБУСубъектовМалогоПредпринимательства. Предопределенный элемент отсутствует в данных.

Разберем по шагам, почему возникает эта проблема, проведем диагностику и проанализируем сразу несколько эффективных способов ее решения, от запуска простого программного кода до использования стандартных механизмов платформы 1С.

Выясним причину возникновения ошибки

Прежде чем приступать к ремонту базы, проанализируем ситуацию. Ошибка означает, что конкретный элемент (в данном случае — группа справочника) жестко задан разработчиками в дереве метаданных конфигурации, но физически отсутствует в таблицах пользовательской базы данных, либо потерял с ней связь.

Посмотрим на основные причины, приводящие к такому рассинхрону:

  1. Случайное удаление или модификация. Пользователь с полными правами или некорректно написанная внешняя обработка очистили служебный реквизит ИмяПредопределенныхДанных у элемента справочника в режиме предприятия — восстановить элемент поможет обработка отмены изменений конкретного пользователя.
  2. Проблемы в распределенных информационных базах (РИБ). Если база является узлом обмена, ошибка может возникнуть, если данные из центрального узла еще не загрузились, или элементы создавались некорректно при установленном параметре ОбменДанными.Загрузка = Истина.
  3. Отключено автообновление. В свойствах конфигурации для проблемного справочника кто-то установил значение НеОбновлятьАвтоматически.
  4. Сбои платформы или кэша. Нарушение регламента последовательного обновления (например, резкий скачок через множество релизов) приводит к «битой» конфигурации поставщика.

Проведем диагностику проблемы

Вместо того чтобы сразу писать код или искать внешние обработки, давайте обратимся к средствам диагностики самой платформы. Откроем базу в режиме «Предприятие» или «Конфигуратор» и посмотрим в «Журнал регистрации» (для удобства есть утилита автоматического мониторинга журнала регистрации 1С).

Настроим отбор по проблемному объекту (в нашем случае это Справочник.ВидыРегистровУчета) и включим фильтр по событиям «Данные: Изменение предопределенных данных» или «Удаление предопределенных данных». Зачастую в журнале можно четко увидеть, кто именно из пользователей и в какой момент стер связь — старое имя предопределенных данных заменяется на пустую строку — для исправления таких ошибок и восстановления объектов разработан инструмент исправления и изменения данных 1С.

Способ 1: Программное восстановление элемента (Рекомендуемый)

Рассмотрим самый быстрый способ, который решает проблему напрямую. Нам нужно принудительно создать недостающую группу справочника и заполнить ей свойство ИмяПредопределенныхДанных. Для этого создадим новую внешнюю обработку через Конфигуратор, добавим на форму кнопку и в модуле формы напишем следующий код:


&НаСервере
Процедура ВосстановитьЭлементНаСервере()
    РодительСПР = Справочники.ВидыРегистровУчета.СоздатьГруппу();
    РодительСПР.Наименование = "Регистры субъектов малого предпринимательства";
    РодительСПР.ИмяПредопределенныхДанных = "РегистрыБУСубъектовМалогоПредпринимательства";
    РодительСПР.Записать();
КонецПроцедуры

&НаКлиенте
Процедура ВосстановитьЭлемент(Команда)
    ВосстановитьЭлементНаСервере();
    Сообщить("Предопределенный элемент успешно создан!");
КонецПроцедуры

После выполнения этого кода элемент появится в базе данных, связь с конфигурацией будет восстановлена, и вы сможете беспрепятственно продолжить обновление.

Если же ошибка касается не только одной группы, но и множества вложенных элементов справочника, проанализируем более развернутый вариант кода. Он не только создает группы, но и перебирает массивы предопределенных имен, помещая их в нужных родителей:


&НаСервере
Процедура Команда1НаСервере()
    // Создаем родительские группы
    РодительСПР = Справочники.ВидыРегистровУчета.СоздатьГруппу(); 
    РодительСПР.Наименование = "Регистры субъектов малого предпринимательства"; 
    РодительСПР.ИмяПредопределенныхДанных = "РегистрыБУСубъектовМалогоПредпринимательства"; 
    РодительСПР.Записать(); 
    
    РодительБух = Справочники.ВидыРегистровУчета.СоздатьГруппу(); 
    РодительБух.Наименование = "Регистры бухгалтерского учета"; 
    РодительБух.ИмяПредопределенныхДанных = "РегистрыБухгалтерскогоУчета"; 
    РодительБух.Записать(); 

    // Связываем элементы первого списка
    Список1 = Новый Массив; 
    Список1.Добавить("ВедомостьУчетаДенежныхСредств"); 
    // ... сюда можно добавить другие имена регистров из вашей ошибки ...
    Список1.Добавить("КнигаУчетаФактовХозяйственнойДеятельности"); 
    
    Для каждого ИмяСп Из Список1 Цикл 
        ТекСправочник = Справочники.ВидыРегистровУчета[ИмяСп].ПолучитьОбъект(); 
        ТекСправочник.Родитель = Справочники.ВидыРегистровУчета.РегистрыБУСубъектовМалогоПредпринимательства; 
        ТекСправочник.Записать(); 
    КонецЦикла; 
КонецПроцедуры

Способ 2: Перенос данных через формат XML

Если вы не владеете навыками программирования или база не дает запустить внешние обработки, давайте применим штатный метод работы с XML. Разберем по шагам эту процедуру:

  1. Создайте абсолютно новую (пустую) базу данных 1С с таким же релизом конфигурации, как у вашей проблемной базы (или демо-базу).
  2. Воспользуйтесь стандартной обработкой «Выгрузка и загрузка данных в формате XML» (ее можно найти на дисках ИТС или стандартных ресурсах поддержки) — для этого подойдёт обработка выгрузки и загрузки XML-данных.
  3. В пустой базе откройте эту обработку, перейдите на вкладку выгрузки, найдите в дереве метаданных Справочник.ВидыРегистровУчета и отметьте его галочкой. Выгрузите данные в файл.
  4. Откройте проблемную базу, запустите ту же обработку и на вкладке загрузки выберите созданный файл. Укажите режим загрузки и нажмите выполнить.

Обработка физически перенесет эталонный справочник из чистой базы в вашу, восстановив тем самым все внутренние идентификаторы и имена предопределенных данных.

Способ 3: Очистка кэша и проверка физической целостности БД

Если программное добавление не помогло, проанализируем системные ошибки платформы. Часто «залипание» предопределенных элементов лечится банальной очисткой временных файлов.

  1. Закройте все сеансы 1С.
  2. Очистите кэш платформы. Для этого нужно удалить папки с длинными буквенно-цифровыми названиями в профиле пользователя по путям AppData\Roaming\1C и AppData\Local\1C.
  3. Запустите конфигуратор и выполните Тестирование и исправление (ТиИ). В меню «Администрирование» выберите соответствующие пункты, обязательно отметив «Реиндексация таблиц информационной базы» и «Проверка логической целостности ИБ». Платформа сама найдет «оторванные» элементы и попытается их восстановить.

Для файловых баз также крайне рекомендуется прогнать файл 1Cv8.1CD через стандартную утилиту проверки целостности физических таблиц — chdbfl.exe (она находится в папке bin установленной платформы 1С).

Способ 4: Переинициализация конфигурации поставщика

Рассмотрим метод, который спасает в ситуациях, когда конфигурация поставщика «сломалась» из-за некорректных или прерванных обновлений. Этот подход заставит 1С перечитать и заново инициализировать все предопределенные данные.

  1. Обязательно сделайте резервную копию базы данных!
  2. В Конфигураторе откройте настройку поддержки и полностью снимите конфигурацию с поддержки.
  3. Сохраните изменения (нажмите F7).
  4. Запустите механизм «Сравнение, объединение с конфигурацией из файла». Выберите эталонный файл .cf нужного вам релиза.
  5. В открывшемся окне дерева сравнения снимите абсолютно все галочки, чтобы не затереть пользовательские данные, но при этом система предложит поставить конфигурацию обратно на поддержку. Согласитесь на это.
  6. Обновите конфигурацию базы данных.

Благодаря этому действию платформа заново сверит метаданные конфигурации с физическими таблицами базы данных и восстановит поврежденную структуру предопределенных элементов. После этого вы сможете накатить следующее обновление без возникновения ошибки.

← На главную