Имя: Пароль:
1C
1C 7.7
v7: 1С++ Запрос по регистру ПартииНаличие
,
0 Pro100
 
02.08.12
10:26
Задача:
Выбрать все продажи товаров(в том числе и возвраты) от определенного поставщика за определенный период
В 1С запрос следующий:
   ТекстЗапроса =
   "//{{ЗАПРОС(СформироватьПоПоставщику)
   |Период с ДатаНачала по ДатаКонца;
   |Фирма = Регистр.ПартииНаличие.Фирма;
   |ЮрЛицо = Регистр.ПартииНаличие.Фирма.ЮрЛицо;
   |УпрАналитика = Регистр.ПартииНаличие.Фирма.УпрАналитика;
   |Номенклатура    = Регистр.ПартииНаличие.Номенклатура;
   |ТорговаяМарка    = Регистр.ПартииНаличие.Номенклатура.ОсновноеСвойство.ЗначениеСвойства;
   |Партия            = Регистр.ПартииНаличие.Партия;
   |Поставщик        = Регистр.ПартииНаличие.Партия.Поставщик;
   |Док            = Регистр.ПартииНаличие.ТекущийДокумент;
   |КодОперации    = Регистр.ПартииНаличие.КодОперации;
   |пзКоличество   = Регистр.ПартииНаличие.Количество;";
   |Группировка День;
   |Группировка Номенклатура без групп;
   |Группировка Поставщик без групп;
   |Группировка Док;
   |Группировка КодОперации;
   |Функция НачОстКоличество=НачОст(пзКоличество);
   |Функция ПриходКоличество=Приход(пзКоличество);
   |Функция РасходКоличество=Расход(пзКоличество);
   |Функция КонОстКоличество=КонОст(пзКоличество);
       |Условие (Поставщик в ВыбПоставщик);
   |";

Что-то прямой запрос показывается все остатки и приход, расход совсем не такие какие выбрала 1С своим запросом. Гуру прямых запросов подскажите пожалуйста, где ошибся в прямом запросе?
вот прямой запрос:
SELECT NullIf(ПартииНаличиеОстаткиОбороты.Период, '17530101') Период
   , ПартииНаличиеОстаткиОбороты.Номенклатура [ПартииНаличиеОстаткиОборотыНоменклатура $Справочник.Номенклатура]
   , $Партии.Поставщик [Поставщик $Справочник.Контрагенты]
   , ПартииНаличие.IDDOC [Документ $Документ]
   , Журнал.IDDOCDEF [Документ_вид $ВидДокументаПредставление]
   , $ПартииНаличие.КодОперации [КодОперации $Перечисление.КодыОпераций]
   , Sum(ПартииНаличиеОстаткиОбороты.КоличествоНачальныйОстаток) СуммаКоличествоНачальныйОстаток
   , Sum(ПартииНаличиеОстаткиОбороты.КоличествоПриход) СуммаКоличествоПриход
   , Sum(ПартииНаличиеОстаткиОбороты.КоличествоРасход) СуммаКоличествоРасход
   , Sum(ПартииНаличиеОстаткиОбороты.КоличествоКонечныйОстаток) СуммаКоличествоКонечныйОстаток
FROM $Регистр.ПартииНаличие AS ПартииНаличие With (NOLOCK)
   INNER JOIN $РегистрОстаткиОбороты.ПартииНаличие(:НачДата,
       :КонДата,
       День,
       ДвиженияИГраницыПериода,
       INNER JOIN $Регистр.ПартииНаличие AS ПартииНаличие With (NOLOCK) ON $ПартииНаличие.Фирма = Фирма AND $ПартииНаличие.Номенклатура = Номенклатура AND $ПартииНаличие.Партия = Партия
       INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON ПартииНаличие.IDDOC = Журнал.IDDOC
       INNER JOIN $Справочник.Партии AS Партии With (NOLOCK) ON $ПартииНаличие.Партия = Партии.ID,
       ($Партии.Поставщик = :ВыбПоставщик),
       (Номенклатура, Фирма, Партия),
       Количество) AS ПартииНаличиеОстаткиОбороты ON $ПартииНаличие.Фирма = ПартииНаличиеОстаткиОбороты.Фирма AND $ПартииНаличие.Номенклатура = ПартииНаличиеОстаткиОбороты.Номенклатура AND $ПартииНаличие.Партия = ПартииНаличиеОстаткиОбороты.Партия
   INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON ПартииНаличие.IDDOC = Журнал.IDDOC
   INNER JOIN $Справочник.Партии AS Партии With (NOLOCK) ON $ПартииНаличие.Партия = Партии.ID
WHERE ($Партии.Поставщик = :ВыбПоставщик)
GROUP BY ПартииНаличиеОстаткиОбороты.Период
   , ПартииНаличиеОстаткиОбороты.Номенклатура
   , $Партии.Поставщик
   , ПартииНаличие.IDDOC
   , Журнал.IDDOCDEF
   , $ПартииНаличие.КодОперации
