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