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