Имя: Пароль:
1C
1C 7.7
v7: запрос с условием на реквизит составного типа без ВК
0 ИсчадиеADO
 
26.06.13
05:36
Есть справочник, один из реквизитов которого имеет тип любой документ. Мне хотелось бы сделать обычный клюшечный запрос с условием на данный реквизит. Естественно не взлетает. В интернетах нашел Запрос к неопределенному реквизиту пост 9, но у меня почему-то не взлетает, может быть потому, что у меня файловая база.

--------

как вариант можно написать что-то типа
<code>
Функция ПроверитьДокументВЗапросе(ДокЗапрос, ДокументСтрокой)
   ДокУсловие = ЗначениеИзСтрокиВнутр(ДокументСтрокой);
   Если ДокЗапрос = ДокУсловие Тогда
       Возврат 1;
   Иначе
       Возврат 0;
   КонецЕсли;
КонецФункции
...
ДокументСтрокой = ЗначениеВСтрокуВнутр(МойДокумент.ТекущийДокумент());
...
|Условие ( ПроверитьДокументВЗапросе(Док, ДокументСтрокой ) = 1 );
...
</code>
но вот только в таком случае, я как понимаю, можно забыть про индекс, будет фулл скан.

--------

Еще одним вариантом явл. создание неск. полей в справочнике, по полю на каждый возможный вид документа. Но это, имхо, из области извращений + индексы не вполне адекватные будут

---------

как сделать на 1с++ знаю, но пока хотелось бы обойтись без ВК. Может быть будут у кого дельные мысли по этому поводу?
1 ИсчадиеADO
 
26.06.13
07:46
вверх
2 МихаилМ
 
26.06.13
08:01
нужно
что бы в запросе 1с отбирать по составному типу

нужно

условие "="

заменить на >знач1  и <=знач2

при этом знач1 и знач2 нужно привести к типу "любой документ" (или требуемый составной тип).


для этого подсмотрите, как ЗначениеИзСтрокиВнутр
преобразует в строку резквизит тапа документ (можно реквизит формы)

и по аналогии сконструируйте строку далее значениеизстроки()
3 ЧеловекДуши
 
26.06.13
08:02
+(0) >>> ДокументСтрокой = ЗначениеВСтрокуВнутр(МойДокумент.ТекущийДокумент());

что это?
4 ЧеловекДуши
 
26.06.13
08:02
+ Покажи полный текст запроса?
5 ЧеловекДуши
 
26.06.13
08:05
Писать просто:

|Условие ( ПроверитьДокументВЗапросе(Док, <Еще Переменная>, , <Еще Переменная>, <Еще Переменная>) = 1 );

И потом в функции уже анализируешь все переданные реквизиты :)

Такое же можно делать и в формулах, но в условии Когда () :)


...
Самое прикольно получается, когда пишешь формулу "Сумма(1) когда(Условие(<Переменная>,...)=1)"
Можно получить некий счетчик :)
6 ИсчадиеADO
 
26.06.13
08:10
ДокументСтрокой = ЗначениеВСтрокуВнутр(МойДокумент.ТекущийДокумент());
   
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = "//Запрос
|Обрабатывать Все;
|СпрЭлемент        = Справочник.МойСправочник.ТекущийЭлемент;
|Наименование    = Справочник.МойСправочник.Наименование;
|Док            = Справочник.МойСправочник.Документ;
|Группировка СпрЭлемент;
|Функция Фун = Сумма(1+1);
//|Условие (Док = МойДокумент); //это условие не работает
|Условие ( ПроверитьДокументВЗапросе(Док, ДокументСтрокой) = 1 ); // а вот это работает, но тут фулл скан будет :(
|";
7 ИсчадиеADO
 
26.06.13
08:10
(6) к (4)
8 ИсчадиеADO
 
26.06.13
08:12
т.е. отобрать то я могу, но вот производительность будет аховая...

с 1с++ будет куда лучше, но вот в данном случае хотелось бы без ВК
9 ИсчадиеADO
 
26.06.13
08:17
(5) проблема вызова функций в запросе - это то, что мой индекс по реквизиту "документ" нафег не будет использоваться. А на больших объемах это фигово
10 ИсчадиеADO
 
26.06.13
08:46
а почему передаю строкой
<code>
ДокументСтрокой = ЗначениеВСтрокуВнутр(МойДокумент.ТекущийДокумент());
</code>
- значение переменной портится при передаче. В функции пишу Сообщить(Документ); - пишет пустую строку (тот документ, который передаю в запрос в качестве условия). Вот и приходится в \запрос передавать примитивный тип данных, а потом из него восстанавливать.

Хотя не в этом сабж.

Вопрос стоит так: есть ли возможность выполнить запрос штатными средствами (без ВК) так, чтобы использовался индекс по реквизиту? (в случае функции в условии он не имеет смысла)
11 NikVars
 
26.06.13
09:34
(9) У тебя очень-очень громадный справочник?!
А простой перебор в цикле?
Могу также предложить допреквизит в справочнике с собсвенным составным индексом типа ДАТА-ТИП. Дата - ГГММДД тип - 1 - пп, 2 - расходная накладная и тд и тп. При записи формировать этот специндекс. Далее в запросе - условие по этому специндексу по периоду, далее доработку результата запроса в тз.
12 ИсчадиеADO
 
26.06.13
13:02
(11) мысль с доп реквизитом оч. хороша, только в моем случае это будет не дата. я как то в этом направлении не подумал

Спасибо!

А тогда еще вопрос остается, в файловой 7.7 в запросе выгодней с т.з.производительности оставить только поиск по этому доп. ревизиту и дальше выгрузка и отбор в ТЗ, или можно в одном запросе сделать, добавив условие через функцию? Не будет лт при втором варианте того же фулл скана?
13 NikVars
 
26.06.13
13:07
(12) Проверяй опытным путем на своих данных. Семерка она такая непредсказуемая.
14 ИсчадиеADO
 
26.06.13
13:10
(13) сейчас данных мало - по времени не заметишь. Профайлером не посмотришь, т.к. файловая, а на сиквельной это может по другому работать
15 Ёпрст
 
26.06.13
13:20
//|Условие (Док = МойДокумент); //это условие не работает

Гон!

Это условие прекрасно работает
16 Ёпрст
 
26.06.13
13:21
ЗЫ:

перед запросом,

МойДокумент = МойДокумент.ТекущийДокумент();

и привет...
Наслаждайся
17 ИсчадиеADO
 
26.06.13
13:44
(16) кстати да :) чета я лоханулся

Благодарю!
18 varelchik
 
27.06.13
10:03
(17) А Сп.Принадлежит(Док)=1 не пробовали.
Где Сп СписокЗначений документов.