Переключение на Главную Страницу Страницы: 1 ... 6 7 [8] 9 10 ... 60 ОтправитьПечать
Очень популярная тема (более 25 ответов) Класс "ПрямойЗапрос" (число прочтений - 305078 )
undo
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 53
Местоположение: Ульянвоск
Зарегистрирован: 25. Декабря 2008
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #105 - 03. Августа 2009 :: 19:52
Печать  
Вот пример статистики:

проведение в неоперативном режиме:
кол-во документов: 703
1. старая схема: (фильтрация регистра расчет итогов)
время нач: 21.38.48
время кон: 22.19.50
41 мин.
2. новая схема:
 время нач: 22.31.27
 время кон: 22.52.32
 21 мин.

тест проводился в разделённом режиме работы.
Статистика на лицо.

объем dbf файлов 2,6 ГБ.
  
Наверх
ICQ  
IP записан
 
viddik
Junior Member
**
Отсутствует



Сообщений: 37
Зарегистрирован: 22. Октября 2008
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #106 - 04. Августа 2009 :: 02:37
Печать  
vandalsvq писал(а) 03. Августа 2009 :: 15:07:
Оговорюсь сразу использование ВТ ОстаткиОбороты (далее речь идет про DBF, для SQL там совсем другая песня) - это точно не самый рациональный путь, там идет получение ИТЗ по остаткам и оборотам в модуль КОП для пересчета итогов на начало и конец периода. При этом потом результат загоняется внутрь SQLite в временную таблицу с целью ее дальнейшего использования. По сути именно на пересчете очень много теряется времени.
Конечно много времени уходит на обработку запроса, поэтому я согласен что нужен бы механизм параметризированных запросов, хотя иногда для этих целей я использую флаг БезПодготовки = 1 (метод ВыполнитьЗапрос), помогает.
Что касается запросов с параметрами аля ODBC, я исследую данный вопрос в SQLite, и наверное что-нить найду. Давненько я в нем не копался Улыбка

Все таки ОстаткиОбороты в проведении нужны гораздо реже, чем просто остатки. А в SQL кстати, если не ошибаюсь, при проведении не рекомендовано использовать и "родные" 1с++ виртуальные таблицы?
А как можно использовать флаг БезПодготовки, если нужно установить текстовые параметры? Или я не догоняю просто схему работы в данном случае?
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #107 - 04. Августа 2009 :: 04:37
Печать  
На счет Остатки. Как мы уже выяснили на ТА получать остатки выгрузкой итогов посредством например объекта "Регистр.ХХХ" будет почти одинаково с прямым запросом если даже не чуточку быстрее. Если же остатки нужны не на ТА то однозначно прямой запрос выигрывает у 1С причем очень значительно.
Использовать ВТ в проведении или нет. Препятствий не вижу Улыбка.
Флаг БезПодготовки я использую в основном для запросов вид которых не зависит SQL это или SQLite и если нет в нем параметров для установки. Конечно для реальных запросов - это достаточно редкая ситуация.  Улыбка
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
viddik
Junior Member
**
Отсутствует



Сообщений: 37
Зарегистрирован: 22. Октября 2008
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #108 - 04. Августа 2009 :: 07:20
Печать  
По совету автора КОПа использовал в модуле проведения ключевые слова в английском написании (SELECT, FROM) вместо (ВЫБРАТЬ, ИЗ). Тока встроенные функции все же рекомендуется писать по-русски, как и слово ПЕРВЫЕ... Ну мне они пока не понадобились. И все залетало, что и требовалось доказать! Огромное спасибо vandalsvq!
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #109 - 04. Августа 2009 :: 10:43
Печать  
Кстати советую обратить внимание на скрипт для OpenConf - ExtDD, позволяющий править DD файлы для создания собственных индексов.
См. тут - http://www.1cpp.ru/forum/YaBB.pl?num=1188387114/11#11
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #110 - 05. Августа 2009 :: 16:49
Печать  
В конструкторе последнюю строку нужно бы записать через попытку, т. к. функция ПолучитьДатуТА() не работает при отключенном оперативном учете.
Предлагаю ее изменить на
Код
Выбрать все
	Попытка
		ДатаТА = ПолучитьДатуТА();
	Исключение
		ДатаТА = РабочаяДата();
	КонецПопытки;
 

  
