Kuzevich

Kuzevich

Попалась мне база писем для Outlook, настроенная через MDaemon Outlook Connector.
Проблема была в том что Outlook перестал открываться. Оказалось что данный файл базы поврежден. Сам файл представляет собой хранилище SQLite3

Для того чтобы работать с базой SQLite3 нужно скачать исполняемые файлы, SQLite3-tools отсюда: https://www.SQLite3.org/download.html на момент написания статьи это SQLite3-tools-win32-x86-3420000.zip

При открытии базы средствами SQLite3 и попытке с ней что-то сделать появляется ошибка:

/****** CORRUPTION ERROR *******/
/****** database disk image is malformed ******/
/****** ERROR: near "ORDER": syntax error ******/
/**** ERROR: (11) database disk image is malformed *****/

Есть программы для восстановления, например SQLite Database Recovery, но они платные, а бесплатных аналогов я, к сожалению, не нашел!

Поэтому решил дествовать вручную.

При попытке сделать восстановить через dump, способами описанными здесь https://infostart.ru/1c/articles/402536/ , здесь https://stackoverflow.com/questions/18259692/how-to-recover-a-corrupt-SQLite3-database и здесь https://mobi-c.ru/help/error2.htm появляется та же самая ошибка.

В итоге помогла команда ".recover"

SQLite3.exe LocalCache.db ".recover" >> LocalCache.sql

А затем загрузка полученного дампа в новый файл базы данных

SQLite3.exe LocalCache_new.db < LocalCache.sql

Полученным восстановленным файлом подменяем файл который лежал в папке Outlook'a и все заработало!

db = Новый COMобъект("V83.COMConnector");
Попытка 
	соединение= db.Connect(СтрокаПодключения);
Исключение
	сообщить("база не открыта");
	Предупреждение(ОписаниеОшибки());
	Возврат ложь;
КонецПопытки;


НоваяНоменклатура=Справочники.Номенклатура.НайтиПоКоду("ВашКод");

GUID = НоваяНоменклатура.УникальныйИдентификатор();
GUIDCom  = соединение.NewObject("УникальныйИдентификатор", Строка(GUID)); 
НоменклатураСсылкаCom = ТекПодключение.Справочники.Номенклатура.ПолучитьСсылку(GUIDCom);

НовКартинкаОбъект = Соединение.Справочники.ХранилищеДополнительнойИнформации.СоздатьЭлемент();

НовКартинкаОбъект.Объект = НоменклатураСсылкаCom;
НовКартинкаОбъект.Наименование = НоваяНоменклатура.ОсновноеИзображение.Наименование;
НовКартинкаОбъект.ВидДанных = Соединение.Перечисления.ВидыДополнительнойИнформацииОбъектов.Изображение;
НовКартинкаОбъект.ИмяФайла = НоваяНоменклатура.ОсновноеИзображение.ИмяФайла;
	  
Картинка=НоваяНоменклатура.ОсновноеИзображение.Хранилище.Получить();
Двоичные        = Картинка.ПолучитьДвоичныеДанные();
ДвоичныеСтрокой    = Base64Строка(Двоичные);
ДвоичныеCOM        = Соединение.Base64Значение(ДвоичныеСтрокой);
МояКартинкаCOM  = Соединение.NewObject("Картинка",ДвоичныеCOM);
НовКартинкаОбъект.Хранилище = Соединение.NewObject("ХранилищеЗначения",МояКартинкаCOM);
		   
НовКартинкаОбъект.Записать();

Старенький слабенький компьютер после перепроведения центральной базы не смог принять файл обмена с сообщением "не недостаточно памяти". После него программа вылетала.

Помогло ограничение на количество объектов в транзакции (я поставил 100)

Официальный ответ техподдержки:

роботы VK ходят с таким заголовком: Mozilla/5.0 (compatible; VKRobot/1.0)
ip адреса всегда могут измениться, на них лучше не ориентироваться, примерный список можно получить тут:
https://bgp.he.net/search?search%5Bsearch%5D=vkontakte&commit=Search