|   |   | 
| 
 | v7: Прямой запрос по дате и документам | ☑ | ||
|---|---|---|---|---|
| 0
    
        Rurouny 07.09.20✎ 15:52 | 
        Как построить запрос по дате 
 Запрос в 1С Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = "//{{ЗАПРОС(Сформировать) |Период с НачДата по КонДата; |Склад = Регистр.ОперСклады.Склад; |Товар = Регистр.ОперСклады.Товар; |Кол = Регистр.ОперСклады.КолЕдИзм1; |Док = Регистр.ОперСклады.ТекущийДокумент; |Функция КолНачОст = НачОст(Кол); |Функция КолПриход = Приход(Кол); |Функция КолРасход = Расход(Кол); |Функция КолРасходГП = Расход(Кол) когда(Найти(Док.Вид(),""ВыпускБР"")<>0); |Функция КолРасходГП1 = Расход(Кол) когда(Найти(Док.Вид(),""ВыпускБР"")=0); |Функция КолКонОст = КонОст(Кол); |Группировка День; |Группировка Товар без групп; |Условие((Склад В Склад1) или (Склад В Склад2)); |"//}}ЗАПРОС ; ТекстЗапросаГП1 = "-- Это запрос по ГП |SELECT | '' [Документ_вид $ВидДокумента] | , ОперСкладыОстаткиОбороты.Склад [Склад $Справочник.МестаХранения] | , ОперСкладыОстаткиОбороты.Товар [Товар $Справочник.ТМЦ] | , ОперСкладыОстаткиОбороты.Документ [Документ $Документ] | , ОперСкладыОстаткиОбороты.КолЕдИзм1Расход AS КолРасходГП1 | , ОперСкладыОстаткиОбороты.КолЕдИзм1НачальныйОстаток | , ОперСкладыОстаткиОбороты.КолЕдИзм1Приход | , ОперСкладыОстаткиОбороты.КолЕдИзм1Расход | , ОперСкладыОстаткиОбороты.КолЕдИзм1КонечныйОстаток | , ОперСкладыОстаткиОбороты.Период Период //тут трямая зависимомть если стоит 3-м условием *Документ* тогда отбор по Виду документа возможен !!! |FROM $РегистрОстаткиОбороты.ОперСклады(:НачДата,:КонДата,День,ДвиженияИГраницыПериода,,,(Склад, Товар, Документ),КолЕдИзм1) AS ОперСкладыОстаткиОбороты | WHERE " + РегМест + РегТовар + " | | UNION all | |SELECT | ОперСкладыОстаткиОбороты.ВидДокумента [Документ_вид $ВидДокумента] | , ОперСкладыОстаткиОбороты.Склад [Склад $Справочник.МестаХранения] | , ОперСкладыОстаткиОбороты.Товар [Товар $Справочник.ТМЦ] | , ОперСкладыОстаткиОбороты.Документ [Документ $Документ] | , ОперСкладыОстаткиОбороты.КолЕдИзм1Расход AS КолРасходГП1 | , ОперСкладыОстаткиОбороты.КолЕдИзм1НачальныйОстаток | , ОперСкладыОстаткиОбороты.КолЕдИзм1Приход | , ОперСкладыОстаткиОбороты.КолЕдИзм1Расход | , ОперСкладыОстаткиОбороты.КолЕдИзм1КонечныйОстаток | , 0 AS Период |FROM $РегистрОстаткиОбороты.ОперСклады(:НачДата,:КонДата,Документ,ДвиженияИГраницыПериода,,,(Склад, Товар, Документ),КолЕдИзм1) AS ОперСкладыОстаткиОбороты | WHERE | ((ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок+") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок1 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок2 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок3 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок4 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок5 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок6 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок7 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок8 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок9 +") |" + ") and" + РегМест + РегТовар + " //|GROUP BY Товар |"; Хотелось бы отобрать по виду документа и по дням их формирования $РегистрОстаткиОбороты.<?>(<?>, <?>, <?>, <?>, <?>, <?>, <?>, <?>) Виртуальная таблица остатков и оборотов Синтаксис: $РегистрОстаткиОбороты.<ИмяРегистра>([<НачалоПериода>][, <КонецПериода>][, <Периодичность>][,<МетодДополнения>][, <Соединение>][,<Условие>] [,<Измерение>][,<Ресурс>]) [as <Алиас>] <Периодичность> - можно задать или по Дню или по документу. Как отобрать и по тому и по другому. | |||
| 1
    
        Ёпрст гуру 07.09.20✎ 15:55 | 
        не использовать вт останки и обороты. взять отдельно вт остатки и присоединить обороты с фильтрами на виддокумента     | |||
| 2
    
        Ёпрст гуру 07.09.20✎ 15:57 | 
        ну и соединять с журналом для даты. Если есть галка быстрой обработки движения, то журнал не нужен, всё и так есть в ra     | |||
| 3
    
        Mikeware 07.09.20✎ 16:11 | 
        (1) в какой-то из ВТ (вроде, в классе ПоставщикДанных была ВТ, в которой можно было задать дополнение "на каждый день")
 Ну а так да, задача классическая - "остатки на каждый день" | |||
| 4
    
        Rurouny 07.09.20✎ 16:41 | 
        (2) галка есть )     | |||
| 5
    
        Rurouny 07.09.20✎ 17:30 | 
        А есть пример у кого такого запроса     | |||
| 6
    
        Ёпрст гуру 07.09.20✎ 17:38 | 
        (5) ну, для КонОст бери запрос к ВТ Останки, а для своего
 |Функция КолРасходГП = Расход(Кол) когда(Найти(Док.Вид(),""ВыпускБР"")<>0); можешь тупо обращаться к табличке движения регистра, с фильтром на iddocdef (вид документа) и фильтр по дате ставить (date_time_iddoc) эти поля уже будут в ra, коли галка стоит. оба запроса в union all и в подзапрос, на выходе всё группируешь и привет | |||
| 7
    
        Ёпрст гуру 07.09.20✎ 17:41 | ||||
| 8
    
        tgu82 07.09.20✎ 21:16 | 
        (7) Забираю к себе. То что надо. Спасибо     | |||
| 9
    
        Mikeware 08.09.20✎ 07:52 | 
        (8) анахрена? Чтоб жизнь медом не казалась?     | |||
| 10
    
        tgu82 08.09.20✎ 08:11 | 
        (9) Ага. А то уж больно слащавая какай-то )     | |||
| 11
    
        Mikeware 08.09.20✎ 08:15 | 
        (10) лучше возьми класс ПоставщикДанных, пиши запросы с его помощью, заодно привыкнешь к восьмерочным запросам.
 ИМХО, сочетать надо полезное с приятным, а не бесполезное с отвратительным... | |||
| 12
    
        Rurouny 08.09.20✎ 13:41 | 
        SELECT
 Журнал.IDDOCDEF Док_вид, Журнал.IDDOC [Док $Документ], Док.sp13482 as [БР $Справочник.ТМЦ], БР.sp16474 as [Модель $Справочник.Модель], БР.sp16475 as [Рецептура $Справочник.Рецептура], Док.sp18247 as [ДокНорма $Документ.НормыРасхода], ДокС.sp13035 as [Материал $Справочник.ТМЦ], Sum(ДокС.sp13037) ПоФакту, Sum(ДокС.sp13039) КромПоФакту, Sum(ДокС.sp13041) ПромПоФакту, Sum(ДокС.sp13043) СлиткиПоФакту, Sum(ДокС.sp13774) as УгарПоФакту FROM _1SJOURN AS Журнал With (NOLOCK) INNER JOIN dh13034 AS Док on Журнал.IDDOC = Док.IDDOC INNER JOIN sc44 AS БР on БР.ID = Док.sp13482 INNER JOIN dt13034 AS ДокС on Док.IDDOC = ДокС.IDDOC WHERE Журнал.DATE_TIME_IDDOC BETWEEN '20200401' AND '20200430Z' and Журнал.IDDOCDEF = 13034 and Журнал.Closed & 1 = 1 UNION all SELECT Журнал.IDDOCDEF Док_вид, Журнал.IDDOC [Док $Документ], Док.sp13482 as [БР $Справочник.ТМЦ], БР.sp16474 as [Модель $Справочник.Модель], БР.sp16475 as [Рецептура $Справочник.Рецептура], Док.sp18247 as [ДокНорма $Документ.НормыРасхода], ДокСЗ.sp13492 as [Материал $Справочник.ТМЦ], Sum(ДокСЗ.sp13495) ПоФакту, Sum(ДокСЗ.sp13497) КромПоФакту, Sum(ДокСЗ.sp13499) ПромПоФакту, Sum(ДокСЗ.sp13501) СлиткиПоФакту, 0 as УгарПоФакту FROM _1SJOURN AS Журнал With (NOLOCK) INNER JOIN dh13479 AS Док on Журнал.IDDOC = Док.IDDOC INNER JOIN sc44 AS БР on БР.ID = Док.sp13482 INNER JOIN dt13479 AS ДокСЗ on Док.IDDOC = ДокСЗ.IDDOC WHERE Журнал.DATE_TIME_IDDOC BETWEEN '20200401' AND '20200430Z' and Журнал.IDDOCDEF = 13479 and Журнал.Closed & 1 = 1 GROUP BY Журнал.IDDOCDEF, Журнал.IDDOC, Док.sp13482, БР.sp16474, БР.sp16475, Док.sp18247, ДокС.sp13035, ДокСЗ.sp13492 тз = рс.ВыполнитьИнструкцию(ТекстЗапроса); {W:\ОАИП\ОБЩАЯ\ВЫПУСК БР.ERT(110)}: State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Недопустимое имя столбца "sp13482". По отдельности работает, а вместе нет В чем проблема ??? | |||
| 13
    
        Salimbek 08.09.20✎ 13:52 | 
        (12) Док.sp13482 - это у тебя поле в документе. Только документы у тебя получаются разные, а поле ты берешь одно и то же.  
 Посему выкинь обращение к полям через sp13482 а пиши $Док.Товар - или как там у тебя оно называется. Ну либо тщательнее смотри названия полей в зависимости от Вида Документа. | |||
| 14
    
        Mikeware 08.09.20✎ 13:53 | 
        (12) какая религия заставляет писать без использования метапарсера?     | |||
| 15
    
        trad 08.09.20✎ 13:57 | 
        (14) например дергание из снеговика     | |||
| 16
    
        trad 08.09.20✎ 13:58 | 
        (15) + но тут, да, не этот случай     | |||
| 17
    
        Sserj 08.09.20✎ 14:00 | 
        (12) Без метапарсера это конечно круто, но таки:
 в первой части: select .. Док.sp13482 .. from INNER JOIN dh13479 AS Док ... и во второй части: select .. Док.sp13482 .. from ... INNER JOIN dh13479 AS Док ... Тобишь Док однозначно на разные таблицы документов ссылается, а поле sp13482 у них одинаковое пишешь. Так не может быть все реквизитов уникальные. | |||
| 18
    
        Sserj 08.09.20✎ 14:01 | 
        +(17) В первой части: "..INNER JOIN dh13034 AS Док.."     | |||
| 19
    
        trad 08.09.20✎ 14:03 | 
        если "По отдельности работает"
 то скорее всего ТС пишет с метапарсером, просто сюда вывалил уже отпарсеный | |||
| 20
    
        trad 08.09.20✎ 14:05 | 
        (19) +
 в таком случае, проблема в том, что в одном запросе нельзя применять одинаковые алиас для разных таблиц метапарсер - он простой, семантику не умеет | |||
| 21
    
        Sserj 08.09.20✎ 14:05 | 
        (19) Что-то он не договаривает или не так проверяет по отдельности. Не может оно все работать. Один из двух запросов должне на sp13482 ругаться.     | |||
| 22
    
        trad 08.09.20✎ 14:07 | 
        т.е.
 select .. Док1.БР .. from INNER JOIN $Документ.ВидА AS Док1 ... и во второй части: select .. Док2.БР .. from ... INNER JOIN $Документ.ВидБ AS Док2 | |||
| 23
    
        trad 08.09.20✎ 14:07 | 
        $Док1.БР и $Док2.БР конечно     | |||
| 24
    
        trad 08.09.20✎ 14:08 | 
        (21) если первый запрос выполняет отдельно и через метапарсер, то вычисляется не sp13482     | |||
| 25
    
        trad 08.09.20✎ 14:11 | 
        (24) + а когда выполняет вместе, в мозгах метапарсера за алиасом Док закреплен только $Документ.ВидБ, и на втором проходе поле (вверху и внизу) вычисляется по этому виду документа     | |||
| 26
    
        Rurouny 08.09.20✎ 14:34 | 
        В 1С запрос написан так 
 ТекстЗапроса = " |SELECT | Журнал.IDDOCDEF Док_вид, | Журнал.IDDOC [Док $Документ], | $Док.БР as [БР_0 $Справочник.ТМЦ], | $БР_.Модель as [Модель $Справочник.Модель], | $БР_.Рецептура1 as [Рецептура $Справочник.Рецептура], | $Док.ДокНорма as [ДокНорма $Документ.НормыРасхода], //| Sum($Док.Выпуск) Выпуск, //| Sum($Док.КолОтхКром) КолКром, //| Sum($Док.КолОтхПром) КолПром, //| Sum($Док.КолОтхСлитки) + Sum($Док.КолОтхСлитки1) as КолСлитки, //| Sum($Док.Угар) Угар, | $ДокС.Материал as [Материал $Справочник.ТМЦ], | Sum($ДокС.ПоФакту) ПоФакту, | Sum($ДокС.ОтхКромПоФакту) КромПоФакту, | Sum($ДокС.ОтхПромПоФакту) ПромПоФакту, | Sum($ДокС.СлиткиПоФакту) СлиткиПоФакту, | Sum($ДокС.УгарПоФакту) as УгарПоФакту |FROM | _1SJOURN AS Журнал With (NOLOCK) | INNER JOIN $Документ.ВыпускБР AS Док on Журнал.IDDOC = Док.IDDOC | INNER JOIN $Справочник.ТМЦ AS БР_ on БР_.ID = $Док.БР | INNER JOIN $ДокументСтроки.ВыпускБР AS ДокС on Док.IDDOC = ДокС.IDDOC |WHERE | Журнал.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~ and | Журнал.IDDOCDEF = $ВидДокумента.ВыпускБР and | Журнал.Closed & 1 = 1 | |UNION all | |SELECT | Журнал.IDDOCDEF Док_вид, | Журнал.IDDOC [Док $Документ], | $Док.БР as [БР_0 $Справочник.ТМЦ], | $БРЗ.Модель as [Модель $Справочник.Модель], | $БРЗ.Рецептура1 as [Рецептура $Справочник.Рецептура], | $Док.ДокНорма as [ДокНорма $Документ.НормыРасхода], //| Sum($Док.Выпуск) Выпуск, //| Sum($Док.КолОтхКром) КолКром, //| Sum($Док.КолОтхПром) КолПром, //| Sum($Док.КолОтхСлитки) as КолСлитки, //| Sum(0) Угар, | $ДокСЗ.Материал as [Материал $Справочник.ТМЦ], | Sum($ДокСЗ.ПоФакту) ПоФакту, | Sum($ДокСЗ.ОтхКромПоФакту) КромПоФакту, | Sum($ДокСЗ.ОтхПромПоФакту) ПромПоФакту, | Sum($ДокСЗ.СлиткиПоФакту) СлиткиПоФакту, | 0 as УгарПоФакту |FROM | _1SJOURN AS Журнал With (NOLOCK) | INNER JOIN $Документ.ВыпускБРзапуска AS Док on Журнал.IDDOC = Док.IDDOC | INNER JOIN $Справочник.ТМЦ AS БРЗ on БРЗ.ID = $Док.БР | INNER JOIN $ДокументСтроки.ВыпускБРЗапуска AS ДокСЗ on Док.IDDOC = ДокСЗ.IDDOC |WHERE | Журнал.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~ and | Журнал.IDDOCDEF = $ВидДокумента.ВыпускБРЗапуска and | Журнал.Closed & 1 = 1 |"; Если ПустоеЗначение(ВыбБР) = 0 Тогда Если ВыбБР.ЭтоГруппа() = 1 Тогда ТекстЗапроса = ТекстЗапроса + " | and $Док.БР in (SELECT Val FROM #ВыбБР) |"; рс.УложитьСписокОбъектов(ВыбБР, "#ВыбБР", "ТМЦ"); Иначе ТекстЗапроса = ТекстЗапроса + " | and $Док.БР = :ВыбБР |"; рс.УстановитьТекстовыйПараметр("ВыбБР", ВыбБР); КонецЕсли; КонецЕсли; ТекстЗапроса = ТекстЗапроса + " |GROUP BY | Журнал.IDDOCDEF, | Журнал.IDDOC, | $Док.БР, | $БР_.Модель, | $БР_.Рецептура1, | $БРЗ.Модель, | $БРЗ.Рецептура1, | $Док.ДокНорма, | $ДокСЗ.Материал, | $ДокС.Материал |"; Сообщить(ТекстЗапроса); рс.УстановитьТекстовыйПараметр("НачДата", НачДата); рс.УстановитьТекстовыйПараметр("КонДата", КонДата); рс.Отладка(1); | |||
