|
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 не пробовали.
Где Сп СписокЗначений документов. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |