При обновлении узлов распределенной информационной базы (РИБ) через прямое накатывание файла конфигурации (.cf) с временным отключением узла от главного плана обмена администраторы и разработчики нередко сталкиваются с ситуацией, когда в узле задваиваются системные данные. В частности, в служебном справочнике ИдентификаторыОбъектовМетаданных появляются дублирующие элементы с пометками на удаление. В момент попытки повторно связать узлы или запустить штатную процедуру сопоставления система падает со следующей ошибкой:
{Справочник.ИдентификаторыОбъектовМетаданных.МодульМенеджера(3064)}: Недостаточно фактических параметров ЭлементБлокировки.УстановитьЗначение(ЗаменяемаяСсылка);
Разберем детально, почему возникает данная проблема, в чем заключается ошибка программного кода в типовой Библиотеке стандартных подсистем (БСП) и какими способами можно быстро восстановить работоспособность базы данных.
Проанализируем механику работы механизма идентификации метаданных в конфигурациях 1С на базе БСП:
ПланыОбмена.УстановитьГлавныйУзел(Неопределено) и обновлен файлом .cf, то при первом старте база формирует новые записи в справочнике ИдентификаторыОбъектовМетаданных с новыми уникальными идентификаторами (UUID). При обратном подключении к РИБ и сопоставлении старые записи узла получают пометку на удаление, а новые становятся актуальными.ИдентификаторыОбъектовМетаданных на этапе установки управляемой блокировки разработчиками типового решения была допущена синтаксическая ошибка. Метод УстановитьЗначение() объекта управляемой блокировки требует обязательной передачи двух параметров (имя поля и значение), а в коде был передан только один:
// Ошибочная строка в типовом коде:
ЭлементБлокировки.УстановитьЗначение(ЗаменяемаяСсылка);
// Корректный синтаксис:
ЭлементБлокировки.УстановитьЗначение("Ссылка", ЗаменяемаяСсылка);
Рассмотрим самый быстрый способ, не требующий написания дополнительного кода или снятия конфигурации с поддержки. В режиме управляемого приложения служебный справочник ИдентификаторыОбъектовМетаданных скрыт в стандартной обработке «Удаление помеченных объектов» специальными программными фильтрами БСП. Однако в толстом клиенте обычного приложения стандартная обработка сканирует метаданные напрямую.
Разберем пошаговый порядок действий:
/RunModeOrdinaryApplication.Если конфигурация работает исключительно в режиме управляемого приложения и обычные формы заблокированы, воспользуемся непосредственным удалением помеченных элементов с помощью консоли кода или внешней обработки.
Посмотрим на пример программного скрипта:
Выборка = Справочники.ИдентификаторыОбъектовМетаданных.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.ПометкаУдаления Тогда
ОбъектИдентификатора = Выборка.ПолучитьОбъект();
Попытка
// Выполняем непосредственное удаление объекта без контроля ссылочной целостности
ОбъектИдентификатора.Удалить();
Исключение
Сообщить("Не удалось удалить элемент: " + Выборка.Наименование + ". Ошибка: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЦикла;
После удаления всех помеченных элементов ошибочная ветка кода БСП перестанет вызываться, так как в базе больше не останется заменяемых ссылок-дублей.
Если конфигурация уже снята с полной поддержки и допускает внесение изменений, можно исправить саму причину падения в коде:
ИдентификаторыОбъектовМетаданных.
ЭлементБлокировки.УстановитьЗначение(ЗаменяемаяСсылка);
и заменяем ее на:
ЭлементБлокировки.УстановитьЗначение("Ссылка", ЗаменяемаяСсылка);
После очистки задвоенных записей рекомендуется принудительно обновить идентификаторы метаданных. Разберем, как это сделать:
1cv8.exe ENTERPRISE /F "ПутьКБазе" /C ЗапуститьОбновлениеИнформационнойБазы
Справочники.ИдентификаторыОбъектовМетаданных.ВыполнитьОбновлениеДанных(Истина, Истина, Ложь);
Чтобы в будущем не сталкиваться с появлением дублей и сбоями процедур миграции, придерживаемся правильного регламента обновления распределенных баз:
.cf вручную.