При обновлении типовых конфигураций (таких как Управление торговлей 11.4, Комплексная автоматизация 2.4 или ERP) специалисты часто сталкиваются с неприятной ситуацией. В самом конце процесса, когда выполняются отложенные обработчики обновления в режиме «1С:Предприятие», система выдает критическую ошибку: Работа с таблицей невозможна. Структура таблицы несовместима с текущими расширениями конфигурации. Чаще всего это происходит при вызове метода ПланыОбмена.УдалитьРегистрациюИзменений(Выборка.Узел) в модуле Обработка.РезультатыОбновленияПрограммы.
Эта проблема характерна для платформы 8.3.12–8.3.15, но может встречаться и на более свежих релизах. Давайте подробно разберем, почему это происходит и как нам вместе решить эту задачу, сохранив данные в расширениях.
Проанализируем ситуацию: в процессе обновления конфигурация базы данных меняется. Платформа 1С пытается реструктуризировать таблицы СУБД. Если в вашей базе подключены расширения, которые заимствуют объекты (справочники, документы) или добавляют в них собственные реквизиты, возникает конфликт. Платформа не может корректно сопоставить новую структуру основной таблицы и ту «надстройку», которую создает расширение. Особенно остро это проявляется, когда обновление затрагивает Определяемые типы или служебные планы обмена, такие как ОбновлениеИнформационнойБазы.
Первым делом рассмотрим самый простой, но часто забываемый шаг. Многие администраторы отключают расширения перед обновлением, считая, что это поможет избежать ошибок. Однако, если расширение добавляет новые реквизиты, его отключение может привести к тому, что обработчики обновления не увидят нужную структуру данных.
Выполним следующие действия в конфигураторе:
Разберем ситуацию, которая встречается наиболее часто. В расширение часто заимствуются Определяемые типы, например, ВладелецДополнительныхСведений или ОбъектСДополнительнымиРеквизитами. В новой версии «Управления торговлей» фирма «1С» может расширить состав этих типов (добавить в них новые справочники или документы).
Если в вашем расширении остался старый состав Определяемого типа, возникает конфликт на уровне SQL-таблиц. Посмотрим, как это исправить:
Если расширение содержит много заимствованных форм и методов, попробуем стратегию «облегчения». Нам нужно оставить в расширении только те объекты, которые физически хранят данные, чтобы не потерять их, и временно убрать декоративные изменения. Для быстрого выявления таких объектов подойдёт обработка для поиска заимствованных форм в расширениях.
Проанализируем шаги:
.cfe).<< (заимствованные без изменений), если они не связаны с логикой ваших собственных реквизитов.В некоторых случаях ошибка возникает в конкретной процедуре обновления, которая пытается очистить регистрацию изменений в планах обмена. Рассмотрим пример кода из сообщения автора, где происходит падение:
Если Не (СтандартныеПодсистемыПовтИсп.ИспользуетсяРИБ("СФильтром") И ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ) Тогда
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ОбновлениеИнформационнойБазы.Ссылка КАК Узел ИЗ ПланОбмена.ОбновлениеИнформационнойБазы КАК ОбновлениеИнформационнойБазы ГДЕ НЕ ОбновлениеИнформационнойБазы.ЭтотУзел";
Выборка = Запрос.Выполнить.Выбрать;
Пока Выборка.Следующий Цикл
ПланыОбмена.УдалитьРегистрациюИзменений(Выборка.Узел); // Ошибка происходит здесь
КонецЦикла;
КонецЕсли;
Если мы уверены, что структура данных в порядке, но метод УдалитьРегистрациюИзменений блокируется расширением, мы можем временно переопределить это поведение. Создадим в расширении процедуру-перехватчик с аннотацией &Вместо для проблемного метода. Внутри используем конструкцию Попытка...Исключение:
&Вместо("НазваниеПроцедурыОбновления")
Процедура Имя_НазваниеПроцедурыОбновления(Параметры)
Попытка
// Вызываем оригинальную логику или пропускаем проблемный участок
ПродолжитьВызов(Параметры);
Исключение
ЗаписьЖурналаРегистрации("Обновление", УровеньЖурналаРегистрации.Предупреждение, , , "Пропущена очистка регистрации изменений");
КонецПопытки;
КонецПроцедуры
Этот метод позволит обновлению «пройти» до конца, после чего вы сможете вручную почистить регистрацию в плане обмена ОбновлениеИнформационнойБазы через стандартную обработку «Регистрация изменений для обмена данными».
Иногда ошибка является «фантомной» и вызвана некорректным кэшем сервера 1С. Проанализируем дополнительные действия, которые стоит выполнить, если вышеперечисленные способы не помогли:
1C:Enterprise Server, удалите содержимое папок snccntx и config в каталоге описания информационной базы на сервере.ТиИ с флагом «Реструктуризация таблиц информационной базы». Это заставит платформу физически пересоздать таблицы СУБД в соответствии с текущим набором метаданных (основная конфигурация + расширения).Резюмируем: основной путь решения — это приведение Определяемых типов в расширении в соответствие с новой версией основной конфигурации и обязательная проверка того, что расширение успешно применяется (активно) в момент выполнения отложенных обработчиков обновления.