Имя: Пароль:
1C
1C 7.7
v7: Оптимизация запроса
, ,
0 bananan
 
25.12.12
11:35
Когда я задал обрботку 10 дней он работал 00:05:59, когда я ему задал тужу обработку но в функции ПересчетВЯщики(ТМЦ, Количество) в первой же строке вызвал Возврат - он работал 00:03:34 (на 2 минуты и 25 секунд меньше). Т.е. именно функция ПересчетВЯщики() сильно тормозит. К подчиненному справочнику Справочник.ЕдИз надо как-то иначе обращаться (не в функции, в функции опять же циклы). Т.е. е справочнику Справочник.ЕдИз надообращатьс через Запрос строго через запрос, может выполнять для этого второй Запрос. Подскажите как это сделать?
351 bananan
 
27.12.12
15:18
Все-таки еще один вопрос (на этот раз думаю, что последний)
Если в данном запросе не показывать каждвй товар иего количество
, то ону бдет работать быстрее?
Сейчас я сделал тупо когда установлен флажок Подробно - строка Строка (ТМЦ, количество) - показывается, когда флаг не установлен, то эта строка не показывается.
А может еще и запрос поменять? Если да, то как?
352 Ёпрст
 
27.12.12
15:19
(351) свёрнуто чтоб по документам было ?
353 Ёпрст
 
27.12.12
15:20
выкидываешь из селекта
,$ДокС.ТМЦ as [Товар $Справочник.ТМЦ]

и из гроуп бай тоже
и привет
354 bananan
 
27.12.12
15:45
(353) Спасибо. сейчас попробую. А так запрос будет быстрее работать или это там какая милисекунда?
Например подробно за прошлый месяц он у меня работет 2.5 минуты
355 Ёпрст
 
27.12.12
16:14
(354) можно еще улучшить, если присоединение журнала делать на каждый документ отдельно в подзапросе с юнионами.
356 bananan
 
27.12.12
16:44
(355) Ну, пока и так работает моего опыта и знаний на это пока не хватает. А (355) это для подробнорго отчета или нет или для обоих?
357 Ёпрст
 
27.12.12
16:47
для обоих
358 Ёпрст
 
27.12.12
16:50
2.5 минуты.. это слишком долго.
Где-то еще есть обращение к серваку, надеюсь, в результате запроса дату свою и другие атрибуты документа не получаешь как

ТЗ.Док.ДатаДок ?
359 bananan
 
27.12.12
16:51
(357) Так и думал. попробую сам, а не получитьсчя - обращусь  к тебе
360 bananan
 
27.12.12
16:52
(359) ТЗ.Док обращаюсь просто так
361 Ёпрст
 
27.12.12
16:52
меня до 7-го не будет ужо.. через 8 минут
362 bananan
 
27.12.12
16:53
(361) Тми за 8 минут сможешь такой запрос написать?
363 Ёпрст
 
27.12.12
16:58
ТекстЗапроса="
|select        
|   Таб.Документ as [Док $Документ]
|   ,Таб.iddocdef as [Док_вид $ВидДокумента]
|   ,Таб.Товар as [Товар $Справочник.ТМЦ]
|   ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения
|   ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффициент,1)) as КоличествоВЯщиках
|from
|    (
|      select
|        $ДокС.ТМЦ as Товар
|        ,Жур.iddocdef
|        ,ДокС.iddoc as Документ
|        ,$ДокС.Кво*$ДокС.Коэффициент as Количество
|      from  $ДокументСтроки.РасходнаяНакладная as ДокС (nolock)
|      inner join _1sjourn as Жур (nolock) on Жур.IDDoc = ДокС.iddoc
|      and Жур.iddocdef  = $ВидДокумента.РасходнаяНакладная
|      and Жур.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~
|      and Жур.Closed&1 = 1
|    
|      union all
|
|      select
|        $ДокН.ТМЦ
|        ,Жур2.iddocdef
|        ,ДокН.iddoc
|        ,$ДокН.Кво*$ДокН.Коэффициент
|      from  $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock)
|      inner join _1sjourn as Жур2 (nolock) on Жур2.IDDoc = ДокН.iddoc
|      and Жур2.iddocdef  = $ВидДокумента.РасходнаяНакладнаяН
|      and Жур2.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~
|      and Жур2.Closed&1 = 1
|    )as Таб
|
|left join (
|             select  
|                   max($Спр.Коэффициент) as Коэффициент
|                    ,Спр.parentext as Владелец
|             from $Справочник.Единицы as Спр (nolock)
|             where $Спр.Ед =:ВыбЕдиница
|                   and $Спр.Коэффициент>0
|                   and Спр.ismark=0
|             group by Спр.parentext
|           ) as СпрЕдиницы on СпрЕдиницы.Владелец = Таб.Товар
|
|group by
|    Таб.Документ,Таб.iddocdef,Таб.Товар
|";
Запрос.УстановитьТекстовыйПараметр("ВыбЕдиница",Перечисление.Единицы.ящик);
..................
364 bananan
 
27.12.12
17:01
(363) ОГромное спасибо!
365 bananan
 
27.12.12
17:38
(363) Прочитаешь уже в следующем году. Но второй вариант, который по твоим словам должен был бы работать быстрее работал на 24 секунды дольше, чем прыдидущий
366 Botanik8888
 
27.12.12
17:42
А ты его несколько раз запусти
367 bananan
 
27.12.12
18:09
(366) А что єто даст?
368 bananan
 
27.12.12
18:11
ПОнятно, что львиную долю времени занимает вывод рещультатов запроса, а не сам запрос. Т.е. если улучшений вариант и давал какую-то экономию то это милисекунды или того меньше
369 Botanik8888
 
27.12.12
19:27
1. Вы замер сделайте именно на выполнение запроса.
2. Если правильно составлен запрос то вывод данных на печать не будет занимать "львиной доли" (если не тысячи строк выводятся на печать)
3. К (366) - Понятие план запроса вам знакомо?
370 ADirks
 
27.12.12
19:33
(369) это как интересно запрос влияет на время формирования печатной формы? вроде, не связанные процессы
371 bananan
 
27.12.12
20:01
(370) Резк\ультаты работы запроса выводяться на экран или как?
372 Botanik8888
 
27.12.12
20:26
(370) - может я неверно выразился, имелось ввиду что
если запросом получает все необходимые данные и нет необходимости их дальше преобразовывать, то на печать должно вывестись очень быстро.
Именно потому что они ну совсем не связанные процессы...
373 Botanik8888
 
27.12.12
20:27
" то на печать должно вывестись очень быстро. " - читать как формирование печатной формы не должно занять много времени.
374 bananan
 
28.12.12
11:39
Сейчас внес дополнения в код и буду знать: общее время работы скрипта, время выполнения запроса, время вывода на экран - Вот и увидем реальные цифры.
+  О выводе на экран, толи у меня видеокарта медленная, то ли ввобще комп, но именно вывод на экран занимает очень много времени.
P.S. Когда я "приукрасил" немного таблицу (разные цвета для шапки, ну шапка - фыгня, а вот для ТМЦ и совсем другой цвет для суммыящиков по документу (а документов скрипт обрабатывает ну очень много) - время работы скрипта увеличилось вдове!
375 ADirks
 
28.12.12
11:41
(374) Ты случайно объединений ячеек не добавил при приукрашательстве? Вдвое - подозрительно много.
376 bananan
 
28.12.12
11:42
Результаты работы улучшенной версий скрипт работал 13мин 49сек
Запрос работал: 7 секунд
377 bananan
 
28.12.12
11:43
(375) Добавлял
378 ADirks
 
28.12.12
11:45
ну так убери нафиг
это тормоза, потери памяти, и потециально глюки при отображении
379 bananan
 
28.12.12
11:46
(378) Не знал. Спасибо. Уберу
380 ADirks
 
28.12.12
11:48
по поводу скорости формирования mxl: http://www.rikcenter.ru/download/TestVivoda.zip

кратко: не выводить агрегатных данных, особенно в расшифровки - это основные тормоза. Ещё прикольно использовать подготовленные секции, но это уже следующим шагом.
381 bananan
 
28.12.12
12:07
Простой (первый неоптимизированний вариант скртипта): Общее время работы 13 минут 47 секунд (на 2 секунды меньше от оптимизированного).
Запрос в этой первой версии работал 3секунды - против 7 секунд в оптимизированной версии!
382 bananan
 
28.12.12
12:31
(380) Что за линк там в архиве файлы дбф, один вв файл и один мд файл к 1С. Что с ними делать и что они дают?
383 ADirks
 
28.12.12
12:33
(382) это тестовая конфа, в которой сравниваются разные методы вывода в mxl
384 bananan
 
28.12.12
12:46
(383) Понял, а, не в курсе где обо всем этом можно почитать (скорость формирования)?
385 ADirks
 
28.12.12
12:50
Ну ты посмотри там в код - всё примитивно. Это проще, чем русским языком объяснять. Помнится, этот тест мы сделали в ходе обсуждения на 1С++ форуме - можешь там поискать.
386 bananan
 
28.12.12
13:40
(385) Спасибо
387 bananan
 
28.12.12
14:19
Ребята! еще подскажите как мне из 1С в T-SQL "перевести"
Условие (ТМЦ в выбТМЦ)
?
WHERE ТМЦ in выбТМЦ
полный текст запроса :
|select        
       |   Жур.iddoc as [Док $Документ]
       |   ,Жур.iddocdef as [Док_вид $ВидДокумента]
       |   ,Таб.Товар as [Товар $Справочник.ТМЦ]
       |   ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения
       |   ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффициент,1)) as КоличествоВЯщиках
       |from
       |    (
       |      select
       |        $ДокС.ТМЦ as Товар
       |        ,ДокС.iddoc as Документ
       |        ,$ДокС.Кво*$ДокС.Коэффициент as Количество
       |      from  $ДокументСтроки.РасходнаяНакладная as ДокС (nolock)
       |    
       |      union all
       |
       |      select
       |        $ДокН.ТМЦ
       |        ,ДокН.iddoc
       |        ,$ДокН.Кво*$ДокН.Коэффициент as Количество
       |      from  $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock)
       |    )as Таб
       |
       |inner join
       |    _1sjourn as Жур (nolock) on Жур.IDDoc = Таб.Документ
       |      and Жур.iddocdef in ($ВидДокумента.РасходнаяНакладная,$ВидДокумента.РасходнаяНакладнаяН)
       |      and Жур.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~
       |      and Жур.Closed&1 = 1
       |left join (
       |             select  
       |                   max($Спр.Коэффициент) as Коэффициент
       |                    ,Спр.parentext as Владелец
       |             from $Справочник.ЕдИзм as Спр (nolock)
       |             where $Спр.Ед =:ВыбЕдиница
       |                   and $Спр.Коэффициент>0
       |                   and Спр.ismark=0
       |             group by Спр.parentext
       |           ) as СпрЕдиницы on СпрЕдиницы.Владелец = Таб.Товар
       |
       |group by
       |    Жур.iddoc,Жур.iddocdef,Таб.Товар";
388 bananan
 
28.12.12
14:21
+(387) И где это поставить в тексте запроса?
389 bananan
 
28.12.12
14:25
(387, 388) выбТМЦ у меня на форме отчета окно для выбора тмц
390 Mikeware
 
28.12.12
14:26
(388) а документацию будет читать пушкин? или тарас шевченко?
391 bananan
 
28.12.12
14:28
(389) Т.е. как этот параметр передать в запрос?
(390) Да я буду читать, но сейчас когда запрос уже готов и рабоатет надо доставить только этот выбор ТМЦ
392 bananan
 
28.12.12
14:30
Конечно у меня еще совсем нет опыта, сделал так:
  ТекстЗапроса = "                            
       |select        
       |   Жур.iddoc as [Док $Документ]
       |   ,Жур.iddocdef as [Док_вид $ВидДокумента]
       |   ,Таб.Товар as [Товар $Справочник.ТМЦ]
       |   ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения
       |   ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффициент,1)) as КоличествоВЯщиках
       |from
       |    (
       |      select
       |        $ДокС.ТМЦ as Товар
       |        ,ДокС.iddoc as Документ
       |        ,$ДокС.Кво*$ДокС.Коэффициент as Количество
       |      from  $ДокументСтроки.РасходнаяНакладная as ДокС (nolock)
       |    
       |      union all
       |
       |      select
       |        $ДокН.ТМЦ
       |        ,ДокН.iddoc
       |        ,$ДокН.Кво*$ДокН.Коэффициент as Количество
       |      from  $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock)
       |    )as Таб
       |
       |inner join
       |    _1sjourn as Жур (nolock) on Жур.IDDoc = Таб.Документ
       |      and Жур.iddocdef in ($ВидДокумента.РасходнаяНакладная,$ВидДокумента.РасходнаяНакладнаяН)
       |      and Жур.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~
       |      and Жур.Closed&1 = 1
       |left join (
       |             select  
       |                   max($Спр.Коэффициент) as Коэффициент
       |                    ,Спр.parentext as Владелец
       |             from $Справочник.ЕдИзм as Спр (nolock)
       |             where $Спр.Ед =:ВыбЕдиница
       |                   and $Спр.Коэффициент>0
       |                   and Спр.ismark=0
       |             group by Спр.parentext
       |           ) as СпрЕдиницы on СпрЕдиницы.Владелец = Таб.Товар
       |
       |group by
       |    Жур.iddoc,Жур.iddocdef,Таб.Товар
       | HAVING Товар in :выбТМЦ"
Дак ругается:
State 42000, native 170, message [Microsoft][ODBC SQL Server Driver][SQL Server]Line 43: Incorrect syntax near ''.
393 bananan
 
28.12.12
14:35
+(391) Параметр в запрос передаю так:
Запр.УстановитьТекстовыйПараметр("выбТМЦ", выбТМЦ);Запр.УстановитьТекстовыйПараметр("выбТМЦ", выбТМЦ);
394 bananan
 
28.12.12
14:37
Кто-нибудь ПОМОГИТЕ пожалуйста!!!!!!!!!!!!!!!!!!11
395 monsterZE
 
28.12.12
14:44
Отбор по списку или группе
Для таких случаев у объекта ODBCRecordset есть метод
УложитьСписокОбъектов(Список, Таблица, ВидСправочника) и
УложитьСписокОбъектов13(Список, Таблица)
Список – это список или группа. После  выполнения этого метода появляется таблица с именем Таблица и колонками Val, IsFolder
Однако не стоит злоупотреблять этим методом. Анализируя производительность можно увидеть, что этот метод на группах работает медленно и это совершенно очевидно, т.к. группа может содержать огромное число элементов, которые надо переписать во временную таблицу. ГОРАЗДО эффективней получить список подгрупп входящих в выбранную группу и делать условие по принадлежности к родителю, а не по ID

Пример: Выберем все документы реализации, у которых склад входит в выбранную группу

ТекстЗапроса = "
|SELECT
|    Док.IDDoc as [Док $Документ.Реализация]
|FROM
|    $Документ.Реализация as Док
|WHERE
|    $Док.Склад IN (SELECT Val FROM #Группа)";
RS.УложитьСписокОбъектов(ВыбГруппа, "#Группа", "Склады");

Замечание: Рекомендуется использовать локальные временные таблицы – префикс #. В этом случае не нужно заботиться об уникальности имени таблицы для разных пользователей, а также об их последующем удалении.
В ДБФ версии драйвер сам создает такие таблицы и сам же генерирует им имя.
Можно сделать универсальный способ получения имени таблицы, работающий как в ДБФ, так и в СКЛ:
   ИмяТаблицы="#Группа ";
   Запрос.УложитьСписокОбъектов(СписокРодителей,ИмяТаблицы);
   ТекстЗапроса=" (SELECT Val FROM "+ИмяТаблицы+")";
В случае СКЛ запрос выполнится из таблицы "#Группа", а в случае ДБФ система сгенерит имя и вернет ее в переменную ИмяТаблицы. В случае ДБФ имя временной таблицы выглядит так ‘f6d3b234a56c765f52da’ что, конечно не очень красиво для текста запроса(особенно если его еще и разбирать на ошибки нужно или на дополнения). Можно сделать запрос более красивым и универсальным: для этого воспользуемся методом УстановитьТекстовыйПараметр()
396 bananan
 
28.12.12
14:46
(395) Спасибо, попробую разобраться
397 monsterZE
 
28.12.12
14:46
скачай уже мануал к 1с++ там все, что надо хорошо расписано и с примерами - "MSSQL при помощи ВК 1С.doc"
или кинь мыло в асю или личку - отправлю
398 bananan
 
28.12.12
14:47
(397) Сча кину мыло
399 bananan
 
28.12.12
14:48
А как кинуть в личку?
400 bananan
 
28.12.12
14:49
+399 Аська у меня здесь пока не установлена :(
401 monsterZE
 
28.12.12
14:52
вот порвая ссылка в яндексе =)
Книга знаний: Эффективное использование MSSQL с помощью ВК 1C++
--
или адрес своего мыла тут напиши
402 bananan
 
28.12.12
14:54
403 bananan
 
28.12.12
15:33
Помогите совсем неопытному...
|WHERE
|    $Док.Склад IN (SELECT Val FROM #Группа)";
RS.УложитьСписокОбъектов(ВыбГруппа, "#Группа", "Склады");
но у меня в запросе по поводу ТМЦ нет WHERE
404 bananan
 
28.12.12
15:34
+(403) Полный текст запроса см. в (387)
405 monsterZE
 
28.12.12
15:42
(403) так добавь..? =)
а лучше, наврное, добавить в твои подзапросы..
406 bananan
 
28.12.12
15:45
Написал так:
  ТекстЗапроса = "                            
       |select        
       |   Жур.iddoc as [Док $Документ]
       |   ,Жур.iddocdef as [Док_вид $ВидДокумента]
       |   ,Таб.Товар as [Товар $Справочник.ТМЦ]
       |   ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения
       |   ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффициент,1)) as КоличествоВЯщиках
       |from
       |    (
       |      select
       |        $ДокС.ТМЦ as Товар
       |        ,ДокС.iddoc as Документ
       |        ,$ДокС.Кво*$ДокС.Коэффициент as Количество
       |      from  $ДокументСтроки.РасходнаяНакладная as ДокС (nolock)
       |    
       |      union all
       |
       |      select
       |        $ДокН.ТМЦ
       |        ,ДокН.iddoc
       |        ,$ДокН.Кво*$ДокН.Коэффициент as Количество
       |      from  $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock)
       |    )as Таб
       |
       |inner join
       |    _1sjourn as Жур (nolock) on Жур.IDDoc = Таб.Документ
       |      and Жур.iddocdef in ($ВидДокумента.РасходнаяНакладная,$ВидДокумента.РасходнаяНакладнаяН)
       |      and Жур.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~
       |      and Жур.Closed&1 = 1
       |left join (
       |             select  
       |                   max($Спр.Коэффициент) as Коэффициент
       |                    ,Спр.parentext as Владелец
       |             from $Справочник.ЕдИзм as Спр (nolock)
       |             where $Спр.Ед =:ВыбЕдиница
       |                   and $Спр.Коэффициент>0
       |                   and Спр.ismark=0
       |             group by Спр.parentext
       |           ) as СпрЕдиницы on СпрЕдиницы.Владелец = Таб.Товар
       |
       |group by
       |    Жур.iddoc,Жур.iddocdef,Таб.Товар
       | HAVING Таб.Товар IN (SELECT Val From #Группа)";
. . .
Запр=СоздатьОбъект("ODBCRecordset");
   Запр.УстановитьТекстовыйПараметр("ВыбЕдиница",Перечисление.Единицы.ящик);
   Запр.УстановитьТекстовыйПараметр("НачДата", НачДата);
   Запр.УстановитьТекстовыйПараметр("КонДата", КонДата);
   Запр.УложитьСписокОбъектов13(выбТМЦ, "#Группа");
   Нач3=ТекущееВремя();                        
   ТЗ = Запр.ВыполнитьИнструкцию(ТекстЗапроса);
Так он, запрос, ничего не находит. Понимаю ошибка в SQL (HAVING Таб.Товар IN (SELECT Val From #Группа)";)
А как иначе мне указать SQL что интересуют ТМЦ или Группы ТМЦ выбранная пользователем в окне выбора?
407 bananan
 
28.12.12
15:47
(405) Так WHERE Таб.Товар = #Группа И где именно в тексте запроса это добавить?
408 monsterZE
 
28.12.12
15:53
|from
       |    (
       |      select
       |        $ДокС.ТМЦ as Товар
       |        ,ДокС.iddoc as Документ
       |        ,$ДокС.Кво*$ДокС.Коэффициент as Количество
       |      from  $ДокументСтроки.РасходнаяНакладная as ДокС (nolock)
where Таб.Товар IN (SELECT Val From #Группа)
       |    
       |      union all
       |
       |      select
       |        $ДокН.ТМЦ
       |        ,ДокН.iddoc
       |        ,$ДокН.Кво*$ДокН.Коэффициент as Количество
       |      from  $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock)
where Таб.Товар IN (SELECT Val From #Группа)
       |    )as Таб
409 monsterZE
 
28.12.12
15:58
тока ессно никаких таб.товар, а  $ДокС.ТМЦ IN (SELECT Val From #Группа)
410 bananan
 
28.12.12
15:59
Зделал так:
   |select        
       |   Жур.iddoc as [Док $Документ]
       |   ,Жур.iddocdef as [Док_вид $ВидДокумента]
       |   ,Таб.Товар as [Товар $Справочник.ТМЦ]
       |   ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения
       |   ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффициент,1)) as КоличествоВЯщиках
       |from
       |    (
       |      select
       |        $ДокС.ТМЦ as Товар
       |        ,ДокС.iddoc as Документ
       |        ,$ДокС.Кво*$ДокС.Коэффициент as Количество
       |      from  $ДокументСтроки.РасходнаяНакладная as ДокС (nolock)
       | WHERE Таб.Товар IN (SELECT VAL FROM #Группа)
       |      union all
       |
       |      select
       |        $ДокН.ТМЦ
       |        ,ДокН.iddoc
       |        ,$ДокН.Кво*$ДокН.Коэффициент as Количество
       |      from  $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock)
       
       |    )as Таб
       |
       |inner join
       |    _1sjourn as Жур (nolock) on Жур.IDDoc = Таб.Документ
       |      and Жур.iddocdef in ($ВидДокумента.РасходнаяНакладная,$ВидДокумента.РасходнаяНакладнаяН)
       |      and Жур.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~
       |      and Жур.Closed&1 = 1
       |left join (
       |             select  
       |                   max($Спр.Коэффициент) as Коэффициент
       |                    ,Спр.parentext as Владелец
       |             from $Справочник.ЕдИзм as Спр (nolock)
       |             where $Спр.Ед =:ВыбЕдиница
       |                   and $Спр.Коэффициент>0
       |                   and Спр.ismark=0
       |             group by Спр.parentext
       |           ) as СпрЕдиницы on СпрЕдиницы.Владелец = Таб.Товар
       |
       |group by
       |    Жур.iddoc,Жур.iddocdef,Таб.Товар";
Выдает:
The column prefix 'Таб' does not match with a table name or alias name used in the query
:(
411 monsterZE
 
28.12.12
16:00
(409) =) жош
412 bananan
 
28.12.12
16:01
(411) Написал так:
| WHERE $ДокН.Товар IN (SELECT VAL FROM #Группа)
Выдает:
{\\SERVER12\VPKTEST$\EXTFORMS\ПРОДАЖА В ЯЩИКАХ 2.ERT(110)}: Meta name parser error: поле таблицы не найдено "$ДокС.Товар"
413 monsterZE
 
28.12.12
16:02
(412) =) ты издеваешься?
414 monsterZE
 
28.12.12
16:03
у тебя в документе в табличной части какое поле? вот его и подставляй.
415 bananan
 
28.12.12
16:03
+(412) когда написал так:
| WHERE $ДокС.ТМЦ IN (SELECT VAL FROM #Группа)
То запрос ничего не находит! :(:(
416 bananan
 
28.12.12
16:07
Можете вере не там надо ставить?
Подный текст запроса:
ТекстЗапроса = "                            
       |select        
       |   Жур.iddoc as [Док $Документ]
       |   ,Жур.iddocdef as [Док_вид $ВидДокумента]
       |   ,Таб.Товар as [Товар $Справочник.ТМЦ]
       |   ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения
       |   ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффициент,1)) as КоличествоВЯщиках
       |from
       |    (
       |      select
       |        $ДокС.ТМЦ as Товар
       |        ,ДокС.iddoc as Документ
       |        ,$ДокС.Кво*$ДокС.Коэффициент as Количество
       |      from  $ДокументСтроки.РасходнаяНакладная as ДокС (nolock)
       | WHERE $ДокС.ТМЦ IN (SELECT VAL FROM #Группа)
       |      union all
       |
       |      select
       |        $ДокН.ТМЦ
       |        ,ДокН.iddoc
       |        ,$ДокН.Кво*$ДокН.Коэффициент as Количество
       |      from  $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock)
       | WHERE $ДокН.ТМЦ IN (SELECT VAL FROM #Группа)
       |    )as Таб
       |
       |inner join
       |    _1sjourn as Жур (nolock) on Жур.IDDoc = Таб.Документ
       |      and Жур.iddocdef in ($ВидДокумента.РасходнаяНакладная,$ВидДокумента.РасходнаяНакладнаяН)
       |      and Жур.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~
       |      and Жур.Closed&1 = 1
       |left join (
       |             select  
       |                   max($Спр.Коэффициент) as Коэффициент
       |                    ,Спр.parentext as Владелец
       |             from $Справочник.ЕдИзм as Спр (nolock)
       |             where $Спр.Ед =:ВыбЕдиница
       |                   and $Спр.Коэффициент>0
       |                   and Спр.ismark=0
       |             group by Спр.parentext
       |           ) as СпрЕдиницы on СпрЕдиницы.Владелец = Таб.Товар
       |
       |group by
       |    Жур.iddoc,Жур.iddocdef,Таб.Товар";
417 monsterZE
 
28.12.12
16:08
Запрос.УложитьСписокОбъектов(ВыбТовар, "#Группа","Товары");
418 monsterZE
 
28.12.12
16:13
ВыбТовар элемент формы справочник.товары
419 bananan
 
28.12.12
16:13
Выдает: Запр.УложитьСписокОбъектов(ВыбТМЦ, "#Группа","Товары");
{\\SERVER12\VPKTEST$\EXTFORMS\ПРОДАЖА В ЯЩИКАХ 2.ERT(108)}: Недопустимое значение третьего аргумента метода!
420 monsterZE
 
28.12.12
16:14
и ты из своего суперзапроса, сделай сначала чтобы маленькие запросы работали.. просто отбери товар по группе с реквизита формы
421 bananan
 
28.12.12
16:15
Все написал так  - работает
а написал так:Запр.УложитьСписокОбъектов(ВыбТМЦ, "#Группа","ТМЦ");
422 monsterZE
 
28.12.12
16:16
@#$ я х^ею =) у тебя справочник не Товары видимо называется...
я же кусок даже из мануала запостил.
423 monsterZE
 
28.12.12
16:16
(421) неможетбыть =)
424 bananan
 
28.12.12
16:28
(423) Сам не верю :
425 bananan
 
28.12.12
16:28
(423) Спасибо!
426 bananan
 
03.01.13
15:55
Всем огромное спасибо за помощь и подсказки! Запрос таки работает, но возникла такая проблема. Если в списке ТМЦ не ничего не выбрать - то и запрос ничего не вернет, хотя за данный период продажи и были... :(
чтобы освежить тему показываю весь текст запроса:
|select        
       |   Жур.iddoc as [Док $Документ]
       |   ,Жур.iddocdef as [Док_вид $ВидДокумента]
       |   ,Таб.Товар as [Товар $Справочник.ТМЦ]
       |   ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения
       |   ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффициент,1)) as КоличествоВЯщиках
       |from
       |    (
       |      select
       |        $ДокС.ТМЦ as Товар
       |        ,ДокС.iddoc as Документ
       |        ,$ДокС.Кво*$ДокС.Коэффициент as Количество
       |      from  $ДокументСтроки.РасходнаяНакладная as ДокС (nolock)
       | WHERE $ДокС.ТМЦ IN (SELECT VAL FROM #Группа)
       |      union all
       |
       |      select
       |        $ДокН.ТМЦ
       |        ,ДокН.iddoc
       |        ,$ДокН.Кво*$ДокН.Коэффициент as Количество
       |      from  $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock)
       | WHERE $ДокН.ТМЦ IN (SELECT VAL FROM #Группа)
       |    )as Таб
       |
       |inner join
       |    _1sjourn as Жур (nolock) on Жур.IDDoc = Таб.Документ
       |      and Жур.iddocdef in ($ВидДокумента.РасходнаяНакладная,$ВидДокумента.РасходнаяНакладнаяН)
       |      and Жур.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~
       |      and Жур.Closed&1 = 1
       |left join (
       |             select  
       |                   max($Спр.Коэффициент) as Коэффициент
       |                    ,Спр.parentext as Владелец
       |             from $Справочник.ЕдИзм as Спр (nolock)
       |             where $Спр.Ед =:ВыбЕдиница
       |                   and $Спр.Коэффициент>0
       |                   and Спр.ismark=0
       |             group by Спр.parentext
       |           ) as СпрЕдиницы on СпрЕдиницы.Владелец = Таб.Товар
       |
       |group by
       |    Жур.iddoc,Жур.iddocdef,Таб.Товар"
427 bananan
 
03.01.13
15:58
+(426) Насколько я понимаю вся "загвоздака" здесь:
WHERE $ДокН.ТМЦ IN (SELECT VAL FROM #Группа)
т.е. если ТМЦ из текущего документа не выбрано в списке - то оно и пропускается...
Но как здесь быть НЕ ЗНАЮ. подскажите
428 bananan
 
03.01.13
16:03
+(426, 427) Но. если убрать WHERE $ДокН.ТМЦ IN (SELECT VAL FROM #Группа), то, естественно не будут выбираться товары выбранные пользовтелем в списке...
429 Mikeware
 
03.01.13
16:05
(428) тебя еще не убили?
430 bananan
 
03.01.13
16:06
+ Если не с помощью запроса, то текст запроса надо формировать в зависимости от отого есть ли выбранные ТМЦ, а через SQL это никак нельзя сделать?
431 bananan
 
03.01.13
16:06
(429) Как видиш
432 bananan
 
03.01.13
16:08
(429) Может ты чего подскажешь?
433 bananan
 
03.01.13
16:17
+ К тому же, если не делать WHERE по выбраным ТМЦ, то по чему их делать?
434 bananan
 
03.01.13
16:24
+(433) Тоесть если нет выбраных ТМЦ в списке выбора - WHERE совсем опустить?
435 bananan
 
03.01.13
16:38
что-то все сегодня спят?
Предыдущие вопросы - решены мною, но как програмно определить выбрал ли что0либо пользователь в окне выбора?
436 Mikeware
 
03.01.13
16:43
(431) а жаль.... пора бы... за нечитание документации
437 Mikeware
 
03.01.13
16:45
(434) формируй текст запроса динамически.
438 bananan
 
03.01.13
16:47
(437) Тоесть если
Если ВыбТМЦ.РазмерСписка()<0 Тогда
       //запрос без ВЕРЫ
ИНАЧЕ
               // Запрос с WHERE
КонецЕсли;
ТАк?
439 bananan
 
03.01.13
16:47
(438) меньше 1
440 Mikeware
 
03.01.13
16:53
(438)
Если ... тогда
ТекстЗапроса+="where всякая_херня";
конецЕсли
441 bananan
 
03.01.13
16:59
(440)З Не понял что ты имел в виду, но сделал как в (438) - работает и работает так как надо
442 monsterZE
 
03.01.13
17:50
(441) он имел ввиду, что текст запроса можно собирать по условиям, динамически. подозреваю, что ты скопировал весь текст запроса два раза =) с верой и без..
а можно обойтись одной строчкой
443 Mikeware
 
03.01.13
17:51
(442) "не поможет..."©
444 bananan
 
03.01.13
19:06
(442)-(443) Теперь скрипт у меня такой (код полностью даю):
//*******************************************
Процедура ПриОткрытии()
   НачДата = НачМесяца(ПолучитьДатуТА())+19;
   КонДата = ПолучитьДатуТА();
   Подробно=1;
КонецПроцедуры

               
Процедура Подч()  
   Таб = СоздатьОбъект("Таблица");
   Таб.ИсходнаяТаблица("НоваяТаблица");
   
   ТекстЗапроса = "
       |select    
       |   Жур.iddoc as [Док $Документ]
       |   ,Жур.iddocdef as [Док_вид $ВидДокумента]";
   Если Подробно=1 тогда
       ТекстЗапроса = ТекстЗапроса + "   ,Таб.Товар as [Товар $Справочник.ТМЦ]";
   КонецЕсли;                                                                    
   ТекстЗапроса = ТекстЗапроса + "
       |   ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения
       |   ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффициент,1)) as КоличествоВЯщиках
       |from
       |    (
       |      select
       |        $ДокС.ТМЦ as Товар
       |        ,ДокС.iddoc as Документ
       |        ,$ДокС.Кво*$ДокС.Коэффициент as Количество
       |      from  $ДокументСтроки.РасходнаяНакладная as ДокС (nolock)";
   Если ВыбТМЦ.РазмерСписка()>0 ТОГДА
       ТекстЗапроса = ТекстЗапроса + "| WHERE $ДокС.ТМЦ IN (SELECT VAL FROM #Группа)";
   КонецЕсли;
   ТекстЗапроса = ТекстЗапроса + "
       |      union all
       |
       |      select
       |        $ДокН.ТМЦ
       |        ,ДокН.iddoc
       |        ,$ДокН.Кво*$ДокН.Коэффициент as Количество
       |      from  $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock)";
   Если ВыбТМЦ.РазмерСписка()>0 ТОГДА
           ТекстЗапроса = ТекстЗапроса + "| WHERE $ДокН.ТМЦ IN (SELECT VAL FROM #Группа)";
   КонецЕсли;
   ТекстЗапроса = ТекстЗапроса + "
       |    )as Таб
       |inner join
       |    _1sjourn as Жур (nolock) on Жур.IDDoc = Таб.Документ
       |      and Жур.iddocdef in ($ВидДокумента.РасходнаяНакладная,$ВидДокумента.РасходнаяНакладнаяН)
       |      and Жур.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~
       |      and Жур.Closed&1 = 1
       |left join (
       |             select  
       |                   max($Спр.Коэффициент) as Коэффициент
       |                    ,Спр.parentext as Владелец
       |             from $Справочник.ЕдИзм as Спр (nolock)
       |             where $Спр.Ед =:ВыбЕдиница
       |                   and $Спр.Коэффициент>0
       |                   and Спр.ismark=0
       |             group by Спр.parentext
       |           ) as СпрЕдиницы on СпрЕдиницы.Владелец = Таб.Товар
       |
       |group by ";
   Если Подробно=1 тогда
       ТекстЗапроса = ТекстЗапроса + " Жур.iddoc,Жур.iddocdef,Таб.Товар";    
   ИНАЧЕ
       ТекстЗапроса = ТекстЗапроса + " Жур.iddoc,Жур.iddocdef";
   КонецЕсли;                                                                    
   

   Запр=СоздатьОбъект("ODBCRecordset");
   Запр.Отладка();
   Запр.УстановитьТекстовыйПараметр("ВыбЕдиница",Перечисление.Единицы.ящик);
   Запр.УстановитьТекстовыйПараметр("НачДата", НачДата);
   Запр.УстановитьТекстовыйПараметр("КонДата", КонДата);
   Запр.УложитьСписокОбъектов(ВыбТМЦ, "#Группа","ТМЦ");;                        
   ТЗ = Запр.ВыполнитьИнструкцию(ТекстЗапроса);
   Кон2=ТекущееВремя();
   Таб.ВывестиСекцию("Шапка");
   ТЗ.ВыбратьСтроки();                          

   ПечДок="";
   ТЗ.ВыбратьСтроки();      
   ДокЯщ = 0;
   Итог=0;          
   ВыведеноСтрокВДокументе=0;
   Пока ТЗ.ПолучитьСтроку()=1 Цикл
         Если ПечДок<>ТЗ.Док Тогда
            Если 0<ВыведеноСтрокВДокументе Тогда
                Таб.ВывестиСекцию("ПодвалДок");
            КонецЕсли;
            ПечДок = ТЗ.Док;
            Таб.ВывестиСекцию("Документ");
            ДокЯщ = 0;
           
            ВыведеноСтрокВДокументе=0;  

        КонецЕсли;  
            ВыведеноСтрокВДокументе=ВыведеноСтрокВДокументе+1;  
            ДокЯщ = ДокЯщ + ТЗ.КоличествоВЯщиках;
            Итог= Итог + ДокЯщ;

     Если Подробно=1 тогда
         Таб.ВывестиСекцию("Строка");
     КонецЕсли
   КонецЦикла;  
            Если 0<ВыведеноСтрокВДокументе Тогда
                Таб.ВывестиСекцию("ПодвалДок");
            КонецЕсли;
   

   Таб.ВывестиСекцию("Итог");
     
   Кон=ТекущееВремя();
   
   Таб.Опции(0,0,Таб.ВысотаСекции("Шапка"),0);
   Таб.ТолькоПросмотр(1);
   Таб.Защита(0);
   Таб.Показать("Расход","");
КонецПроцедуры
// ===============================
Процедура ВыбратьТМЦ(Реж)
   Перем Фрм;
   Перем Тек;
   Если ВыбТМЦ.РазмерСписка()>0 Тогда
       Тек=ВыбТМЦ.ПолучитьЗначение(ВыбТМЦ.ТекущаяСтрока());
   КонецЕсли;
   ОткрытьПодбор("Справочник.ТМЦ",,Фрм,Реж,Тек);
   Фрм.ВыборГруппы(1);
КонецПроцедуры

// ===============================
Процедура ОбработкаПодбора(Выб)
   ВыбТМЦ.ДобавитьЗначение(Выб);
   ВыбТМЦ.ТекущаяСтрока(ВыбТМЦ.РазмерСписка());
КонецПроцедуры
445 Mikeware
 
03.01.13
19:55
(444) подробно не смотрел, но на первый взгляд потянет...
хотя в школу бы, в 10 класс не помешало бы вернуться...
446 wsxedc83
 
03.01.13
21:43
Прочитал тему - жесть.
447 chelentano
 
04.01.13
09:51
(435) "Предыдущие вопросы - решены мною" - ага, тобою, точно
448 Mikeware
 
04.01.13
10:06
(447)
В село по разбитой дороге вьезжает телега, загруженная углем, в которую запряжена старая тощая кляча...
в телеге на горе угля сидит мужичок...
и радостно кричит:
- Люди!!! Я вам уголь привез!!!
Кляча устало оборачивается:
- Ага, бл.., ТЫ привез...
©
449 trad
 
04.01.13
11:11
(444)такое динамическое построение текста выглядит понятнее. Не так ли?

   ТекстЗапроса = "
   |select    
   |   Жур.iddoc as [Док $Документ]
   |   ,Жур.iddocdef as [Док_вид $ВидДокумента]
   |    /*ПолеТовар*/
   |   ,sum(Таб.Количество) as КоличествоВБазовойЕдиницеИзмерения
   |   ,sum(Таб.Количество/isnull(СпрЕдиницы.Коэффициент,1)) as КоличествоВЯщиках
   |from
   |    (
   |      select
   |        $ДокС.ТМЦ as Товар
   |        ,ДокС.iddoc as Документ
   |        ,$ДокС.Кво*$ДокС.Коэффициент as Количество
   |      from  $ДокументСтроки.РасходнаяНакладная as ДокС (nolock)
   |      /*Условие1*/
   |      union all
   |
   |      select
   |        $ДокН.ТМЦ
   |        ,ДокН.iddoc
   |        ,$ДокН.Кво*$ДокН.Коэффициент as Количество
   |      from  $ДокументСтроки.РасходнаяНакладнаяН as ДокН (nolock)
   |      /*Условие2*/
   |    )as Таб
   |
   |inner join
   |    _1sjourn as Жур (nolock) on Жур.IDDoc = Таб.Документ
   |      and Жур.iddocdef in ($ВидДокумента.РасходнаяНакладная,$ВидДокумента.РасходнаяНакладнаяН)
   |      and Жур.Date_Time_IDDoc BETWEEN :НачДата and :КонДата~
   |      and Жур.Closed&1 = 1
   |left join (
   |             select  
   |                   max($Спр.Коэффициент) as Коэффициент
   |                    ,Спр.parentext as Владелец
   |             from $Справочник.ЕдИзм as Спр (nolock)
   |             where $Спр.Ед =:ВыбЕдиница
   |                   and $Спр.Коэффициент>0
   |                   and Спр.ismark=0
   |             group by Спр.parentext
   |           ) as СпрЕдиницы on СпрЕдиницы.Владелец = Таб.Товар
   |group by Жур.iddoc, Жур.iddocdef /*ГруппТовар*/
   |";
   Если Подробно=1 Тогда
       ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "/*ПолеТовар*/", ",Таб.Товар as [Товар $Справочник.ТМЦ]");
       ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "/*ГруппТовар*/", ",Таб.Товар");
   КонецЕсли;
   Если ВыбТМЦ.РазмерСписка()>0 Тогда
       ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "/*Условие1*/", "WHERE $ДокС.ТМЦ IN (SELECT VAL FROM #Группа)");
       ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "/*Условие2*/", "WHERE $ДокН.ТМЦ IN (SELECT VAL FROM #Группа)");
   КонецЕсли;
450 bananan
 
04.01.13
16:34
(449) Спасибо за совет/подсказку - я просто не знал что так можно...