Иногда после удачно/не совсем удачного обновления базы данных, при следующем входе, мы получаем эту ошибку. Кому-то помогает чистка кеша, кто-то подменяет целиком таблицу config на корректную из копии и ряд других таблиц. Получив такую ошибку я решил найти причину из-за которой система не смогла открыть конфигурацию.
Действия по шагам:
- Очищаем кеш конфигурации на клиенте. Это заставит конфигуратор получить данные из базы;
- Запускаем SQL Server Profiler в котором настраиваем сбор всех запросов отправляемых базе, соответственно с фильтром по нужной базе;
- Запускаем сбор данных профайлером и открываем конфигурацию;
- Как только получаем ошибку профайлер останавливаем;
- Самый последний запрос будет к битым данным. Выглядеть он должен примерно так:
exec sp_executesql N'SELECT Creation,Modified,Attributes,DataSize,BinaryData FROM Config WHERE FileName = @P1 ORDER BY PartNo',N'@P1 nvarchar(128)',N'9ca28693-c6ea-42fd-8902-84d9b5abd962'
- Дальше все просто, переносим корректные данные из нормальной базы в битую:
delete from [Битая].dbo.Config where PartNo = 0 and FileName = N'9ca28693-c6ea-42fd-8902-84d9b5abd962'; insert into [Битая].dbo.Config SELECT * FROM [Нормальная].dbo.Config WHERE PartNo = 0 and FileName = N'9ca28693-c6ea-42fd-8902-84d9b5abd962'
- ВАЖНО! Подобного рода манипуляции могут привести к потере некоторых изменений, например можно потерять строки кода, элементы на форме и т.п. в зависимости от того какой объект восстанавливаем;
- На этом можно остановиться, но если вы хотите узнать кто этот проблемный объект то нужно получить его данные;
- Для получения данных можно воспользоваться запросом:
select *,cast(DECOMPRESS(0x1F8B0800000000000400 + BinaryData)as varchar(max)) as TextD from dbo.[Config] where filename like '9ca28693-c6ea-42fd-8902-84d9b5abd962' +'%'
- То, что нас интересует, находится в поле TextD:
{1, {0, {13, {2, {1,0,9ca28693-c6ea-42fd-8902-84d9b5abd962},"ФормаДокумента", {1,"ru","Форма документа"},"",0,1,32e087ab-1491-49b6-aba7-43571b41ac2b,3,00000000-0000-0000-0000-000000000000},0,0, {2, {"#",1708fdaa-cbce-4289-b373-07a5a74bee91,1}, {"#",1708fdaa-cbce-4289-b373-07a5a74bee91,2} } } },0}
- Теперь нам надо привести это в читабельный вид, это можно сделать любым онлайн декодером кодировок, например Декодер. В итоге получим:
A533; {1, A533;{0, A533;{13, A533;{2, A533;{1,0,9ca28693-c6ea-42fd-8902-84d9b5abd962},"ФормаДокумента", A533;{1,"ru","Форма документа"},"",0,1,32e087ab-1491-49b6-aba7-43571b41ac2b,3,00000000-0000-0000-0000-000000000000},0,0, A533;{2, A533;{"#",1708fdaa-cbce-4289-b373-07a5a74bee91,1}, A533;{"#",1708fdaa-cbce-4289-b373-07a5a74bee91,2} A533;} A533;} A533;},0}
- Становится понятно, что это форма какого-то документа.
- Запрос из пункта 9ть вернул нам две строки: 9ca28693-c6ea-42fd-8902-84d9b5abd962 и 9ca28693-c6ea-42fd-8902-84d9b5abd962.0.
- 9ca28693-c6ea-42fd-8902-84d9b5abd962.0 - это сама форма. Чтобы получить ее код проделываем операции 10 и 11. В результате получим исходный код формы по которому можно найти эту форму в конфигураторе и убедиться, что с ней все в порядке, либо привести ее к надлежащему состоянию.
Надеюсь, эта краткая памятка поможет вам сэкономить время на решение этой ошибки.