| 27
    
        Ёпрст гуру 08.09.20✎ 14:39 | 
        (26) из второго запроса выкини всю типизацию к едрени фени     | |||
| 28
    
        Ёпрст гуру 08.09.20✎ 14:39 | 
        всё что после юниона не должно иметь этого 
 [Док $Документ],...и остальные поля | |||
| 29
    
        trad 08.09.20✎ 14:52 | 
        (26) ответ дан в  (20)     | |||
| 30
    
        trad 08.09.20✎ 14:52 | 
        а в (22) написано как надо     | |||
| 31
    
        trad 08.09.20✎ 14:56 | 
        это чтоб запрос заработал
 Но по сути запрос не верный, с отбором и групбаем туфта полная | |||
| 32
    
        Sserj 08.09.20✎ 15:47 | 
        А почему тема начиналась с запроса по регистрам, а теперь стала по журналу. Не осилил регистры? Может вернуться к первоначальному, так как по регистрам однозначно быстрее будет.     | |||
| 33
    
        Rurouny 09.09.20✎ 08:27 | 
        (32) вернусь к регистру )) так как многие отчеты на регистрах. но это не надолго скоро переход на ERP     | |||
| 34
    
        Mikeware 09.09.20✎ 08:46 | 
        (33) чот вангуется мне, что если вы тут запрос написать не можете, то и в erp будет примерно так же...     | |||
| 35
    
        Ёпрст гуру 09.09.20✎ 09:15 | 
        (34) там же всё из коробки !
 ) | |||
| 36
    
        Mikeware 09.09.20✎ 09:16 | 
        (35) дык галочки не там расставят!     | |||
| 37
    
        Rurouny 14.09.20✎ 08:58 | 
        С запросом разобрался, сделал через конструктор и без проблем, и то что с коробки ERP  и галочки уже расставили, так же уже допилили половину документов под себя, пишем арм для линий, а это, что в 1С7.7 прямые запросы просто через ж.. все сделано (тупо нужно было время переключиться на ПрямЗапр 1С), пишу запросы на MSSQL, MySQL, Firebird и все без проблем. (36) так, что не сцы, сертификаты по ерп имеем и знаем, что и где расставлять. И из коробки там ни хрена нет, все в ручном режиме делается (нужно допиливать многое), всем МИРА.     | |||
| 38
    
        ДенисЧ 14.09.20✎ 09:02 | 
        ИНтересно, в каком больном мозгу могла возникнуть связь между ЕРП и прямыми запросами в 77...     | |||
| 39
    
        Mikeware 14.09.20✎ 09:13 | 
        (38) оно обиделось.     | |||
| 40
    
        МихаилМ 28.09.20✎ 17:19 | 
        как то не стыкуется "пишу запросы на MSSQL, MySQL, Firebird "
 и WHERE | ((ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок+") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок1 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок2 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок3 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок4 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок5 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок6 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок7 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок8 +") | OR (ОперСкладыОстаткиОбороты.ВидДокумента <> "+РегДок9 +") к тому же Журнал.Closed & 1 = 1 убивает обращение к индексу | |||
| 41
    
        trdm 28.09.20✎ 17:32 | 
        (14) > какая религия заставляет писать без использования метапарсера?
 Да у него просто нет скрипта SQLIntellisence.vbs %) | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |