Обновление типовой конфигурации «1С:Бухгалтерия предприятия 3.0» — рутинный процесс для любого администратора или программиста 1С. Однако периодически в процессе обновления в режиме «1С:Предприятие» (на этапе выполнения отложенных обработчиков обновления) система аварийно завершает работу. Пользователи сталкиваются с нетипичными ошибками, которые блокируют запуск программы. В этой статье мы подробно разберем две взаимосвязанные проблемы: ошибку инициализации кода конечной точки обмена и ошибку нарушения целостности системы, а также рассмотрим пошаговые алгоритмы их полного устранения.
Рассмотрим природу первой критической ошибки: Значение не является значением объектного типа "Код". Данный сбой происходит в момент выполнения платформой предопределенного обработчика обновления подсистемы обмена данными. Конкретно ошибка локализуется в процедуре ОбменСообщениямиВнутренний.УстановитьКодЭтойКонечнойТочки().
В коде конфигурации выполняется обращение к текущей информационной базе как к узлу обмена:
ЭтаКонечнаяТочка = ОбменСообщениямиВнутренний.ПолучитьЭтуКонечнуюТочку();
ЭтаКонечнаяТочка.Код = Строка(Новый УникальныйИдентификатор());
Если в плане обмена ОбменСообщениями по какой-то причине отсутствует узел с установленным флагом ЭтотУзел (или база была некорректно отвязана от распределенной информационной базы — РИБ), то метод возвращает значение Неопределено. Попытка обратиться к реквизиту Код у пустого объекта и вызывает критическую ошибку обновления.
Вторая сторона этой же проблемы — ошибка Элемент с установленным признаком "ЭтотУзел" уже существует. Это известный баг платформы 1С:Предприятие (активно проявлявшийся на релизах веток 8.3.7 и 8.3.8). При обновлении конфигурации или реструктуризации таблиц СУБД база данных дублирует предопределенный элемент, в результате чего в одной таблице плана обмена появляется два узла с флагом ЭтотУзел = Истина. Сама платформа при этом блокирует любые дальнейшие действия с обменом данными.
Для начала проанализируем состояние планов обмена в нашей информационной базе. Нам необходимо выяснить, в каком именно плане обмена произошло замятие данных. Для этого мы можем запустить внешнюю обработку и выполнить следующий код для поиска дублирующих узлов:
Для Каждого ПланОбмена Из Метаданные.ПланыОбмена Цикл
ИмяПлана = ПланОбмена.Имя;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Таблица.Ссылка КАК Ссылка,
| Таблица.Код КАК Код,
| Таблица.Наименование КАК Наименование
|ИЗ
| ПланОбмена." + ИмяПлана + " КАК Таблица
|ГДЕ
| Таблица.ЭтотУзел = ИСТИНА";
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Если Выборка.Количество() > 1 Тогда
Сообщить("ВНИМАНИЕ! В плане обмена " + ИмяПлана + " обнаружено более одного узла 'ЭтотУзел'!", СтатусСообщения.Важное);
Пока Выборка.Следующий() Цикл
Сообщить("Дубликат: " + Выборка.Ссылка + " | Код: " + Выборка.Код + " | " + Выборка.Наименование);
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если в процессе анализа мы выявили дублирующиеся узлы (например, в плане обмена ОбменСообщениями или УдалениеРегистрацииМиграцииОбъектов), просто так пометить на удаление или удалить лишний узел интерактивно система не позволит. Платформа жестко контролирует целостность этих данных.
Чтобы решить эту проблему, нам необходимо временно отключить платформенные проверки, принудительно сбросить признак ЭтотУзел у некорректного (дублирующего) элемента, после чего удалить его. Выполним следующий алгоритм с помощью внешней обработки:
Процедура СнятьПризнакЭтотУзел(ИмяПланаОбмена, КодНеверногоУзла) Экспорт
// Находим некорректный узел по коду
СсылкаНаУзел = ПланыОбмена[ИмяПланаОбмена].НайтиПоКоду(КодНеверногоУзла);
Если СсылкаНаУзел.Пустая() Тогда
Сообщить("Узел с кодом " + КодНеверногоУзла + " не найден в плане обмена " + ИмяПланаОбмена);
Возврат;
КонецЕсли;
// Получаем объект для редактирования
ОбъектУзла = СсылкаНаУзел.ПолучитьОбъект();
// Включаем режим загрузки для отключения стандартных проверок платформы
ОбъектУзла.ОбменДанными.Загрузка = Истина;
ОбъектУзла.ЭтотУзел = Ложь;
Попытка
ОбъектУзла.Записать();
Сообщить("Признак 'ЭтотУзел' успешно снят для элемента с кодом: " + КодНеверногоУзла);
Исключение
Сообщить("Ошибка при записи узла: " + ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;
КонецПроцедуры;
После того как признак ЭтотУзел успешно переведен в значение Ложь, данный элемент становится обычным узлом обмена. Теперь мы можем стандартными средствами пометить его на удаление и окончательно стереть из информационной базы через обработку «Удаление помеченных объектов».
Важное примечание: Если на удаляемый узел ссылаются другие объекты системы (например, регистры сведений обменов или документы), воспользуйтесь стандартной обработкой с диска ИТС ReplaceWrongThisNodeReferencesAfterTestAndRepair.epf (Замена ссылок на неправильную запись ЭтотУзел). Данная обработка корректно перенесет все связанные записи на легитимный узел и безопасно очистит дубль.
Вторая серьезная проблема, с которой часто сталкиваются администраторы при обновлении конфигурации или переходе на новые версии платформы (начиная с релизов 8.3.11.ХХХХ, 8.3.12.ХХХХ и выше) — внезапное появление сообщения «Ошибка целостности системы». Примечательно, что ошибка может возникать даже на абсолютно чистых базах без данных при попытке запустить их под управлением обновленной платформы.
Выясним причину этого сбоя. Данное поведение программы не связано со структурой метаданных или повреждением таблиц БД. Это результат срабатывания обновленного встроенного механизма защиты платформы «1С:Предприятие» от нелицензионного использования. Начиная с 2021 года, фирма «1С» существенно усилила контроль легальности программного обеспечения. Новые версии платформы сканируют операционную систему на наличие следов использования эмуляторов ключей защиты HASP (таких как Virtual USB Multikey, VUSBus), патчей (измененных файлов библиотек, например, backbas.dll) и остаточных веток в реестре Windows.
Проанализируем шаги по легализации системы и устранению этой ошибки.
Для восстановления работоспособности легальной платформы необходимо полностью вычистить компьютер или сервер от компонентов взлома:
hspinst.exe -purge (если утилита установлена в системе) или удалите устройство вручную через «Диспетчер устройств» (обратите внимание на скрытые устройства в ветке «Контроллеры USB» и системные устройства).regedit и удалите ветки, связанные со старыми эмуляторами:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\NEWHASPHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EmulatorHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\haspdsC:\Program Files\1cv8\имя_релиза\bin\) отсутствуют сторонние файлы библиотек, заменяющие оригинальные компоненты защиты (например, измененный файл backbas.dll). Если вы сомневаетесь в целостности каталога, полностью удалите все установленные версии платформы 1С и установите чистый официальный дистрибутив, скачанный с портала обновлений 1С.Если работа предприятия экстренно заблокирована, а физические аппаратные USB-ключи временно недоступны или файлы программных лицензий утеряны, не следует прибегать к пиратским методам обхода защиты. Фирма «1С» предоставляет возможность абсолютно бесплатно и оперативно получить временные лицензии сроком на 60 дней непосредственно на портале технологической поддержки. Это позволит вам провести корректное обновление баз данных и спокойно восстановить оригинальные лицензии без остановки бизнес-процессов.
Чтобы избежать логического разрушения структуры таблиц при обновлении, выработаем правильный регламент обслуживания базы данных. Большинство ошибок вида «Значение не является значением объектного типа» успешно предотвращаются своевременным проведением процедур проверки целостности. Разберем по шагам этот процесс:
1Cv8.1CD в безопасное место.chdbfl.exe (находится в каталоге bin установленной платформы 1С). Отметьте флаг «Исправлять обнаруженные ошибки» и выполните проверку. Это исправит повреждения на физическом уровне хранения таблиц СУБД.Соблюдение этого регламента и своевременная очистка планов обмена гарантируют стабильный переход «1С:Бухгалтерии 3.0» на любые новые релизы конфигурации и платформы.