1 AleksAnt
 
02.08.12
10:35
Возможно надо :КонДата заменить на :КонДата~
2 GLazNik
 
02.08.12
10:36
Кривой запрос. $РегистрОстаткиОбороты.ПартииНаличие возвращает уже просуммированные данные. Так ты еще этот результат соединяешь с $Регистр.ПартииНаличие в результате чего у тебя просуммированные записи размножаются, а потом еще и суммируешь.

И вообще я не люблю $РегистрОстаткиОбороты
3 Светлый Гений
 
02.08.12
10:40
А если мы выбираем продажи, зачем нам остатки?
4 GLazNik
 
02.08.12
10:40
+(2)
Если на то пошло, приход и расход бери из $Регистр.ПартииНаличие. Начальный и конечный остаток из $РегистрОстаткиОбороты.ПартииНаличие, но убери джойны в параметрах виртуальных таблиц и вместо агрегатных функций sum() для остатков используй, например max()
5 Светлый Гений
 
02.08.12
10:40
Лучше тогда делать по регистру Продажи
6 Pro100
 
02.08.12
10:41
(1)Не помогает, результат тот же.
(2) Этот регистр $РегистрОстаткиОбороты, нужен чтобы получить Нач.Остаток, приход, расход, кон.остаток.
7 Ёпрст
 
02.08.12
10:43
(0) какая то каша
8 GLazNik
 
02.08.12
10:44
(6) я понимаю зачем он нужен. Но ты его используешь неправильно. И я понимаю зачем ты используешь $Регистр.ПартииНаличие (что б получить движения в разрезе кодов операций)
(5) Скорее всего задача стоит шире: переделать существующий функционал (отчет) на прямые запросы.
9 GLazNik
 
02.08.12
10:44
(7) +100500 :)
10 Pro100
 
02.08.12
10:46
(8)$Регистр.ПартииНаличие использую чтобы получить Документ и КодОперации.
Ну по поводу отчета, да слишком долго формируется и принял решение переделать на прямые запросы, вот и пытаюсь получить результат, иначе оставил бы запрос 1С и не спрашивал бы тут.
11 Pro100
 
02.08.12
10:48
(7) В чем именно каша то?
Выбираю Документ и КодОперации из $Регистр.ПартииНаличие, чтобы нормально документ показывался присоединяю журнал, чтобы сделать отбор по поставщику присоединяю справочник партий и оттуда выбираю поставщика.
также соединяю с $РегистрОстаткиОбороты.ПартииНаличие чтобы получить цифры по нач.остаток, приход, расход, кон.остаток
12 GLazNik
 
02.08.12
10:49
(10) ты вот убери группировку, и посмотри какую ерунду возвращает у тебя запрос. Возможно сам поймешь что не так.
13 Светлый Гений
 
02.08.12
10:49
(10)А как ты думаешь, что вернет тебе соединение таблиц $Регистр.ПартииНаличие и $РегистрОстаткиОбороты.ПартииНаличие?
14 Ёпрст
 
02.08.12
10:52
(11) да во всём.. особенно, в нелепых соединениях унутри ВТ
15 Pro100
 
02.08.12
10:54
(13) что-то при соединении этих двух таблиц вернул цифры какие-то нереальные.
(14)Поэтому и прошу подсказать, как можно соединить, чтобы получить данные.
16 Светлый Гений
 
02.08.12
10:55
(15)Вот и я о том же, что надо разобраться сначала на простых примерах, а потом уже огород городить
17 GLazNik
 
02.08.12
10:58
(15) Без группировки скорее всего не совсем нереальные цифры. Скорее количество цифр нереальное :)
Пойди от простого к сложному. Сперва получи только движения в нужном тебе виде. Затем только остатки. Потом уже соединяй эти наборы данных.
18 Pro100
 
02.08.12
11:01
(17)Щас буду пробовать ))
19 Pro100
 
02.08.12
11:07
Пробую по шагам.
Делаю запрос:
SELECT NullIf(ПартииНаличиеОстаткиОбороты.Период, '17530101') Период
   , ПартииНаличиеОстаткиОбороты.Номенклатура [Номенклатура $Справочник.Номенклатура]
   , ПартииНаличиеОстаткиОбороты.КоличествоНачальныйОстаток
   , ПартииНаличиеОстаткиОбороты.КоличествоПриход
   , ПартииНаличиеОстаткиОбороты.КоличествоРасход
   , ПартииНаличиеОстаткиОбороты.КоличествоКонечныйОстаток
FROM $РегистрОстаткиОбороты.ПартииНаличие(:НачДата,
       :КонДата,
       День,
       ДвиженияИГраницыПериода,
       INNER JOIN $Справочник.Партии AS Партии With (NOLOCK) ON Партия = Партии.ID,
       ($Партии.Поставщик = :ВыбПоставщик),
       Номенклатура,
       Количество) AS ПартииНаличиеОстаткиОбороты
