Проблема с дублирующимися ключами в таблице _USERSWORKHISTORY является специфическим сбоем, который часто встречается в файловых базах 1С:Предприятие 8.3. Особенность этой ошибки в том, что стандартные средства восстановления, такие как утилита chdbfl.exe или штатное "Тестирование и исправление" (ТиИ) в Конфигураторе, часто оказываются бессильны. Рассмотрим природу этой таблицы и разберем пошагово все доступные методы исправления ситуации.
Для начала выясним, за что отвечает таблица _USERSWORKHISTORY. Это системная таблица, в которой платформа хранит историю работы пользователей — список "Последних открытых предметов". Она содержит идентификаторы пользователей, URL-адреса объектов, дату доступа и, что самое важное, поле _URLHash (хэш по URL-адресу), изучить которое поможет структура хранения базы данных.
Проанализируем ситуацию: ошибка возникает из-за коллизий в уникальном индексе. В некоторых релизах платформы (особенно в диапазоне 8.3.8 – 8.3.15) алгоритм генерации хэша мог работать некорректно, создавая одинаковые хэши для разных URL-адресов. Поскольку индекс по хэшу уникален, появление двух одинаковых записей блокирует работу базы или вызывает её внезапное закрытие. Хорошая новость заключается в том, что данные в этой таблице не являются учетными (бухгалтерскими), и их полная очистка никак не повлияет на баланс или документы.
Самый простой и безопасный метод, который мы рекомендуем попробовать в первую очередь — это использование штатных механизмов платформы для удаления записей на логическом уровне. Создадим внешнюю обработку и выполним код, который очистит проблемную таблицу:
// Очистка истории работы всех пользователей
ИсторияРаботыПользователя.Очистить();
После выполнения этого кода попробуем снова запустить "Тестирование и исправление" с установленной галочкой "Реиндексация таблиц информационной базы". В большинстве случаев платформа сама перестроит индексы, очистка хранилища настроек пользователей также может помочь стабилизировать систему, и ошибка chdbfl исчезнет.
Если база файловая и программная очистка не помогла, рассмотрим вариант временного перехода на клиент-серверный вариант (SQL). Это позволит нам применить мощные инструменты СУБД для исправления структуры. Разберем шаги:
.dt.DBCC CHECKTABLE, предварительно изучив инструкцию по настройке регламентных операций MS SQL SERVER под 1С.Для начала выполним проверку без исправлений, чтобы увидеть масштаб проблемы, а также проанализируем SQL сервер глазами 1С-ника:
DBCC CHECKTABLE (_UsersWorkHistory)
Если ошибки подтверждены, выполним исправление с возможной потерей данных (в данном случае это безопасно, так как мы теряем только историю открытых окон):
DBCC CHECKTABLE (_UsersWorkHistory, repair_allow_data_loss)
После выполнения команды SQL принудительно удалит дублирующиеся записи. Затем мы сможем выгрузить базу обратно в .dt и вернуть её в файловый вариант.
В ситуациях, когда база остается файловой и нет возможности использовать SQL, нам помогут утилиты для прямого редактирования файла .1CD. Проанализируем возможности инструментов Tool1CD или библиотеки 1CDLib. Эти инструменты позволяют работать с таблицами базы данных как с отдельными объектами.
Рассмотрим последовательность действий:
1Cv8.1CD._USERSWORKHISTORY.Важно: При использовании 1CDLib можно программно пройтись по записям и удалить только те, где дублируется _URLHash, но полная очистка таблицы технически проще и надежнее.
Если стандартное ТиИ не справляется, а лезть в структуру файла страшно, применим метод "чистого переноса". Поскольку ошибка сидит в системной таблице, которая не является объектом метаданных (справочником или документом), она не переносится стандартной обработкой "Выгрузка и загрузка данных XML".
Выполним следующие шаги:
Таким образом, мы получим идентичную базу, но с абсолютно чистой и исправной таблицей _USERSWORKHISTORY, так как история работы пользователей при таком переносе не сохраняется.
Выясним, как предотвратить повторение проблемы. Поскольку корень зла часто кроется в механизмах индексации конкретных релизов платформы, необходимо выполнить следующие действия:
%AppData%\1C\1Cv8\..1CD.Подводя итог, отметим: ошибка в _USERSWORKHISTORY неприятна тем, что мешает нормальной работе, но она не угрожает целостности вашего учета. Использование программной очистки ИсторияРаботыПользователя.Очистить() — это наиболее "цивилизованный" метод, к которому стоит прибегать в первую очередь.