Надоело вылетать при закрытии обработки с ТабличнымиПолями на SQLiteDataProvider. Стал копаться. Оказалось что база закрывается до того как будут уничтожены все Поставщики и подготовленные запросы.
На уровне 1sqlite не решил, возможно найду как обойти...
Но, пока копался, обновил движок sqlite до 3.22.0 и слегка изменил 1sqlite.
Изменение в 1sqlite такое:
1. База.Закрыть() теперь не процедура, а функция и возвращает 1 в случае успешного закрытия или 0 в том случае если не закрыты ПоставщикиДанных или подготовленные запросы.
2. Зачем это? А затем что База.Открыта() вернет 0 т.к. База.Закрыть() не проверяет закрылась ли она. Поведение База.Открыта() не менял.
Возможно стоит изменить поведение База.Открыта() , но из-за совместности с оригинальной версией оно не менялось.
И когда база закрылась, sqlite очищает wal и shm файлы, а без этого они распухают, и это не есть хорошо.
3. База.Закрыть(ВариантЗакрытия) принимает параметр ВариантЗакрытия 1 (по умолчанию, как и раньше) или 2 и закрывает базу в соответствии с
https://www.sqlite.org/c3ref/close.htmlПараметр 2 скорее для отладки - с ним падает на ТабличномПоле стабильнее, но возможно пригодится в каких-то случаях.
ВК, как всегда, тут:
https://cloud.mail.ru/public/9znr/ZJ6ULE9aRА для удаления Поставщиков в ПриЗакрытии(), чтобы не падало, работает такой код:
Процедура УдалитьПостащиков()
Таблица = СоздатьОбъект("ИндексированнаяТаблица");
Поставщик = СоздатьОбъект("ПоставщикДанныхИТ");
Поставщик.ИндексированнаяТаблица = Таблица;
Информатор=СоздатьОбъект("Информатор");
Свойства=Информатор.ПолучитьТаблицуСвойств(Контекст);
Свойства.ВыбратьСтроки();
Пока Свойства.ПолучитьСтроку() = 1 Цикл
Переменная="";
Сервис.ПолучитьПеременнуюКонтекста(Контекст,Свойства.NameEng,Переменная);
Если ТипЗначенияСтр(Переменная)="ТабличноеПоле" Тогда
Переменная.ПоставщикДанных = Поставщик;
Переменная.ОбновитьСтроки();
Переменная = "";
КонецЕсли;
КонецЦикла;
КонецПроцедуры