Имя: Пароль:
1C
 
v.7.7: Как получить вид справочника в запросе?
0 PashaTP
 
26.12.05
02:21
v.7.7: Как получить вид справочника в запросе?
Поле многострочной части документа вида Справочник неопределенного вида.

       Запрос = СоздатьОбъект("Запрос");
       ТекстЗапроса =
       "//{{ЗАПРОС(Запрос)
       |Период с Дата1 по Дата2;
       |ОбрабатыватьДокументы Проведенные;
       |ТекущийДокумент = Документ.ПриходТМЦ.ТекущийДокумент;
       |НомерСтроки = Документ.ПриходТМЦ.НомерСтроки;
       |ПОСТ = Документ.ПриходТМЦ.СубконтоКт1;
       |ВидТМЦ = Документ.ПриходТМЦ.ТМЦ.Вид;
       |НалБезНал = Документ.ПриходТМЦ.НалБезНал;
       |Колво = Документ.ПриходТМЦ.Колво;
       |Сумма = Документ.ПриходТМЦ.Сумма;
       |СуммаЗатрат = Документ.ПриходТМЦ.СуммаЗатрат;
       |СуммаЗатратВал = Документ.ПриходТМЦ.СуммаЗатратВал;
       |СуммаПост = Документ.ПриходТМЦ.СуммаПостРубли;
       |СуммаПостВал = Документ.ПриходТМЦ.СуммаПостВалюта;
       |Функция Сум = Сумма(Сумма);
       |Функция СумВал = Сумма(СуммаПостВал*Колво);
       |Функция СумПост = Сумма(СуммаПост);
       |Функция СумПостВал = Сумма(СуммаПостВал);
       |Функция СумЗатр = Сумма(СуммаЗатрат);
       |Функция СумЗатрВал = Сумма(СуммаЗатратВал);";
       
       Если Группировать1 = 1 Тогда
           ТекстЗапроса = ТекстЗапроса+"
           |Группировка ПОСТ;";
       КонецЕсли;    
       Если Группировать3 = 1 Тогда
           ТекстЗапроса = ТекстЗапроса+"
           |Группировка НалБезНал;";
       КонецЕсли;
       ТекстЗапроса = ТекстЗапроса+"
       |Группировка ТекущийДокумент;
       |Группировка ВидТМЦ;
       |Условие(ВидТМЦ = Вид_Док);
       |"//}}ЗАПРОС
       ;                          
       // Если ошибка в запросе, то выход из процедуры
       Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
           Возврат;
       КонецЕсли;
1 insider
 
26.12.05
02:45
Задачу чуть подробнее... т.е. для чего это, как будет использоваться
2 insider
 
26.12.05
02:51
+1 в общем случае так работать не будет, если под Вид имеется ввиду методе справочника Вид().
можно так:
делаем функцию модуля, например ПроверкаТМЦ() и в ней пишем соотв. условия, далее в запрос вставляем условие, например такое "ПроверкаТМЦ(ТМЦ)=1" - ну чему равно уже сам как-нибудь, если нужа группировка... то имхо никак, только выгрузка в ТЗ и  перебирание этой ТЗ в цикле, хотя может быть кто-нибудь еще подскажет.
3 PashaTP
 
26.12.05
03:06
В оригинале было скрытое поле в ТЧ документа куда прописывался вид справичника ТМЦ использованного в конкретной строке, для экономии убрал поле, теперь не могу в запросе обойтись без него.
А группировку циклами перебора результатов запроса реализовать можно?
4 PashaTP
 
26.12.05
03:11
1: Задача - Реестр документов прихода ТМЦ по Условию="конкретный вид ТМЦ"
5 insider
 
26.12.05
03:25
(4) погоди, конкретный вид ТМЦ (перечисление, справочник или как там у тебя) или конкретный вид справочника (товары, материалы, топливо или опять же что-то еще)?
6 insider
 
