Имя: Пароль:
1C
1C 7.7
v7: Помогите понять что не так с запросом
,
0 crisalis
 
22.07.13
14:07
Доброе время суток, помогите пожалуйста что не так в запросе:

ТекстЗапроса = ТекстЗапроса + "
|ДатаДокумента        = Документ.РеализацияТМЦЦ.ДатаДок;
|
|Расход             = Документ.РеализацияТМЦЦ.Сумма;
|
|Возврат            = Документ.ВозвратТовараПоставщику.Сумма;  
|
|Количество          = Документ.РеализацияТМЦЦ.Количество,
|                      Документ.ВозвратТовараПоставщику.Количество;
|
|Товар                = Документ.РеализацияТМЦЦ.ТМЦ,
|                   Документ.ВозвратТовараПоставщику.Товар;
|
|Клиент        = Документ.РеализацияТМЦЦ.Контрагент,
|             Документ.ВозвратТовараПоставщику.Контрагент;
|
|Объем              = Документ.РеализацияТМЦЦ.ТМЦ.Объем,
|                Документ.ВозвратТовараПоставщику.Товар.Объем;
|
|Упаковки        =Документ.РеализацияТМЦЦ.ТМЦ.КоличествоВУпаковке,
|    Документ.ВозвратТовараПоставщику.Товар.КоличествоВУпаковке;
|";

При отработке запроса выскакивает ошибка :
Неверно заданный путь Объем
Неверно заданный путь КоличествоВУпаковке

Реквизит ТЧ Документ.РеализацияТМЦЦ.ТМЦ имеет изнчально тип Справочник
и в форме принимает конкретный тип при выборе ТипТМЦ (Перечисление.ТипТМЦ)
1 КапЛей
 
22.07.13
14:09
А Объём и КоличествоВУпаковке это что?
2 crisalis
 
22.07.13
14:10
(1) Реквизиты Справочник.Товары
3 Калиостро
 
22.07.13
14:13
(0)
Реквизит ТЧ Документ.РеализацияТМЦЦ.ТМЦ имеет изнчально тип Справочник

Если не все справочники имеют реквизит "Объем", будет такая ошибка.
4 crisalis
 
