Как исправить ошибку "неверно указана таблица" в модуле ДатыЗапретаИзмененияПереопределяемый при обновлении 1С?

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

При обновлении конфигураций 1С (например, 1С:Зарплата и Управление Персоналом) на актуальный релиз разработчики и администраторы часто сталкиваются с прерыванием процесса обработчиков обновления. В журнале регистрации или окне предприятия появляется сообщение вида:

"Ошибка в процедуре ЗаполнитьИсточникиДанныхДляПроверкиЗапретаИзменения общего модуля ДатыЗапретаИзмененияПереопределяемый. Для проверки запрета изменения в источнике данных неверно указана таблица '? Документ.ЗавершениеИспытательногоСрока (664b3f02-77ce-11e8-a134-00155d465601)'".

Давайте подробно разберем, откуда берется эта ошибка, проанализируем причины появления фантомных объектов метаданных и рассмотрим проверенные на практике способы решения этой проблемы.

Выясним причину появления ошибки

Если внимательно посмотреть на текст ошибки, мы увидим символ вопроса перед названием объекта: ? Документ.ЗавершениеИспытательногоСрока. В платформе 1С:Предприятие этот символ означает "битую" ссылку. Обычно в пользовательском режиме такие ссылки отображаются как <Объект не найден> с указанием уникального идентификатора (GUID).

Почему это происходит? Проанализируем типичные ситуации:

  1. Некорректное удаление расширений: Если в базу было добавлено расширение, создающее новые документы или справочники, и эти объекты были включены в подсистему дат запрета изменения, то после простого удаления расширения записи в служебных регистрах остаются. Платформа пытается найти таблицу удаленного объекта, но ее больше не существует в структуре метаданных.
  2. Загрузка данных из другой базы или слияние баз: При переносе данных (например, при слиянии двух информационных баз) в регистры могут попасть записи об объектах, которых физически нет в текущей конфигурации.

Способ 1. Обновление идентификаторов метаданных через параметры запуска

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

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

  1. Откроем свойства запуска информационной базы.
  2. В поле дополнительных параметров запуска пропишем: /C ОбновитьИдентификаторыОбъектовМетаданных или /C ЗапуститьОбновлениеИнформационнойБазы.
  3. Запустим базу. Платформа в фоновом режиме перестроит справочник и корректно удалит или восстановит связи.

Кроме того, для гарантированного исправления можно использовать типовую обработку от фирмы 1С "Обновление Идентификаторов Объектов Метаданных" (доступна на портале ИТС), которая предназначена для безопасного устранения подобных рассинхронов.

Способ 2. Очистка регистра дат запрета с помощью расширения конфигурации

Если обновление метаданных не помогло, значит битые записи намертво "засели" в регистре сведений РазделыДатЗапретаИзмененияОбъектовБЗК. Удалить их вручную часто мешает признак Предопределенный. Разберем по шагам, как обойти это ограничение с помощью временного расширения.

Создадим расширение (например, "ИсправлениеМетаданных") и добавим в него форму списка регистра РазделыДатЗапретаИзмененияОбъектовБЗК. Затем переопределим процедуру удаления, чтобы система не ругалась на предопределенные элементы:


&НаКлиенте
Процедура Расш1_СписокПередУдалениемВместо(Элемент, Отказ)
    Для Каждого ВыделеннаяСтрока Из Элементы.Список.ВыделенныеСтроки Цикл
        Если ТипЗнч(ВыделеннаяСтрока) = Тип("РегистрСведенийКлючЗаписи.РазделыДатЗапретаИзмененияОбъектовБЗК") Тогда
            ДанныеСтроки = Элементы.Список.ДанныеСтроки(ВыделеннаяСтрока);
            // Закомментируем типовой запрет на удаление:
            // Если ДанныеСтроки.Предопределенный Тогда
            //     ПоказатьПредупреждение(, НСтр("ru = 'Нельзя удалять предопределенную настройку'"));
            //     Отказ = Истина;
            //     Возврат;
            // КонецЕсли;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

Способ 3. Перехват заполнения источников данных в коде

Альтернативный вариант — не удалять данные физически, а программно исключить их из обработки при обновлении. Для этого добавим в расширение процедуру ЗаполнитьИсточникиДанныхДляПроверкиЗапретаИзменения из общего модуля ДатыЗапретаИзмененияПереопределяемый и отфильтруем битые таблицы:


&Вместо("ИсточникиПроверкиДатЗапретаИзменения")
Функция Расш1_ИсточникиПроверкиДатЗапретаИзменения()
    // Получим данные типовой функцией
    ИсточникиПроверки = ПродолжитьВызов();
    
    // Удалим из полученных данных строки с пустыми таблицами или битыми ссылками
    МассивУдаления = Новый Массив;
    Для каждого СтрокаТаблицы Из ИсточникиПроверки.ИсточникиДанных Цикл
        Если СтрокаТаблицы.Таблица = "" ИЛИ Лев(СтрокаТаблицы.Таблица, 2) = "? " Тогда
            МассивУдаления.Добавить(СтрокаТаблицы);
        КонецЕсли;
    КонецЦикла;
    
    Для каждого Стр Из МассивУдаления Цикл
        ИсточникиПроверки.ИсточникиДанных.Удалить(Стр);
    КонецЦикла;
    
    Возврат ИсточникиПроверки;
КонецФункции

Способ 4. Использование универсальных обработок и очистка кэша

Для пользователей, которые не хотят писать код расширений, существует метод через типовую обработку "Групповое изменение реквизитов" (доступна через "Функции для технического специалиста").

  1. Откроем обработку и выберем регистр РазделыДатЗапретаИзмененияОбъектовБЗК.
  2. В дополнительных параметрах включим режим разработчика (чтобы отображались служебные реквизиты).
  3. Настроим отбор по проблемным (битым) записям.
  4. Изменим реквизит Предопределенный на значение Ложь.
  5. После этого проблемные записи можно будет удалить стандартными средствами конфигурации.

Важное дополнение: Если база работает в клиент-серверном варианте, ошибка с неверно указанной таблицей может "застрять" в кэше метаданных сервера 1С. После всех манипуляций с удалением записей обязательно остановите службу Агента сервера 1С, очистите папку сеансовых данных (snccntx в каталоге кластера) и запустите службу заново.

Для файловых баз перед проведением всех действий настоятельно рекомендуем выполнить "Тестирование и исправление" (ТИИ) со сжатием таблиц, а также проверить физический файл 1Cv8.1CD с помощью утилиты chdbfl.exe, установив флаг "Исправлять обнаруженные ошибки".

← На главную