Наверх
 
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #111 - 06. Августа 2009 :: 16:39
Печать  
Сегодня наткнулся - оказывается, прямой запрос не поддерживает правое соединение.. Понятно, что вместо него без проблем можно использовать левое соединение, но все же - не поддерживаетУлыбка

Спасибо за скрипт - редактор DDS. Это просто мегарулез Смех
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #112 - 06. Августа 2009 :: 17:19
Печать  
classic писал(а) 06. Августа 2009 :: 16:39:
Сегодня наткнулся - оказывается, прямой запрос не поддерживает правое соединение.. Понятно, что вместо него без проблем можно использовать левое соединение, но все же - не поддерживаетУлыбка

Спасибо за скрипт - редактор DDS. Это просто мегарулез Смех


Кстати на счет правого соединения вроде писал в документации. Не поддерживает поскольку его не поддерживает SQLite. Впрочем на самом деле согласен что оно (правое) по большому счету не очень надо.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #113 - 06. Августа 2009 :: 17:22
Печать  
Счас реализовал ВТ БИОстатки для DBF базы данных. Обнаружил что если добавить один индекс DATE[,PLANID][,SP54836],KIND,ACCID к таблице 1sbkttl, то получение остатков намного лучше работает (по большому счету такой большой составной индекс в единственном числе на данной таблице мне не совсем понятно зачем сделан. При этом на таблице проводки этих индексов может быть хоть зажрись).
Буду тестировать дальше. Пока не очень нравится скорость работы. Для SQL скорее всего с небольшими изменениями возьму из AccountRecordset если конечно тов. berezdetsky не против будет.

Пы.сы. кстати мне так и не разу и не удалось "обогнать" 1С на получении бух. итогов без учета субконто. Зато с учетом субконто она проигрывает почти всегда (речь идет об SQLite).
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
undo
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 53
Местоположение: Ульянвоск
Зарегистрирован: 25. Декабря 2008
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #114 - 07. Августа 2009 :: 00:14
Печать  
"SELECT
     |      $Жур.ТекущийДокумент КАК [ТекДок $Документ.РасходнаяНакладная],
     |      $Жур.ВидДокумента КАК [ТекущийДокумент_вид $ВидДокумента],
     |      $Жур.ДатаДокумента КАК [ДатаДокумента $Дата],
     |      $Жур.ПометкаУдаления КАК ПометкаУдаления,
     |      $Жур.Проведен КАК Проведен
     |ИЗ
     |      ЖурналДокументов КАК Жур
     |WHERE
     |    $Жур.ДатаДокумента BETWEEN :НачДата AND :КонДата~
     |      AND
     |    $Жур.ВидДокумента = :ДокВид.ИмяДокумента
     |";

Запрос = СоздатьОбъект("ПрямойЗапрос");
     Запрос.Текст = ТекстЗапроса;
     Запрос.УстановитьТекстовыйПараметр("НачДата",ПолучитьДатуТА()-1);
     Запрос.УстановитьТекстовыйПараметр("КонДата",ПолучитьДатуТА());
     Запрос.УстановитьТекстовыйПараметр("ДокВид","РасходнаяНакладная");
     Запрос.РежимОтладки = 1;
     ВремДанные = Запрос.Выполнить("ИндексированнаяТаблица");

Вопрос. Нужно получить из общего журнала документы определённого вида, а оно не работает, Если отключаю сравнение по виду документа, то получаю полный список, а иначе ничего. Что неправильно делаю?
  
Наверх
ICQ  
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #115 - 07. Августа 2009 :: 05:25
Печать  
Код
Выбрать все
AND
$Жур.ВидДокумента = :ДокВид.ИмяДокумента 


Замени на
Код
Выбрать все
AND
$Жур.ВидДокумента = :ВидДокумента.РасходнаяНакладная 



А вообще в документации смотри блок про подстановку параметров. Там описаны предопределенные параметры которые подставляются автоматически.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
undo
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 53
Местоположение: Ульянвоск
Зарегистрирован: 25. Декабря 2008
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #116 - 07. Августа 2009 :: 08:21
Печать  
Спасибо разобрался помогло.
  
Наверх
ICQ  
IP записан
 
nvg
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 72
Местоположение: Киев
Зарегистрирован: 14. Сентября 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #117 - 07. Августа 2009 :: 11:05
Печать  
vandalsvq писал(а) 28. Июля 2009 :: 04:08:
Так... для SQLite вопрос ясен. До конца недели добью вопрос с SQL и попробую в классе добавить соответствующий функционал.

В общем я добавил тестово два метода
- ПрисоединитьБазуДанных(ИмяБД,ПутьКБД,ПутьКЛогФайлу)
ИмяБД - идентификатор для дальнейшего использования
ПутьКБД - путь к файлу db для SQLite, или путь к файлу MDF для SQL
ПутьКЛогФайлу - путь к файлу ldf для SQL. Для SQLite ничего не прописывается
- ОтключитьБазуДанных(ИмяБД)
ИмяБД - идентификатор базы данных

Кому хочется попробуйте. Подмигивание

Пы.сы. я попробовал поработать на DBF с db файлами (SQLite) проблем не возникло. Счас тестировать SQL некогда поэтому погоняю позже.


Добрался таки до тестирования.

1. Запрос для проверки существования таблицы.
SELECT
     name, type
FROM sqlite_master
WHERE ((type='table')
And (name='ekn_gaz_main'))

При подготовке выдает сообщения:
Ключевое слово '' не обнаружено в словаре.
Ключевое слово '' не обнаружено в словаре.
Ключевое слово '' не обнаружено в словаре.
Ключевое слово '' не обнаружено в словаре.

2. При подготовке запроса метод ПарсингКлючевыхСловЗапроса вызывается дважды. Так нужно, или опечатка?

3. Можно ли модифицировать в классе создании объекта БазаSQLite таким образом:
Код
Выбрать все
Попытка
	БазаSQLite = СоздатьОбъект("SQLiteBase");
Исключение
	ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
	БазаSQLite = СоздатьОбъект("SQLiteBase");
КонецПопытки; 


На случай, если ВК еще не загружена...

4. Создание индекса для присоединенной БД не проходит.
Код
Выбрать все
CREATE UNIQUE INDEX ekn_gaz_main_idx_0 ON [NBase].ekn_gaz_main (item_code ASC) 


Выдается ошибка: near ".": syntax error
Но это, видимо, ограничение ядра SQLite...
  
Наверх
ICQ  
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #118 - 07. Августа 2009 :: 11:21
Печать  
по п.1 - Если режим отладки = 1 тогда все путем. Если нет я проверю
по п.2 - Да, так задумано, иногда с одного прохода не обрабатываются подряд стоящие ключевые слова.
по п.3 - Я думаю сделаю проверку на наличие ВК и загрузку для DBF, для SQL неактуально почти Улыбка
по п.4 - наверное связано с SQLite. Попробую вечером почитать на вражескоязычном сайте что пишут.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
nvg
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 72
Местоположение: Киев
Зарегистрирован: 14. Сентября 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #119 - 07. Августа 2009 :: 11:55
Печать  
vandalsvq писал(а) 07. Августа 2009 :: 11:21:
по п.1 - Если режим отладки = 1 тогда все путем. Если нет я проверю

Да, режим отладки.
Несколько удивило время на подготовку запроса:
Время подготовки запроса: 20 мс, время выполнения запроса: 3 мс.

vandalsvq писал(а) 07. Августа 2009 :: 11:21:
по п.2 - Да, так задумано, иногда с одного прохода не обрабатываются подряд стоящие ключевые слова.

о.к.

vandalsvq писал(а) 07. Августа 2009 :: 11:21:
по п.3 - Я думаю сделаю проверку на наличие ВК и загрузку для DBF, для SQL неактуально почти Улыбка

Спасибо, я у себя добавил. Но, думаю, лучше если класс будет вести один человек.

vandalsvq писал(а) 07. Августа 2009 :: 11:21:
по п.4 - наверное связано с SQLite. Попробую вечером почитать на вражескоязычном сайте что пишут.


Может, в этом причина:
The text of each CREATE INDEX statement is stored in the sqlite_master or sqlite_temp_master table, depending on whether the table being indexed is temporary. Every time the database is opened, all CREATE INDEX statements are read from the sqlite_master table and used to regenerate SQLite's internal representation of the index layout.
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 6 7 [8] 9 10 ... 60
ОтправитьПечать