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