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