Ошибка обновления БП 3.0 КОРП: Недопустимое значение параметра в ПланыОбмена.УдалитьРегистрациюИзменений

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

При обновлении конфигурации «Бухгалтерия предприятия 3.0 КОРП» может возникать критическая ошибка, которая прерывает процесс. Система сообщает о проблеме при вызове метода УдалитьРегистрациюИзменений и ссылается на недопустимое значение параметра. Рассмотрим подробно, почему это происходит и как безопасно исправить ситуацию, не снимая конфигурацию с поддержки насовсем.

Текст ошибки обычно выглядит следующим образом:


Ошибка при вызове метода контекста (УдалитьРегистрациюИзменений)
{Обработка.РезультатыОбновленияПрограммы.Форма.ОбновлениеВерсииПрограммы.Форма(644)}:ПланыОбмена.УдалитьРегистрациюИзменений(УзлыОбмена, ЭлементСостава.Метаданные);
...
по причине:
Недопустимое значение параметра (параметр номер '2')

Анализ причин возникновения ошибки

Чтобы понять, как решить проблему, давайте разберемся в механизме обновления конфигураций 1С. Ключевую роль в этом процессе играет служебный план обмена ОбновлениеИнформационнойБазы.

Как работает механизм обновления:

  1. Перед началом обновления система определяет, какие объекты метаданных будут затронуты, и регистрирует изменения для них в служебном плане обмена ОбновлениеИнформационнойБазы.
  2. После завершения основного, монопольного этапа обновления, запускаются так называемые «отложенные обработчики». Это процедуры, которые обрабатывают данные уже в обновленной структуре. Они ориентируются как раз на те зарегистрированные изменения в плане обмена.
  3. После того как все обработчики отработают, система должна очистить служебный план обмена, удалив регистрацию изменений. Именно на этом этапе и возникает наша ошибка.

Почему возникает сбой? Ошибка «Недопустимое значение параметра» в методе ПланыОбмена.УдалитьРегистрациюИзменений(Узлы, Метаданные) говорит о том, что в качестве второго параметра (Метаданные) передается объект метаданных, который не включен в состав самого плана обмена ОбновлениеИнформационнойБазы в конфигураторе.

Чаще всего это происходит, если в базе присутствуют объекты, добавленные нетиповыми механизмами, например, через внешние модули или расширения, которые были интегрированы ранее. Механизм обновления регистрирует изменения для такого объекта, но при попытке удалить эту регистрацию сталкивается с несоответствием: объект есть в списке на удаление, но его нет в «официальном» составе плана обмена. Это и приводит к сбою.

Интересный момент: если просто «пропустить» ошибку с помощью конструкции Попытка...Исключение, проблема не исчезнет. Записи о регистрации изменений для проблемных объектов останутся в базе данных. При следующем обновлении система снова их обнаружит и опять попытается удалить, что приведет к повторению той же самой ошибки.

Диагностика: как найти проблемные объекты

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

Рассмотрим пример такого диагностического кода:


// ... код из обработки обновления ...
Для Каждого ЭлементСостава Из Метаданные.ПланыОбмена.ОбновлениеИнформационнойБазы.Состав Цикл
    Попытка
        ПланыОбмена.УдалитьРегистрациюИзменений(УзлыОбмена, ЭлементСостава.Метаданные);
    Исключение
        // Вместо "Сообщить" для серверного вызова лучше использовать запись в Журнал Регистрации
        ТекстОшибки = "Проблемный элемент при удалении регистрации изменений: " + ЭлементСостава.Метаданные;
        ЗаписьЖурналаРегистрации("Обновление.Ошибка", УровеньЖурналаРегистрации.Ошибка, , , ТекстОшибки);
    КонецПопытки;
КонецЦикла;
// ...

В данном случае, в журнале регистрации появятся записи, указывающие на конкретные объекты метаданных, например, на документы или справочники, связанные с внешними системами документооборота.

Пошаговое решение проблемы

Основное решение заключается в том, чтобы привести состав плана обмена ОбновлениеИнформационнойБазы в соответствие с реальностью, то есть включить в него все объекты конфигурации. Этот метод безопасен, так как данный план обмена является служебным, и расширение его состава не нарушает бизнес-логику программы. Авторегистрация для него не нужна, так как регистрацией управляет сам механизм обновления.

Важно: все действия необходимо выполнять на копии информационной базы.

  1. Создайте резервную копию базы. Это обязательный шаг перед любыми изменениями конфигурации.
  2. Выгрузите конфигурацию в файл. Зайдите в Конфигуратор, выберите меню «Конфигурация» -> «Сохранить конфигурацию в файл...» и сохраните текущую конфигурацию в файл с расширением .cf. Этот файл понадобится нам, чтобы позже вернуть конфигурацию на полную поддержку.
  3. Включите возможность изменения. В Конфигураторе откройте конфигурацию («Конфигурация» -> «Открыть конфигурацию»). Затем в меню «Конфигурация» -> «Поддержка» -> «Настройка поддержки...» нажмите кнопку «Включить возможность изменения». Система предупредит о последствиях, согласитесь с ними.
  4. Измените состав плана обмена. В дереве метаданных найдите «Планы обмена» -> ОбновлениеИнформационнойБазы. Откройте его двойным кликом.
  5. Перейдите на вкладку «Состав». Справа над списком объектов есть несколько кнопок. Нажмите на кнопку «Включить в состав все объекты» (обычно выглядит как несколько плюсов).
  6. После того как все объекты добавлены, нужно убедиться, что для них отключена авторегистрация. Нажмите кнопку с изображением галочки и стрелки вниз («Установка и снятие авторегистрации») и выберите пункт «Запретить авторегистрацию для всех».
  7. Сохраните и обновите конфигурацию базы данных. Нажмите F7 или кнопку «Обновить конфигурацию базы данных» на панели инструментов.
  8. Запустите обновление в режиме 1С:Предприятие. Теперь запустите базу в пользовательском режиме и выполните стандартную процедуру обновления. Ошибка больше не должна появляться.
  9. Верните конфигурацию на поддержку. После успешного обновления снова зайдите в Конфигуратор. Выберите меню «Конфигурация» -> «Загрузить конфигурацию из файла...» и укажите тот самый .cf файл, который вы сохранили в шаге 2. Согласитесь с заменой. После этого конфигурация вернется в исходное состояние и будет полностью на поддержке поставщика.

Дополнительный момент: «Не закончены предыдущие обработки»

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

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

Что делать?

После того, как все отложенные обработчики успешно завершатся, сообщение о незавершенном обновлении перестанет появляться.

← На главную