Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Временные таблицы в запросе не удаляются автоматически (число прочтений - 1512 )
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Временные таблицы в запросе не удаляются автоматически
25. Апреля 2019 :: 08:38
Печать  
Добрый день.
Использую в прямых запросах временные таблицы. Не всегда эти таблицы уничтожаются автоматически. В чем может быть причина?

Система Windows Server 2008 R2
1С 7.7 (dbf)
1С++ 3.2.4.1

Пример запроса

1. Формирование временной таблицы
ТекстЗапроса="
                 |SELECT
                 |      id AS [Контрагент $Справочник.Контрагенты]
                 |FROM $Справочник.Контрагенты as Спр WHERE isfolder=2";
                 Для Ном=1 По СтрКоличествоСтрок(РазбиваемаяСтрокаПоИмени) Цикл
                       Слово=СтрПолучитьСтроку(РазбиваемаяСтрокаПоИмени,Ном);
                       Если ПустоеЗначение(Слово)=0 Тогда
                             ТекстЗапроса=ТекстЗапроса+"
                             |AND LOWER(descr) LIKE '"+Слово+"'";
                       КонецЕсли;
                 КонецЦикла;                                                   
                 Попытка 
                       ПромТЗ_1=БыстрыйЗапрос.ВыполнитьИнструкцию(ТекстЗапроса);   
                       ПромТЗ_1.Выгрузить(СписокКонтрагентов,,,"Контрагент");
                       Если СписокКонтрагентов.РазмерСписка()=0 Тогда
                             Предупреждение("Отсутствуют документы удовлетворяющие условию по контрагенту");
                             Возврат;
                       КонецЕсли;      
                       ИмяТаблицы="";
                       ;
                 Исключение
                       Сообщить("1 - "+ОписаниеОшибки());
                 КонецПопытки;

2. Использование временной таблицы
ТекстЗапроса="
           |SELECT
           |      Жур.IDDoc as [Док $Документ."+ВидДокумента+"]";
           Если ЕстьКонтрагент=Да Тогда
                 ТекстЗапроса=ТекстЗапроса+",
                 |      $Док.Контрагент as [Контрагент $Справочник.Контрагенты]";
           КонецЕсли;                         
           ТекстЗапроса=ТекстЗапроса+"
           |FROM
           |      1SJourn as Жур
           |INNER JOIN
           |      $Документ."+ВидДокумента+" as Док ON Док.IDDoc = Жур.IDDoc
           |WHERE
           |      Жур.Date BETWEEN :ДатаЗап1~~ AND :ДатаЗап2~~";
           Если СокрЛП(СтрокаФильтраПоНомеру)<>"" Тогда
                 Если Лев(СокрЛП(СтрокаФильтраПоНомеру),1)<>"%" Тогда
                       РазбиваемаяСтрокаПоНомеру="%"+СокрЛП(СтрокаФильтраПоНомеру);
                 КонецЕсли;
                 Если Прав(СокрЛП(СтрокаФильтраПоНомеру),1)<>"%" Тогда
                       РазбиваемаяСтрокаПоНомеру=СокрЛП(РазбиваемаяСтрокаПоНомеру)+"%";
                 КонецЕсли;   
                 РазбиваемаяСтрокаПоНомеру=СтрЗаменить(Нрег(СокрЛП(РазбиваемаяСтрокаПоНомеру))," ","%"+РазделительСтрок+"%");
                 РазбиваемаяСтрокаПоНомеру=СтрЗаменить(РазбиваемаяСтрокаПоНомеру,"'","''");       
                 Для Ном=1 По СтрКоличествоСтрок(РазбиваемаяСтрокаПоНомеру) Цикл
                       Слово=СтрПолучитьСтроку(РазбиваемаяСтрокаПоНомеру,Ном);
                       Если ПустоеЗначение(Слово)=0 Тогда
                             ТекстЗапроса=ТекстЗапроса+"
                             |AND LOWER(Жур.DocNo) LIKE '"+Слово+"'";
                       КонецЕсли;
                 КонецЦикла;
           КонецЕсли;      
           Если ЕстьКонтрагент=Да Тогда
                 Если СписокКонтрагентов.РазмерСписка()<>0 Тогда
                       ТекстЗапроса=ТекстЗапроса+"
                       |AND ($Док.Контрагент IN (SELECT Val FROM "+ИмяТаблицы+"))";   
                 КонецЕсли;
           КонецЕсли;      
           БыстрыйЗапрос.УстановитьТекстовыйПараметр("ДатаЗап1",ДатаНачала);
           БыстрыйЗапрос.УстановитьТекстовыйПараметр("ДатаЗап2",ДатаКонца);
           Попытка 
                 //БыстрыйЗапрос.Отладка(1);
                 ТЗРезультата=БыстрыйЗапрос.ВыполнитьИнструкцию(ТекстЗапроса);
           Исключение
                 Сообщить("2 - "+ОписаниеОшибки());
           КонецПопытки;
  
Наверх
 
IP записан
 
Sserj
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 25. Октября 2010
Re: Временные таблицы в запросе не удаляются автоматически
Ответ #1 - 25. Апреля 2019 :: 09:11
Печать  
А они вообще автоматически не уничтожаются, только при завершении сессии на SQL сервере, тобишь после закрытия 1С.
  
Наверх
 
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Временные таблицы в запросе не удаляются автоматически
Ответ #2 - 25. Апреля 2019 :: 18:29
Печать  
Так в том то и дело - не удаляются и при закрытии 1С
  
Наверх
 
IP записан
 
Sserj
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 25. Октября 2010
Re: Временные таблицы в запросе не удаляются автоматически
Ответ #3 - 26. Апреля 2019 :: 00:38
Печать  
В приведенном примере нет УложитьСписокЗначений и ИмяТаблицы не показано как задается.
Ну и вообще можно просто самому для однозначности сбрасывать:
ТекстЗапроса = "
|IF EXISTS(SELECT * FROM tempdb..sysobjects WHERE id = object_id('tempdb.."+ИмяТаблицы+"'))
|      DROP TABLE "+ИмяТаблицы;
Запрос.Выполнить(ТекстЗапроса);
  
Наверх
 
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Временные таблицы в запросе не удаляются автоматически
Ответ #4 - 27. Апреля 2019 :: 07:10
Печать  
База dbf и имя таблицы генерируется автоматически. УложитьСписок я просто упустил - понятно что он есть между запросами. Таблицы (фактически файлы dbf) создаются в каталоге базы данных. Удалять их не получается в ПриЗаверешнииРаботыСистемы - таблицы созданные в текущем сеансе "держатся" 1С. И они же НЕ удаляются после закрытия программы.
Есть конечно вариант - при старте удалять то что можно удалить. Но в системе работает одновременно до 10 пользователей которые активно пользуются этими запросами для отбора документов по контрагенту и номеру.
  
Наверх
 
IP записан
 
Sserj
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 25. Октября 2010
Re: Временные таблицы в запросе не удаляются автоматически
Ответ #5 - 27. Апреля 2019 :: 08:21
Печать  
Ну вот как много интересных подробностей.
Может в таком случае обычный Закрыть() у запроса поможет, что обычно забывается и при этом все временные наборы освобождаются.
  
Наверх
 
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Временные таблицы в запросе не удаляются автоматически
Ответ #6 - 29. Апреля 2019 :: 17:20
Печать  
То что база dbf я написал в теме ветки.
что за метод "Закрыть()"? какого объекта? в описании прямых запросов такого метода нет
  
Наверх
 
IP записан
 
Sserj
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 25. Октября 2010
Re: Временные таблицы в запросе не удаляются автоматически
Ответ #7 - 30. Апреля 2019 :: 01:10
Печать  
ну как это не нашел.
Закрыть / Close - есть как у ODBCRecordSet так и у ODBCDataBase.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать