Рассмотрим весьма неприятную, но показательную ситуацию, с которой иногда сталкиваются разработчики и администраторы баз данных 1С. После жесткого сбоя сервера и базы данных (например, SQL) часть документов пропадает. Вы восстанавливаете их из резервной копии путем переноса, но затем, при очередном обмене с управленческой базой, эти восстановленные документы снова таинственным образом исчезают или затираются. Вдобавок ко всему, после запуска реструктуризации базы у некоторых документов могут самопроизвольно измениться контрагенты.
Разберем по шагам, почему происходят такие "чудеса", как работают механизмы поиска при обмене и что нужно делать для корректного восстановления работоспособности базы данных.
Проанализируем ситуацию с обменом. Если вы используете нетиповые правила конвертации и переносите данные с помощью универсальной обработки, обратите внимание на то, как настроен поиск существующих объектов.
В рассматриваемом случае разработчик отключил поиск по внутреннему идентификатору (GUID) и настроил поиск по номеру и дате документа. Однако при приведении номера к соответствию отрабатывал кривой алгоритм, который срезал номер документа.
К чему это приводит:
Выясним причину, почему обмен без поиска по GUID опасен после восстановления данных из копий. Когда вы восстанавливаете документы из резервной копии базы путем их выгрузки-загрузки (например, обработкой XML), система 1С генерирует для них новые внутренние идентификаторы (GUID). Даты и номера остаются прежними, но для базы это физически новые объекты.
Если управленческая база (из которой идет загрузка) ведет регистрацию изменений и использует регистры сведений типа СоответствияОбъектовИнформационныхБаз, она опирается на старые GUID. При следующем обмене управленческая база может не найти "свой" старый GUID, посчитать восстановленный вами документ чужим или ошибочным, и применить к нему правило замещения или даже пометки на удаление.
Посмотрим на проблему с другой стороны. Иногда документы после жесткого падения сервера СУБД никуда не пропадают и не удаляются обменом, но они перестают отображаться в журналах документов и списках.
В архитектуре платформы 1С на базе SQL данные самого документа хранятся в одной таблице (например, _DocumentX), а данные для отображения в списках — в таблицах журналов (например, _DocumentJournalY). При внезапном прерывании транзакции во время падения сервера может возникнуть ситуация, когда в таблицу документа данные записались, а в индексы или таблицу журнала — нет.
Чтобы проверить эту гипотезу, можно открыть консоль запросов и выполнить прямой запрос к таблице документа. Если запрос вернет данные, значит документ жив. В таких случаях перенос документов из копии не требуется и даже вреден. Помогает переиндексация.
Рассмотрим подробнее пугающий симптом: после запуска реструктуризации базы программа присвоила документам поступления совершенно других контрагентов. Это говорит о серьезном нарушении ссылочной целостности (образовании "битых ссылок" или смещении данных в таблицах).
При реструктуризации 1С создает в SQL новую пустую таблицу с измененной структурой и копирует туда данные из старой запросом INSERT INTO ... SELECT. Если после сбоя SQL в старой таблице образовались дублирующиеся идентификаторы, записи вида <Объект не найден> или произошло смещение колонок, то при слепом копировании платформа 1С может неверно сопоставить внутренние идентификаторы. В итоге ссылка в реквизите документа начинает указывать на другой GUID в таблице справочника контрагентов.
Также огромную роль играет кэш. Если после сбоя не был очищен кэш метаданных на сервере 1С, платформа может взять искаженную информацию из кэша и применить ее к структуре базы при реструктуризации.
Чтобы избежать подобных проблем с пропаданием документов и "перемешиванием" ссылок, после любого жесткого падения базы с сервером выполните следующие действия строго по порядку:
DBCC CHECKDB), чтобы найти и попытаться устранить физические повреждения страниц памяти в файлах базы данных.Следуя этим правилам, мы минимизируем риск потери данных и нарушения логической структуры базы после любых аппаратных сбоев.