ORDER BY ПартииНаличиеОстаткиОбороты.Период

Данные верные показываются, например расход проверил по одной позиции номенклатуры, все верно.
Вопрос следующий: Что присоединить к этому запросу, чтобы увидеть документ который сделал движение?
20 GLazNik
 
02.08.12
11:13
(19) Если тебе нужен КодОперации то РегистрОстаткиОбороты не подойдет. Нужно приход и расход получать из $Регистр.ПартииНаличие. И правильно его сгруппировать.
21 Ёпрст
 
02.08.12
11:15
(19) не надо ничего присоединять - всё и так есть. Задай нужную периодичность, конкретно Документ и наслаждайся
22 GLazNik
 
02.08.12
11:19
(21) а разве виртуальные таблицы научились выдавать реквизиты (КодОперации) регистров?
23 Ёпрст
 
02.08.12
11:21
(22) реквизиты - нет, документ движения - да
24 GLazNik
 
02.08.12
11:23
(23) ну как бы в изначальном запросе есть Группировка КодОперации;
25 Pro100
 
02.08.12
11:24
(20) Как получить из $Регистр.ПартииНаличие приход и расход? если там только количество есть и все...
(21) При периодичности документ появляется только позиция документа и вид документа, позиция документа - это что-то совсем не сам документ...
26 GLazNik
 
02.08.12
11:28
(25) там еще есть DEBKRED
27 Pro100
 
02.08.12
11:30
(26)Такс, с этим понял смысл.
Но встает вопрос как за определенный период выбрать из этой таблицы?
Ведь без периода, он мне всю таблицу попытается вывести, а мне это совсем не нужно
28 Ёпрст
 
02.08.12
11:32
(25)  позиция документа и вид документа - это и есть сам документ , если что
29 Ёпрст
 
02.08.12
11:33
Если че, все ПРОДАЖИ и ВОЗВРАТЫ и Поставщики есть в другом, "правильном" регистре - Продажи.
30 GLazNik
 
02.08.12
11:34
(25) позицию документа и вид документа можно легко превратить в документ
Примерно так:
right(Таб.ПозицияДокумента) as [$Документ Док],
Таб.ВидДокумента as Док_вид
(27) если у регистра установлен признак «Быстрая обработка движений», то можно повесить условие на DATE_TIME_IDDOC. Иначе соединяем с 1sjourn
31 GLazNik
 
02.08.12
11:38
+(30) right(Таб.ПозицияДокумента,9)
32 Pro100
 
02.08.12
11:58
Не пойму как в данном запросе можно вид документа указать?
Ругается, что не найдено дополнительное типизирующее поле для Док, ведь вид документа же следом идет

SELECT ПартииНаличиеОстаткиОбороты.Номенклатура [Номенклатура $Справочник.Номенклатура]
   , ПартииНаличиеОстаткиОбороты.ПозицияДокумента
   , (RIGHT(ПартииНаличиеОстаткиОбороты.ПозицияДокумента, 9)) [Док $Документ]
   , ПартииНаличиеОстаткиОбороты.ВидДокумента [ВидДокумента $ВидДокументаПредставление]
   , ПартииНаличиеОстаткиОбороты.КоличествоНачальныйОстаток
   , ПартииНаличиеОстаткиОбороты.КоличествоПриход
   , ПартииНаличиеОстаткиОбороты.КоличествоРасход
   , ПартииНаличиеОстаткиОбороты.КоличествоКонечныйОстаток
FROM $РегистрОстаткиОбороты.ПартииНаличие(:НачДата,
       :КонДата,
       Документ,
       ДвиженияИГраницыПериода,
       INNER JOIN $Справочник.Партии AS Партии With (NOLOCK) ON Партия = Партии.ID,
       ($Партии.Поставщик = :ВыбПоставщик),
       Номенклатура,
       Количество) AS ПартииНаличиеОстаткиОбороты
33 GLazNik
 
02.08.12
12:00
, ПартииНаличиеОстаткиОбороты.ВидДокумента Док_вид

Char(9) - Идентификатор объекта, кроме того, в наборе данных должна находиться колонка с именем составленным из имени этой колонки и суффикса {_вид|_kind} (чувствительно к регистру), в которой должны содержаться идентификаторы видов документов. Тип колонки SQL: int, DBF: char(4).
34 Pro100
 
02.08.12
12:09
(33) Заработало, спасибо!
Вот только как теперь КодОперации вытащить? )))
35 GLazNik
 
02.08.12
12:12
(34) только через таблицу движений ($Регистр.ПартииНаличие)
36 Pro100
 
02.08.12
13:04
Все, вроде получилось, через вложенный подзапрос ))
37 Ёпрст
 
02.08.12
13:05
см. 29
38 Ёпрст
 
02.08.12
13:06
а в партиях - удачи с вырезанием списаний/перемещени и прочего