Как исправить ошибку «Недостаточно фактических параметров» и удалить задвоенные идентификаторы объектов метаданных при восстановлении РИБ?

Программист 1С v8.3 (Управляемые формы) 1С:Розница Торговля и дистрибуция
← На главную

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

{Справочник.ИдентификаторыОбъектовМетаданных.МодульМенеджера(3064)}: Недостаточно фактических параметров ЭлементБлокировки.УстановитьЗначение(ЗаменяемаяСсылка);

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

Причина возникновения сбоя и механизм ошибки

Проанализируем механику работы механизма идентификации метаданных в конфигурациях 1С на базе БСП:

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

Способ 1. Удаление помеченных объектов через режим обычного приложения

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

Разберем пошаговый порядок действий:

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

Способ 2. Программное удаление помеченных дублей через внешнюю обработку

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

Посмотрим на пример программного скрипта:


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

После удаления всех помеченных элементов ошибочная ветка кода БСП перестанет вызываться, так как в базе больше не останется заменяемых ссылок-дублей.

Способ 3. Исправление строки в модуле менеджера (для баз с возможностью изменения)

Если конфигурация уже снята с полной поддержки и допускает внесение изменений, можно исправить саму причину падения в коде:

  1. Открываем конфигуратор и находим справочник ИдентификаторыОбъектовМетаданных.
  2. Открываем Модуль менеджера и переходим к строке, указанной в тексте ошибки (в районе строки 3064).
  3. Находим строку: ЭлементБлокировки.УстановитьЗначение(ЗаменяемаяСсылка); и заменяем ее на: ЭлементБлокировки.УстановитьЗначение("Ссылка", ЗаменяемаяСсылка);
  4. Сохраняем конфигурацию базы данных (F7) и запускаем процесс восстановления узла заново. В этом случае алгоритм БСП успешно выполнит штатную замену всех ссылок и очистит дубликаты самостоятельно.

Способ 4. Принудительное обновление служебных данных

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

  1. Запустить информационную базу с ключом командной строки: 1cv8.exe ENTERPRISE /F "ПутьКБазе" /C ЗапуститьОбновлениеИнформационнойБазы
  2. Либо выполнить инициализацию обновления вручную через программный вызов:
    
    Справочники.ИдентификаторыОбъектовМетаданных.ВыполнитьОбновлениеДанных(Истина, Истина, Ложь);
    

Как правильно обновлять узлы РИБ, чтобы избежать задвоения идентификаторов

Чтобы в будущем не сталкиваться с появлением дублей и сбоями процедур миграции, придерживаемся правильного регламента обновления распределенных баз:

  1. Всегда производим обновление конфигурации в главном узле РИБ.
  2. Запускаем главный узел в режиме «1С:Предприятие» и дожидаемся 100% завершения всех отложенных обработчиков обновления данных.
  3. Выполняем выгрузку сообщения обмена из главного узла в периферийный узел.
  4. В периферийном узле загружаем файл обмена: конфигурация обновится автоматически средствами платформы РИБ без «отвязки» узла от главного и без накатывания файлов .cf вручную.
  5. Принимаем изменения в конфигураторе периферийного узла и запускаем «1С:Предприятие» для выполнения регламентных процедур.
← На главную