26.12.05
03:28
+5 если в этом документе (по приходу) все-таки в строках элементы разных справочников... тогда скрытый реквизит и группировка по нему, иначе запрос выкидываем в ТЗ и перебором ТЗ добиавемся результата, имхо первое быстрее отработает
7 PashaTP
 
26.12.05
03:32
по рекомендации 2 переработал:
//_____________________________________________________________________________
Функция ОпрВидТМЦ(ТМЦ)
   Сообщить(СокрЛП(ТМЦ.Вид()));
   Возврат СокрЛП(ТМЦ.Вид());
КонецФункции
//_____________________________________________________________________________
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Запрос)
|Период с Дата1 по Дата2;
... ((сокращаю для экономии места))
|ВидТМЦ = ОпрВидТМЦ(Документ.ПриходТМЦ.ТМЦ);
...

Если НЕ (Вид_Док = "--=< по всем >=--") Тогда
   ТекстЗапроса = ТекстЗапроса+"
   |Условие(ВидТМЦ = Вид_Док);";
КонецЕсли;
ТекстЗапроса = ТекстЗапроса+"
|"//}}ЗАПРОС
;                          
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
   Возврат;
КонецЕсли;
*******************
Ошибка:
Запрос[8] : Неверно заданный путь 'ОпрВидТМЦ'
8 account77
 
26.12.05
03:34
(7) Попробуй в этой процедуре использовать
ЗначениеВСтрокуВнутр()
Там четвертый параметр вид
http://1c.realnet.ru/cgi-bin/forum.cgi?ask=1118
9 PashaTP
 
26.12.05
03:35
Видать прийдется все возвращать в исходную, т.е. (6).
10 PashaTP
 
26.12.05
03:40
(8) Похоже что функция ОпрВидТМЦ() вообще не может вызваться из запроса.
Можеть ей Експорт поставить- ?
11 PashaTP
 
26.12.05
03:49
(10) не подействовало :) а жаль.
12 insider
 
26.12.05
03:51
(7) нет, так нельзя, можно функцию только в условие пихать, в виде переменной не выйдет
13 insider
 
26.12.05
03:53
т.е. ПеременнаяЗапроса=КакаяТоФункция() - так нельзя, можно так:
Условие (МояФункция(ПеременнаяЗапроса)=ЧтоТо)
14 PashaTP
 
26.12.05
03:55
(12) Ок! Работает, спасибо!
15 insider
 
26.12.05
03:56
(14) помогло? ну поздравляю :) правда не увлекайся такими фичами - могут тормозить запросы
16 PashaTP
 
26.12.05
03:57
А может в условие можно напрямую поставить определение вида справочника:
...
Условие(ВидТМЦ.Вид() = Вид_Док);
...
17 insider
 
26.12.05
03:58
(16) а кто такое вид_док?
18 insider
 
26.12.05
03:58
+17 ну запихни это в функцию, не любит 1С многоэтажные условия
19 insider
 
26.12.05
04:00
ответь на один вопрос: тебе нужно отобрать ТМЦ только одного вида (т.е. из одного справочника) или сгруппировать по видам и вывести все? (первое легко, второе - проблема, все написано в (6))
20 PashaTP
 
26.12.05
04:01
Вид_Док - неудачное название переменной в которую в диалоге выбирается условие по какому конкретно ТМЦ строить Реест или по всем.
21 insider
 
26.12.05
04:02
(20) угумс, значит по всем... плохо, дай подумаю
22 PashaTP
 
26.12.05
04:02
нет (16) не работает.
23 PashaTP
 
26.12.05
04:04
(21) да вообщем вариант (7) заработал, там и условие по необходимости подставляется или нет - тогда по всем.
24 insider
 
26.12.05
04:06
(22) 16 и не должно работать
25 PashaTP
 
26.12.05
04:08
Всем спасибо!
Тему можно закрывать.
Пока.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой