Рассмотрим частую и довольно неприятную ситуацию, с которой сталкиваются пользователи и специалисты при обновлении типовых конфигураций (например, «Бухгалтерия предприятия» редакции 3.0). В процессе обновления базы на новую версию платформа внезапно прерывает работу и выдает сообщение: Справочник.ВидыРегистровУчета.РегистрыБУСубъектовМалогоПредпринимательства. Предопределенный элемент отсутствует в данных.
Разберем по шагам, почему возникает эта проблема, проведем диагностику и проанализируем сразу несколько эффективных способов ее решения, от запуска простого программного кода до использования стандартных механизмов платформы 1С.
Прежде чем приступать к ремонту базы, проанализируем ситуацию. Ошибка означает, что конкретный элемент (в данном случае — группа справочника) жестко задан разработчиками в дереве метаданных конфигурации, но физически отсутствует в таблицах пользовательской базы данных, либо потерял с ней связь.
Посмотрим на основные причины, приводящие к такому рассинхрону:
ИмяПредопределенныхДанных у элемента справочника в режиме предприятия — восстановить элемент поможет обработка отмены изменений конкретного пользователя.ОбменДанными.Загрузка = Истина.НеОбновлятьАвтоматически.Вместо того чтобы сразу писать код или искать внешние обработки, давайте обратимся к средствам диагностики самой платформы. Откроем базу в режиме «Предприятие» или «Конфигуратор» и посмотрим в «Журнал регистрации» (для удобства есть утилита автоматического мониторинга журнала регистрации 1С).
Настроим отбор по проблемному объекту (в нашем случае это Справочник.ВидыРегистровУчета) и включим фильтр по событиям «Данные: Изменение предопределенных данных» или «Удаление предопределенных данных». Зачастую в журнале можно четко увидеть, кто именно из пользователей и в какой момент стер связь — старое имя предопределенных данных заменяется на пустую строку — для исправления таких ошибок и восстановления объектов разработан инструмент исправления и изменения данных 1С.
Рассмотрим самый быстрый способ, который решает проблему напрямую. Нам нужно принудительно создать недостающую группу справочника и заполнить ей свойство ИмяПредопределенныхДанных. Для этого создадим новую внешнюю обработку через Конфигуратор, добавим на форму кнопку и в модуле формы напишем следующий код:
&НаСервере
Процедура ВосстановитьЭлементНаСервере()
РодительСПР = Справочники.ВидыРегистровУчета.СоздатьГруппу();
РодительСПР.Наименование = "Регистры субъектов малого предпринимательства";
РодительСПР.ИмяПредопределенныхДанных = "РегистрыБУСубъектовМалогоПредпринимательства";
РодительСПР.Записать();
КонецПроцедуры
&НаКлиенте
Процедура ВосстановитьЭлемент(Команда)
ВосстановитьЭлементНаСервере();
Сообщить("Предопределенный элемент успешно создан!");
КонецПроцедуры
После выполнения этого кода элемент появится в базе данных, связь с конфигурацией будет восстановлена, и вы сможете беспрепятственно продолжить обновление.
Если же ошибка касается не только одной группы, но и множества вложенных элементов справочника, проанализируем более развернутый вариант кода. Он не только создает группы, но и перебирает массивы предопределенных имен, помещая их в нужных родителей:
&НаСервере
Процедура Команда1НаСервере()
// Создаем родительские группы
РодительСПР = Справочники.ВидыРегистровУчета.СоздатьГруппу();
РодительСПР.Наименование = "Регистры субъектов малого предпринимательства";
РодительСПР.ИмяПредопределенныхДанных = "РегистрыБУСубъектовМалогоПредпринимательства";
РодительСПР.Записать();
РодительБух = Справочники.ВидыРегистровУчета.СоздатьГруппу();
РодительБух.Наименование = "Регистры бухгалтерского учета";
РодительБух.ИмяПредопределенныхДанных = "РегистрыБухгалтерскогоУчета";
РодительБух.Записать();
// Связываем элементы первого списка
Список1 = Новый Массив;
Список1.Добавить("ВедомостьУчетаДенежныхСредств");
// ... сюда можно добавить другие имена регистров из вашей ошибки ...
Список1.Добавить("КнигаУчетаФактовХозяйственнойДеятельности");
Для каждого ИмяСп Из Список1 Цикл
ТекСправочник = Справочники.ВидыРегистровУчета[ИмяСп].ПолучитьОбъект();
ТекСправочник.Родитель = Справочники.ВидыРегистровУчета.РегистрыБУСубъектовМалогоПредпринимательства;
ТекСправочник.Записать();
КонецЦикла;
КонецПроцедуры
Если вы не владеете навыками программирования или база не дает запустить внешние обработки, давайте применим штатный метод работы с XML. Разберем по шагам эту процедуру:
Справочник.ВидыРегистровУчета и отметьте его галочкой. Выгрузите данные в файл.Обработка физически перенесет эталонный справочник из чистой базы в вашу, восстановив тем самым все внутренние идентификаторы и имена предопределенных данных.
Если программное добавление не помогло, проанализируем системные ошибки платформы. Часто «залипание» предопределенных элементов лечится банальной очисткой временных файлов.
AppData\Roaming\1C и AppData\Local\1C.Для файловых баз также крайне рекомендуется прогнать файл 1Cv8.1CD через стандартную утилиту проверки целостности физических таблиц — chdbfl.exe (она находится в папке bin установленной платформы 1С).
Рассмотрим метод, который спасает в ситуациях, когда конфигурация поставщика «сломалась» из-за некорректных или прерванных обновлений. Этот подход заставит 1С перечитать и заново инициализировать все предопределенные данные.
.cf нужного вам релиза.Благодаря этому действию платформа заново сверит метаданные конфигурации с физическими таблицами базы данных и восстановит поврежденную структуру предопределенных элементов. После этого вы сможете накатить следующее обновление без возникновения ошибки.