22.07.13
14:13
Я могу потом в выборке выцепить их через точку, но возникают проблемы с итогами. (((
5 КапЛей
 
22.07.13
14:15
(3) +1
6 КапЛей
 
22.07.13
14:16
+(5) Условие поставь в запросе на ТипТМЦ
7 crisalis
 
22.07.13
14:17
(3)
Если ( ВыбрТМЦ.Вид() = "Товары" ) Тогда
ВидТМЦ = Перечисление.ВидыТМЦДляРеализацииТМЦ.Товары;
ИначеЕсли ( ВыбрТМЦ.Вид() = "ГотоваяПродукция" ) Тогда
ВидТМЦ  = Перечисление.ВидыТМЦДляРеализацииТМЦ.ГП;        ИначеЕсли ( ВыбрТМЦ.Вид() = "Материалы" ) И ( флРОДМатериал = 1 ) Тогда
       ВидТМЦ = Перечисление.ВидыТМЦДляРеализацииТМЦ.Материалы;            
   ИначеЕсли ( ВыбрТМЦ.Вид() = "Услуги" ) Тогда
       ВидТМЦ = Перечисление.ВидыТМЦДляРеализацииТМЦ.Услуги;            
   ИначеЕсли ( ВыбрТМЦ.Вид () = "МБП" ) И ( флМБП_Экспл = 1 ) Тогда
       ВидТМЦ = Перечисление.ВидыТМЦДляРеализацииТМЦ.МБПвЭксплуатации;
   ИначеЕсли ( ВыбрТМЦ.Вид() = "МБП" ) И ( флРОДМБП = 1 ) Тогда
       ВидТМЦ = Перечисление.ВидыТМЦДляРеализацииТМЦ.МБП ;            
   ИначеЕсли ( ВыбрТМЦ.Вид() = "ОсновныеСредства" ) Тогда
       ВидТМЦ = Перечисление.ВидыТМЦДляРеализацииТМЦ.ОсновныеСредства ;            
   ИначеЕсли ( ВыбрТМЦ.Вид() = "НематериальныеАктивы" ) Тогда
       ВидТМЦ = Перечисление.ВидыТМЦДляРеализацииТМЦ.НМА ;            
   КонецЕсли;

Во все добавить ???
8 crisalis
 
22.07.13
14:18
(6) Есть такое условие уже но не работает (((

   Если ( флПоАгентам = 1 ) И ( ВыбАгент.РазмерСписка() > 0 ) Тогда
       ТекстЗапроса = ТекстЗапроса + "
       |Условие (Менеджер В ВыбАгент);  
       |";
   ИначеЕсли ( флПоАгентам = 0 ) И ( ВыбКонтр.РазмерСписка() > 0 ) Тогда
       ТекстЗапроса = ТекстЗапроса + "
       |Условие (Клиент В ВыбКонтр);  
       |Условие (ВидТМЦ = Перечисление.ВидыТМЦДляРеализацииТМЦ.Товары);  
       |";
   КонецЕсли;
9 viktor_vv
 
22.07.13
14:21
|Условие (Товар.Вид() = ""ТМЦ"");
10 КапЛей
 
22.07.13
14:21
(8) значит условие не выполняется в ИначеЕсли.
И, кстати, в (0) ты пишешь о Перечисление.ТипТМЦ, а в (8) про
Перечисление.ВидыТМЦДляРеализацииТМЦ
11 viktor_vv
 
22.07.13
14:21
Хотя есть сомнение, что это поможет.
12 Ёпрст
 
22.07.13
14:23
(0) можно сделать, через функцию.
13 КапЛей
 
22.07.13
14:23
и перепиши в (8)
|Условие (ТМЦ.ВидТМЦ = Перечисление.ВидыТМЦДляРеализацииТМЦ.Товары);
14 Ёпрст
 
22.07.13
14:23
и объем и упаковку
15 КапЛей
 
22.07.13
14:24
+(13) Точнее
|Условие (Товар.ВидТМЦ = Перечисление.ВидыТМЦДляРеализацииТМЦ.Товары);
16 crisalis
 
22.07.13
14:29
(15) Вот запрос:
//{{ЗАПРОС(Сформировать)
Период с НачДата по КонДата;
Обрабатывать НеПомеченныеНаУдаление;

ДатаДокумента        = Документ.РеализацияТМЦЦ.ДатаДок;

Расход             = Документ.РеализацияТМЦЦ.Сумма;

Возврат            = Документ.ВозвратТовараПоставщику.Сумма;  

Количество          = Документ.РеализацияТМЦЦ.Количество,
                     Документ.ВозвратТовараПоставщику.Количество;

Товар                = Документ.РеализацияТМЦЦ.ТМЦ,
                  Документ.ВозвратТовараПоставщику.Товар;

Клиент        = Документ.РеализацияТМЦЦ.Контрагент,
                     Документ.ВозвратТовараПоставщику.Контрагент;

Объем              = Документ.РеализацияТМЦЦ.ТМЦ.Объем,
                   Документ.ВозвратТовараПоставщику.Товар.Объем;

Упаковки            = Документ.РеализацияТМЦЦ.ТМЦ.КоличествоВУпаковке,
                   Документ.ВозвратТовараПоставщику.Товар.КоличествоВУпаковке;

Функция СуммаРасход     = Сумма(Расход);
Функция СуммаВозврат    = Сумма(Возврат * (-1));
Функция СуммаКоличество = Сумма(Количество);
Функция ДКЛ = Сумма(Объем * Количество / 10);  
Функция УПК = Сумма(Количество / Упаковки);

Группировка Документ;
Группировка Клиент Без Групп;
Группировка Товар Без Групп;    

Условие (Клиент В ВыбКонтр);  
Условие (Товар.ВидТМЦ = Перечисление.ВидыТМЦДляРеализацииТМЦ.Товары);

Условие (ТМЦ В ВыбТов);
17 crisalis
 
22.07.13
14:30
так же не работает (((
18 Ёпрст
 
22.07.13
14:30
(16) так не выйдет, если ТМЦ в документе - неопределенного вида.
19 crisalis
 
22.07.13
14:32
(18) как не определенного ? :
Процедура ПриВыбореВидаТМЦ()
   Если ( ВидТМЦ = Перечисление.ВидыТМЦДляРеализацииТМЦ.Товары ) Тогда
       НазначитьВид ( ТМЦ, "Товары" );
   ИначеЕсли ( ВидТМЦ = Перечисление.ВидыТМЦДляРеализацииТМЦ.ГП ) Тогда
       НазначитьВид ( ТМЦ, "ГотоваяПродукция" );            
   ИначеЕсли ( ВидТМЦ = Перечисление.ВидыТМЦДляРеализацииТМЦ.Материалы ) Тогда
       НазначитьВид ( ТМЦ, "Материалы" );            
   ИначеЕсли ( ВидТМЦ = Перечисление.ВидыТМЦДляРеализацииТМЦ.Услуги ) Тогда
       НазначитьВид ( ТМЦ, "Услуги" );            
   ИначеЕсли ( ВидТМЦ = Перечисление.ВидыТМЦДляРеализацииТМЦ.МБП ) Тогда
       НазначитьВид ( ТМЦ, "МБП" );            
   ИначеЕсли ( ВидТМЦ = Перечисление.ВидыТМЦДляРеализацииТМЦ.МБПвЭксплуатации ) Тогда
       НазначитьВид ( ТМЦ, "МБП" );            
   ИначеЕсли ( ВидТМЦ = Перечисление.ВидыТМЦДляРеализацииТМЦ.ОсновныеСредства ) Тогда
       НазначитьВид ( ТМЦ, "ОсновныеСредства" );            
   ИначеЕсли ( ВидТМЦ = Перечисление.ВидыТМЦДляРеализацииТМЦ.НМА ) Тогда
       НазначитьВид ( ТМЦ, "НематериальныеАктивы" );            
   КонецЕсли;
КонецПроцедуры
20 crisalis
 
22.07.13
14:33
(19) Это в форме документа документа...
21 Ёпрст
 
22.07.13
14:35
(19) Не тупи. В дереве метаданных, реквизит твой стоит как <Справочник> без вида.
У таких реквизитов в чорном запросе нет атрибутов.
Можно только в условии пихать или при расчете функции.
22 crisalis
 
22.07.13
14:36
(18) Может реально добавить везде (Спр.ГотоваяПродукция,Материалы...) реквизиты Объем, КоличествоВУпаковке...
23 crisalis
 
22.07.13
14:39
(21) Да я понял ... (((
24 viktor_vv
 
22.07.13
14:39
(22) Тогда уж (12), тормознее будет, но получше чем фигачить ненужные реквизиты в справочники.
25 Ёпрст
 
22.07.13
14:40
Ё...

Период с НачДата по КонДата;
Обрабатывать НеПомеченныеНаУдаление;
ДатаДокумента         = Документ.РеализацияТМЦЦ.ДатаДок;
Расход             = Документ.РеализацияТМЦЦ.Сумма;
ВозвратСумма       = Документ.ВозвратТовараПоставщику.Сумма;  
Количество         = Документ.РеализацияТМЦЦ.Количество,
Товар              = Документ.РеализацияТМЦЦ.ТМЦ,
                    Документ.ВозвратТовараПоставщику.Товар;
Клиент             = Документ.РеализацияТМЦЦ.Контрагент,
                    Документ.ВозвратТовараПоставщику.Контрагент;
Функция СуммаРасход     = Сумма(Расход);
Функция СуммаВозврат    = Сумма(ВозвратСумма * (-1));
Функция СуммаКоличество = Сумма(Количество);
Функция ДКЛ = Сумма(Товар.Объем * Количество / 10);  
Функция УПК = Сумма(Количество / Товар.КоличествоВУпаковке);
Группировка Клиент Без Групп;
Группировка Документ;
Группировка Товар Без Групп;    
Условие (Клиент В ВыбКонтр);  
Условие (ТМЦ В ВыбТов);
26 crisalis
 
22.07.13
14:47
(25) Нечисловая переменная в функции накопления "Товар.Объем"
27 crisalis
 
22.07.13
14:54
(24) Еще не факт что поможет...
28 Ёпрст
 
22.07.13
14:57
не вопрос

Функция ПолучитьОбъем(Товар)
  Объем = 0;
  Попытка //можно и не через попытку, а проверкой на вид справочника лепить
     Объем  = Товар.Объем;
  Исключение
  КонецПопытки;
  Возврат Объем;
КонецФункции
Функция ПолучитьУпаковку(Товар)
  Упаковка= 1;
  Попытка
     Упаковка= Товар.КоличествоВУпаковке;
  Исключение
  КонецПопытки;
  Возврат Упаковка;
КонецФункции


...........


Функция ДКЛ = Сумма(ПолучитьОбъем(Товар) * Количество / 10);  
Функция УПК = Сумма(Количество / ПолучитьУпаковку(Товар));
29 Ёпрст
 
22.07.13
14:57
насладлайся
30 Ёпрст
 
22.07.13
14:57
наслаждайся
31 Ёпрст
 
22.07.13
15:02
только надо еще кое что дописать, если количество - это целое число без дробной части у тебя в метаданных.
32 Ёпрст
 
22.07.13
15:02
чтоб точность функции повысить.
33 crisalis
 
22.07.13
15:05
(29)(30) Спасибо заработало ! )))
(31)(32) Объем (15,3), Количество (5,0)
34 Ёпрст
 
22.07.13
15:07
(33) рано радуешься.. сейчас результат обеих функций - 5.0
35 Ёпрст
 
22.07.13
15:08
вот так переделай:

Функция ДКЛ = Сумма(Расход-Расход+ПолучитьОбъем(Товар) * Количество / 10);  
Функция УПК = Сумма(Расход-Расход+Количество / ПолучитьУпаковку(Товар));
36 Ёпрст
 
22.07.13
15:09
так хотя бы, результат будет иметь ту же точность, что и Расход = сумма в реквизите документа
37 crisalis
 
22.07.13
15:18
(36) Спасибо, но честно говоря я не заметил разницы