При обновлении конфигураций 1С (например, 1С:Зарплата и Управление Персоналом) на актуальный релиз разработчики и администраторы часто сталкиваются с прерыванием процесса обработчиков обновления. В журнале регистрации или окне предприятия появляется сообщение вида:
"Ошибка в процедуре ЗаполнитьИсточникиДанныхДляПроверкиЗапретаИзменения общего модуля ДатыЗапретаИзмененияПереопределяемый. Для проверки запрета изменения в источнике данных неверно указана таблица '? Документ.ЗавершениеИспытательногоСрока (664b3f02-77ce-11e8-a134-00155d465601)'".
Давайте подробно разберем, откуда берется эта ошибка, проанализируем причины появления фантомных объектов метаданных и рассмотрим проверенные на практике способы решения этой проблемы.
Если внимательно посмотреть на текст ошибки, мы увидим символ вопроса перед названием объекта: ? Документ.ЗавершениеИспытательногоСрока. В платформе 1С:Предприятие этот символ означает "битую" ссылку. Обычно в пользовательском режиме такие ссылки отображаются как <Объект не найден> с указанием уникального идентификатора (GUID).
Почему это происходит? Проанализируем типичные ситуации:
Прежде чем писать код, давайте воспользуемся штатными механизмами платформы. Часто проблема кроется в рассинхронизации справочника ИдентификаторыОбъектовМетаданных и реальной структуры конфигурации. Ручная пометка на удаление элементов этого справочника может привести к ошибкам с пустыми таблицами (когда в тексте ошибки указано таблица "").
Рассмотрим правильный подход: запустим базу в режиме 1С:Предприятие с ключами командной строки, которые принудительно обновят метаданные.
/C ОбновитьИдентификаторыОбъектовМетаданных или /C ЗапуститьОбновлениеИнформационнойБазы.Кроме того, для гарантированного исправления можно использовать типовую обработку от фирмы 1С "Обновление Идентификаторов Объектов Метаданных" (доступна на портале ИТС), которая предназначена для безопасного устранения подобных рассинхронов.
Если обновление метаданных не помогло, значит битые записи намертво "засели" в регистре сведений РазделыДатЗапретаИзмененияОбъектовБЗК. Удалить их вручную часто мешает признак Предопределенный. Разберем по шагам, как обойти это ограничение с помощью временного расширения.
Создадим расширение (например, "ИсправлениеМетаданных") и добавим в него форму списка регистра РазделыДатЗапретаИзмененияОбъектовБЗК. Затем переопределим процедуру удаления, чтобы система не ругалась на предопределенные элементы:
&НаКлиенте
Процедура Расш1_СписокПередУдалениемВместо(Элемент, Отказ)
Для Каждого ВыделеннаяСтрока Из Элементы.Список.ВыделенныеСтроки Цикл
Если ТипЗнч(ВыделеннаяСтрока) = Тип("РегистрСведенийКлючЗаписи.РазделыДатЗапретаИзмененияОбъектовБЗК") Тогда
ДанныеСтроки = Элементы.Список.ДанныеСтроки(ВыделеннаяСтрока);
// Закомментируем типовой запрет на удаление:
// Если ДанныеСтроки.Предопределенный Тогда
// ПоказатьПредупреждение(, НСтр("ru = 'Нельзя удалять предопределенную настройку'"));
// Отказ = Истина;
// Возврат;
// КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
После применения расширения зайдем в пользовательский режим, откроем регистр и удалим все строки, где объект метаданных начинается с символа вопроса или не определен.
Альтернативный вариант — не удалять данные физически, а программно исключить их из обработки при обновлении. Для этого добавим в расширение процедуру ЗаполнитьИсточникиДанныхДляПроверкиЗапретаИзменения из общего модуля ДатыЗапретаИзмененияПереопределяемый и отфильтруем битые таблицы:
&Вместо("ИсточникиПроверкиДатЗапретаИзменения")
Функция Расш1_ИсточникиПроверкиДатЗапретаИзменения()
// Получим данные типовой функцией
ИсточникиПроверки = ПродолжитьВызов();
// Удалим из полученных данных строки с пустыми таблицами или битыми ссылками
МассивУдаления = Новый Массив;
Для каждого СтрокаТаблицы Из ИсточникиПроверки.ИсточникиДанных Цикл
Если СтрокаТаблицы.Таблица = "" ИЛИ Лев(СтрокаТаблицы.Таблица, 2) = "? " Тогда
МассивУдаления.Добавить(СтрокаТаблицы);
КонецЕсли;
КонецЦикла;
Для каждого Стр Из МассивУдаления Цикл
ИсточникиПроверки.ИсточникиДанных.Удалить(Стр);
КонецЦикла;
Возврат ИсточникиПроверки;
КонецФункции
Для пользователей, которые не хотят писать код расширений, существует метод через типовую обработку "Групповое изменение реквизитов" (доступна через "Функции для технического специалиста").
РазделыДатЗапретаИзмененияОбъектовБЗК.Предопределенный на значение Ложь.Важное дополнение: Если база работает в клиент-серверном варианте, ошибка с неверно указанной таблицей может "застрять" в кэше метаданных сервера 1С. После всех манипуляций с удалением записей обязательно остановите службу Агента сервера 1С, очистите папку сеансовых данных (snccntx в каталоге кластера) и запустите службу заново.
Для файловых баз перед проведением всех действий настоятельно рекомендуем выполнить "Тестирование и исправление" (ТИИ) со сжатием таблиц, а также проверить физический файл 1Cv8.1CD с помощью утилиты chdbfl.exe, установив флаг "Исправлять обнаруженные ошибки".