Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) 1sqlite - Отбор по реквизиту шапки документа (число прочтений - 8802 )
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
1sqlite - Отбор по реквизиту шапки документа
27. Декабря 2010 :: 09:40
Печать  
В шапке документа есть реквизит "Владелец".

Отбор всех документов по реквизиту таким образом
Код
Выбрать все
Документ = СоздатьОбъект("Документ");
Документ.ВыбратьПоЗначению(,,"Владелец",владелец);
Пока (Документ.ПолучитьДокумент() = 1) Цикл
...
КонецЦикла
 



работает существенно быстрее, чем таким
Код
Выбрать все
select
  iddoc as [Документ :Документ.<ВидДокумента>]
from
  Документ_<ВидДокумента>
where
  Владелец = :Владелец 



Подозреваю, что это связано с необходимостью использования графы отбора журнала?
Может кто ткнет носом, как с ними работать в 1SQLite?
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite - Отбор по реквизиту шапки документа
Ответ #1 - 27. Декабря 2010 :: 09:48
Печать  
Из Статьи о использовании прямых запросов
Цитата:
Графы отбора и подчиненные документы лежат в таблице _1SCRDOC. Вид графы в поле MDID, значение отбора или документа владельца в поле ParentVal

Пример: Выберем документы по графе отбора Контрагент

DBF вариант выглядит так:
Код
Выбрать все
| ТекстЗапроса = "
|SELECT
|	Жур.IDDoc [Док $Документ],
|	Жур.IDDocDef Док_вид
|FROM
|	1Sjourn Жур
|INNER JOIN
|	1SCRDOC Отбор ON Отбор.ChildID = Жур.IDDoc AND
|				Отбор. MDID = $ГрафаОтбора.Контрагент AND
|			  Отбор.ParentVal = :ВыбКонтрагент* AND
|			  Отбор.ChildDate BETWEEN :НачДата~~ AND :КонДата~~";   



Чуть подрехтуй для 1sqlite и в путь!
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite - Отбор по реквизиту шапки документа
Ответ #2 - 27. Декабря 2010 :: 09:50
Печать  
Женя, спасибо, в принципе вроде разобрался методом научного тыка
Улыбка
Меня интересовало именно как в 1sqlite с этим работать, не нашел там такого параметра, как ГрафаОтбора
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite - Отбор по реквизиту шапки документа
Ответ #3 - 27. Декабря 2010 :: 09:58
Печать  
Из документации 1sqlite:
Цитата:
ГрафаОтбора / SelectionColumn
Подстановка идентификатора указанной графы отбора:

:ГрафаОтбора|SelectionColumn.ИмяГрафыОтбора[~]

При нулевом модификаторе подставляется строка длиной 4 символа - идентификатор графы отбора в 36ричной записи

При модификаторе 1 подставляется целое число - идентификатор графы отбора.
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite - Отбор по реквизиту шапки документа
Ответ #4 - 27. Декабря 2010 :: 10:09
Печать  
Блин, вроде поиском искал в chm-ке, да не нашел..
Посыпаю голову пеплом..

Самое смешное, что нашел в своих же сохраненных запросах выбор документов с помощью графы отбора..
Старым становлюсь наверное Улыбка
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite - Отбор по реквизиту шапки документа
Ответ #5 - 27. Декабря 2010 :: 10:18
Печать  
Теперь сравниваю с таким запросом
Код
Выбрать все
select
  iddoc as [Док :Документ],
  iddocdef as Док_вид,
from __1s_crdoc as Ссылки
inner join Журнал on Журнал.iddoc = Ссылки.childid
where
  mdid = :ГрафаОтбора.Владелец
  and substr(parentval,7,9) = :Владелец
  and iddocdef = :ВидДокумента.<ВидДокумента> 


все равно существенная разница..

База dbf, лежит на сетевом ресурсе, число пользователей от 5 до 15
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite - Отбор по реквизиту шапки документа
Ответ #6 - 27. Декабря 2010 :: 10:58
Печать  
А если так:
Код
Выбрать все
select
  iddoc as [Док :Документ],
  iddocdef as Док_вид,
from __1s_crdoc as Ссылки
left join Журнал on Журнал.iddoc = Ссылки.childid
where
  mdid = :ГрафаОтбора.Владелец
  and parentval = :Владелец*
  and iddocdef = :ВидДокумента.<ВидДокумента>  

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


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite - Отбор по реквизиту шапки документа
Ответ #7 - 27. Декабря 2010 :: 12:31
Печать  
Вот так резко лучше стало
Код
Выбрать все
select
  iddoc as [Док :Документ],
  iddocdef as Док_вид,
from __1s_crdoc as Ссылки
inner join Журнал on Журнал.iddoc = Ссылки.childid
where
  mdid = :ГрафаОтбора.Владелец
  and parentval = :Владелец*
  and iddocdef = :ВидДокумента.<ВидДокумента>
 


Что за модификатор "*"?
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite - Отбор по реквизиту шапки документа
Ответ #8 - 27. Декабря 2010 :: 13:30
Печать  
Ты как в первый раз Подмигивание
выдержки из тойже документации по 1sqlite:
Цитата:
Символ '*' обозначает модификатор '-1', количество же символов '~' следующих за именем параметра задает его номер.

Цитата:
Значение любого типа с модификатором -1 преобразуется в тип базы данных "Неопределенный", строка 23 символа. Модификаторы от 0 и выше для разных типов значений действуют по разному.
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite - Отбор по реквизиту шапки документа
Ответ #9 - 27. Декабря 2010 :: 13:45
Печать  
Чесслово, про "*" в доке не нашел.
Все облазил, даже поиском искал..

Цитата:
Преобразование значений 1С в значения базы данных (работа с параметрами)
...
Значение любого типа с модификатором -1 преобразуется в тип базы данных "Неопределенный", строка 23 символа. Модификаторы от 0 и выше для разных типов значений действуют по разному.

Ниже приводятся правила действия модификаторов на типы значений 1С.
...

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


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite - Отбор по реквизиту шапки документа
Ответ #10 - 27. Декабря 2010 :: 13:48
Печать  
А, вот, нашел..
в описании метода "Подставлять"...
А я в разделе "Преобразование значений 1С в значения базы данных (работа с параметрами)" искал
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite - Отбор по реквизиту шапки документа
Ответ #11 - 27. Декабря 2010 :: 13:50
Печать  
*-это "старое" название модификатора, аналогично тильде ~

Ну а дальше, всё есть в доке :

Значение типа Справочник
0: Строка длинной 9 - внутренний идентификатор значения
1: Строка длинной 13 - внутренний идентификатор значения с видом значения
2: Строка длинной 4 - внутренний идентификатор вида значения
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite - Отбор по реквизиту шапки документа
Ответ #12 - 27. Декабря 2010 :: 13:52
Печать  
Eprst писал(а) 27. Декабря 2010 :: 13:50:
Ну а дальше, всё есть в доке :

Это видел, просто я забыл про подраздел в описании метода "Подставлять"...
Всем спасибо за помощь! Улыбка
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite - Отбор по реквизиту шапки документа
Ответ #13 - 27. Декабря 2010 :: 13:55
Печать  
Eprst писал(а) 27. Декабря 2010 :: 13:50:
*-это "старое" название модификатора, аналогично тильде ~

Ну а дальше, всё есть в доке :

Значение типа Справочник
0: Строка длинной 9 - внутренний идентификатор значения
1: Строка длинной 13 - внутренний идентификатор значения с видом значения
2: Строка длинной 4 - внутренний идентификатор вида значения

Как это старое?
Тильда == модификотор 1
Две тильды == модификатор 2
и т.д.
* == модификатор -1 (или очень много тильд)
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite - Отбор по реквизиту шапки документа
Ответ #14 - 27. Декабря 2010 :: 13:57
Печать  
CaBaT писал(а) 27. Декабря 2010 :: 13:52:
Eprst писал(а) 27. Декабря 2010 :: 13:50:
Ну а дальше, всё есть в доке :

Это видел, просто я забыл про подраздел в описании метода "Подставлять"...
Всем спасибо за помощь! Улыбка

Ну так чё там по времени выполнения?
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite - Отбор по реквизиту шапки документа
Ответ #15 - 27. Декабря 2010 :: 14:48
Печать  
JohnyDeath писал(а) 27. Декабря 2010 :: 13:57:
Ну так чё там по времени выполнения?

В связи с неравномерностью загрузки базы провести корректное сравнение сложно, но по ощущениям выигрыш на порядок..
Видимо в исходном виде запрос не попадал в индекс по графе отбора.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite - Отбор по реквизиту шапки документа
Ответ #16 - 28. Декабря 2010 :: 20:44
Печать  
CaBaT писал(а) 27. Декабря 2010 :: 14:48:
JohnyDeath писал(а) 27. Декабря 2010 :: 13:57:
Ну так чё там по времени выполнения?

В связи с неравномерностью загрузки базы провести корректное сравнение сложно, но по ощущениям выигрыш на порядок..
Видимо в исходном виде запрос не попадал в индекс по графе отбора.

Конечно не попадал.
Если бы ты сделал запрос.Отладка(), то явно бы это увидел.
Ну или в консольке план запроса бы глянул.
И кстати ты еще получил дополнительный бонус - отбор подчиненных доков только заданного вида, что методами 1С получиться сделать только через
Код
Выбрать все
Если док.Вид() <> "НужныйВид" Тогда
    Продолжить;
конецЕсли;
 



И кстати, если ты делаешь
Код
Выбрать все
  and iddocdef = :ВидДокумента.<ВидДокумента>
 


то тогда и в селекте пиши
Код
Выбрать все
select
  iddoc as [Док :Документ.<ВидДокумента>]
from __1s_crdoc as Ссылки
 


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


1C++ rocks!

Сообщений: 24
Зарегистрирован: 23. Августа 2010
Re: 1sqlite - Отбор по реквизиту шапки документа
Ответ #17 - 07. Января 2011 :: 20:28
Печать  
JohnyDeath писал(а) 27. Декабря 2010 :: 10:58:
А если так:
Код
Выбрать все
select
  iddoc as [Док :Документ],
  iddocdef as Док_вид,
from __1s_crdoc as Ссылки
left join Журнал on Журнал.iddoc = Ссылки.childid
where
  mdid = :ГрафаОтбора.Владелец
  and parentval = :Владелец*
  and iddocdef = :ВидДокумента.<ВидДокумента>  



А если Владелец - это Дата?
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite - Отбор по реквизиту шапки документа
Ответ #18 - 08. Января 2011 :: 08:07
Печать  
А так же не прокатывает?
  
Наверх
 
IP записан
 
andrmit
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 24
Зарегистрирован: 23. Августа 2010
Re: 1sqlite - Отбор по реквизиту шапки документа
Ответ #19 - 08. Января 2011 :: 18:21
Печать  
JohnyDeath писал(а) 08. Января 2011 :: 08:07:
А так же не прокатывает?

Нет... у меня выборка пустая получается...

|SELECT
|      IDDoc [Док $Документ],
|      IDDocDef Док_вид
|FROM
|      __1s_crdoc as Ссылки
|INNER JOIN  Журнал ON Журнал.iddoc=Ссылки.childid
| where
|  MDID= :ГрафаОтбора.ДатаЗадания AND
|  ParentVal = :ДатаЗаданияВН and
|             iddocdef=:ВидДокумента.КурьерВН
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite - Отбор по реквизиту шапки документа
Ответ #20 - 08. Января 2011 :: 20:05
Печать  
Как минимум у тебя нет модификатора *
А вообще надо смотреть как 1sqlite преобразует дату с этим модификатором и как хранится дата в этом поле отбора в dbf файле.
  
