Имя: Пароль:
1C
1С v8
v8: Помогите с запросом
0 adron
 
16.01.13
14:09
Есть запрос:

Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ
   |    Докум.Склад.Префикс КАК Префикс
   |ПОМЕСТИТЬ ВТ_ПРЕФИКС
   |ИЗ
   |    &Источник КАК Докум
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |    ВТ_ПРЕФИКС.Префикс
   |ИЗ
   |    ВТ_ПРЕФИКС КАК ВТ_ПРЕФИКС";
   
   Запрос.УстановитьПараметр("Источник",Источник);
   
   В = Запрос.Выполнить().Выбрать();


В качестве параметра "Источник" передаю ссылку на существующий документ.

В итоге получаю ошибку:

"Ошибка при выполнении обработчика - 'ПриУстановкеНовогоНомера'
по причине:
{ОбщийМодуль.ПрефиксацияОбъектовСобытия.Модуль(327)}: Ошибка при вызове метода контекста (Выполнить)
   В = Запрос.Выполнить().Выбрать();
по причине:
{(5, 2)}: Неверные параметры "Источник"
<<?>>&Источник КАК Докум"

В чем моя ошибка?
1 Азат
 
16.01.13
14:10
а что мешает сделать конструкцию типа:

ИЗ Документ.ИмяДокумента ГДЕ Ссылка = &Ссылка
2 GROOVY
 
16.01.13
14:11
(0) Ссылка не является коллекцией, поместить ее во временную таблицу нельзя.
3 adron
 
16.01.13
14:14
(1) полагаю так дольше будет?
4 adron
 
16.01.13
14:14
(2) а он и на ссылку и на объект одинакого ругается...
5 adron
 
16.01.13
14:15
(1) имя документа не определено (вид документа может быть любым)
6 GROOVY
 
16.01.13
14:18
(3) Как раз быстрее.
(4) Естественно, и то и другое не является коллекциями.
(5) Можно собрать текст запроса обратившись через метаданные.
7 Азат
 
16.01.13
14:19
(5) метаданные?
ИЗ Документ." + ТвойДок.Метаданные().Имя + "
8 adron
 
16.01.13
14:19
(6) ок. так и сделаю
Только вопрос - почему быстрее?
9 GROOVY
 
16.01.13
14:19
ВЫБРАТЬ
   Префикс
ИЗ
   Документ."+Ссылка.Метаданные().Имя"
ГДЕ
   Ссылка = &Ссылка
10 GROOVY
 
16.01.13
14:20
(8) Временную таблицу не надо создавать и уничтожать. Временная таблица реально создается в базе. Это совсем не быстро.
11 GROOVY
 
16.01.13
14:21
Кстати, нафига получать запросом префикс, если его можно получить у ссылки?
12 GROOVY
 
16.01.13
14:22
(11) Лажанул, извиняюсь.
13 Reset
 
16.01.13
14:42
Запрос=Новый Запрос("Выбрать (&Ссылка).Префикс");
14 zladenuw
 
16.01.13
14:44
а так не
Префикс = Документ[Источник].Префикс; ?
15 Reset
 
16.01.13
14:45
как в (0):

Запрос=Новый Запрос("Выбрать (&Источник).Склад.Префикс Как Префикс");
16 zladenuw
 
16.01.13
14:45
(14) а не .
17 Reset
 
16.01.13
14:50
(2) Можно :-)

Выбрать &Ссылка
Пометить ВТ;
18 Reset
 
16.01.13
14:50
поместить*
простите
19 zladenuw
 
16.01.13
14:51
(0) только зачем тебе запрос ? если у тебя есть ссылка ?
ТвойПрефикс = Ссылка.Префикс;
20 Reset
 
16.01.13
14:52
(19) Это залет, солдат!
21 zladenuw
 
16.01.13
14:54
(20) я не солдат. так что залет не в счет :).
Та какая задача. если есть ссылка на документ. зачем запрос и еще раз получать. если с ссылки можно получить что надо
22 Reset
 
16.01.13
14:54
(21) тащить целый объект (а у ТСа и вовсе два) изза одного реквизита - не комильфо
23 zladenuw
 
16.01.13
15:04
(22) куда тащить. если он в запрос "параметр", передает ссылку на документ
24 adron
 
16.01.13
15:21
(23) одно дело в параметр передавать ссылку а другое дело тащить объект.

Решил по другому:) По началу просто ступил.

ПрефиксСклада = ОбщегоНазначения.ПолучитьЗначениеРеквизита(Источник.Склад,"Префикс");

Ибо Источник это объект.
25 iceman2112
 
16.01.13
15:35
Человек ты просто псих
26 iceman2112
 
16.01.13
15:36
Не понимаю неужели
Источник.Склад.Префикс
Или
Источник.Сссылка.Склад.Префикс не работает?
27 adron
 
16.01.13
15:57
(25) Источник.Сссылка.Склад.Префикс - это не наш метод. Это долго, некорректно с т.з. производительности. На экзаменах за это оценки снижают. Учи мат часть.
28 Полотенчик
 
16.01.13
16:08
(27) можно поподробнее, пожалуйста? для "самых маленьких и тупых"
29 GROOVY
 
16.01.13
16:16
(28) Ссылка не содержит  в себе данных объекта, потому при обращении к любому свойству ссылки через точку происходит полное чтение данных из БД. При обращении через точку точки еще одно чтение и тд. Куда правильнее выбирать только нужные данные запросом, а не читать кучу ненужных данных объектов.
30 adron
 
16.01.13
16:17
(28) При обращении к реквизиту ссылки "через точку" система считывает весь объект из базы данных в кэш, а затем возвращает значение реквизита.
При обращении к реквизиту объекта - другое дело, объект уже в кэше, данные берутся из кэша.
При обращении в запросе через точку:) считывается только значение реквизита.

Источник.Сссылка.Склад.Префикс - тут сначала система считает все реквизиты документа в КЭШ, затем реквизиты склада, а затм вернет префикс. Это долго.
31 DUDE
 
16.01.13
16:25
(30) а все-таки для непонятливых:
чем ОбщегоНазначения.ПолучитьЗначениеРеквизита(Источник.Склад,"Префикс")
лучше Источник.Склад.Префикс? Имхо, в общей процедуре будет наворочено тоже не... оптимальный для данной задачи алгоритм.
32 adron
 
16.01.13
16:28
(31) в общей процедуре как раз запрос
33 Reset
 
16.01.13
16:28
(31) Объяснения в (29)(30) разве недостаточно? в функции общего модуля формируется запрос вида (9)
34 DUDE
 
16.01.13
16:35
(32), (33) Посмотрел процедуру. Да, там действительно запрос формируется, что есть хорошо. Однако это еще не значит что для текущей задачи - получения префикса склада вызов этой процедуры даст выигрыш.
35 GROOVY
 
16.01.13
16:37
(34) Проестируй, на файловой базе, на скульной, без нагрузки, под нагрузкой, с RLS, без RLS, в привилегированном режиме, в обычном. Напиши тут отчет, всем будет интересно.