Наверх
 
IP записан
 
andrmit
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 24
Зарегистрирован: 23. Августа 2010
Re: 1sqlite - Отбор по реквизиту шапки документа
Ответ #21 - 08. Января 2011 :: 22:11
Печать  
Модификатор не помогает...
Как/где можно посмотреть преобразование?
В 1SCRDOC.DBF данные типа "D20101026"
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite - Отбор по реквизиту шапки документа
Ответ #22 - 09. Января 2011 :: 08:22
Печать  
Значит тут либо к Саши Орефкову надо обратиться, чтобы он подправил этот момент, либо самому написать примерно так:
Код
Выбрать все
ParentVal = 'D' || :ДатаЗаданияВН and 



andrmit писал(а) 08. Января 2011 :: 22:11:
Как/где можно посмотреть преобразование?

Запрос.Отладка(1)
  
Наверх
 
IP записан
 
andrmit
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 24
Зарегистрирован: 23. Августа 2010
Re: 1sqlite - Отбор по реквизиту шапки документа
Ответ #23 - 09. Января 2011 :: 09:01
Печать  
Код
Выбрать все
ParentVal = 'D' || :ДатаЗаданияВН and
 



Так помогло... Спасибо...
Орефкова стесняюсь беспокоить Нерешительный
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite - Отбор по реквизиту шапки документа
Ответ #24 - 10. Января 2011 :: 06:31
Печать  
andrmit писал(а) 08. Января 2011 :: 22:11:
Модификатор не помогает...
Как/где можно посмотреть преобразование?
В 1SCRDOC.DBF данные типа "D20101026"

Что-то ты не так делаешь.
Вот у себя тестил:

Код
Выбрать все
Процедура Сформировать()
	ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
	база = СоздатьОбъект("SQLiteBase");
	база.Открыть(":memory:");
	з = база.НовыйЗапрос();
	з.Подставлять("Дт", ТекущаяДата());
	Сообщить(з.ВыполнитьЗапрос("select :Дт*", 0));
КонецПроцедуры
 



Результат:
D20110110
  
Наверх
 
IP записан
 
andrmit
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 24
Зарегистрирован: 23. Августа 2010
Re: 1sqlite - Отбор по реквизиту шапки документа
Ответ #25 - 10. Января 2011 :: 19:38
Печать  
Я использовал Прямой запрос. Вот полный текст

Код
Выбрать все
ТекстЗапроса="
|SELECT
|	IDDoc [Док $Документ],
|	IDDocDef Док_вид
|FROM
|	__1s_crdoc as Ссылки
|LEFT JOIN  Журнал ON Журнал.iddoc=Ссылки.childid
| where
|MDID = :ГрафаОтбора.ДатаЗадания AND
| ParentVal = 'D' || :ДатаЗаданияВН* and
| iddocdef=:ВидДокумента.КурьерВН
|";
Запрос = СоздатьОбъект("ПрямойЗапрос");
 Запрос.Текст = ТекстЗапроса;
//	Запрос.РежимОтладки=1;
Запрос.УстановитьТекстовыйПараметр("ДатаЗаданияВН",Дата_);
ТЗ = Запрос.Выполнить();
 



Без
Код
Выбрать все
'D' ||  

не работает

1sqlite.dll 1.0.2.3
Прямой запрос от 12.08.2010
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite - Отбор по реквизиту шапки документа
Ответ #26 - 11. Января 2011 :: 06:58
Печать  
andrmit писал(а) 10. Января 2011 :: 19:38:
Я использовал Прямой запрос.

Тогда вопросы к автору ПрямогоЗапроса.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать