|   |   | 
| 
 | v7: Прямой запрос к регистру не срабатывает условие "перечисление.булево.да" | ☑ | ||
|---|---|---|---|---|
| 0
    
        torinn 28.08.20✎ 14:39 | 
        ВыбДок = СоздатьОбъект("Документ");
 RS = СоздатьОбъект("ODBCRecordset"); RS.УстБД1С(); ТекстЗапроса = " | |SELECT | Рег.Товар as [Тов $Справочник.ТМЦ], | Рег.Склад as [Скл $Справочник.МестаХранения], | Рег.КолЕдИзм1Остаток as Кол |FROM | $РегистрОстатки.ОперСклады as Рег |WHERE | $Скл.РазрешенаОтгрузка = :ВыбСклад"; RS.УстановитьТекстовыйПараметр("ВыбСклад",Перечисление.Булево.Да); RS.УстановитьТекстовыйПараметр("ВыбДата", ВыбДатаФорма); ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса); | |||
| 1
    
        torinn 28.08.20✎ 14:39 | 
        Выдаёт: Meta name parser error: неизвестное метаимя или алиас "$Скл"     | |||
| 2
    
        Mikeware 28.08.20✎ 14:41 | 
        Продолжайте наблюдения.
 Ну, или все-так разбенитесь, что вы хотите, и что предлагаете сделать программе... | |||
| 3
    
        torinn 28.08.20✎ 14:45 | 
        Добавление строки |    Скл.ID as [Элемент $Справочник.МестаХранения],
 тоже ни к чему не привело) | |||
| 4
    
        Kesim 28.08.20✎ 14:45 | 
        (0) не секу в 77, но может быть "ПеречислениЯ....", или просто "Истина"     | |||
| 5
    
        torinn 28.08.20✎ 14:48 | 
        Смысл, в том, чтобы в запрос попадали только те места хранения, у которых реквизит справочника "РазрешенаОтгрузка" был перечислением булево.да     | |||
| 6
    
        Kesim 28.08.20✎ 14:53 | 
        (5) в дереве конфигурации как правильно пишется перечисления или перечисление?     | |||
| 7
    
        Mikeware 28.08.20✎ 14:54 | 
        (5) смысл понятен. 
 Но программа все-таки не обладает искусственным интеллектом. поэтому попробуйте разъяснить ей, что вы хотит сделать (что из каких таблиц брать, как связаны эти таблицы и т.д.) | |||
| 8
    
        torinn 28.08.20✎ 14:54 | 
        перечисление     | |||
| 9
    
        AAA 28.08.20✎ 14:56 | 
        Надо в источники запроса (после FROM) добавить справочник складов, связать его по Id c измерением регистра и наложит на этот справочник требуемое условие отбора     | |||
| 10
    
        mikecool 28.08.20✎ 14:57 | 
        ошибка то не в параметре, а в условии     | |||
| 11
    
        mikecool 28.08.20✎ 14:58 | 
        +10 ОШИБКА - Выдаёт: Meta name parser error: неизвестное метаимя или алиас "$Скл"
 при чем здесь перечисление в параметре??? | |||
| 12
    
        mikecool 28.08.20✎ 14:59 | 
        намекаю - откуда у тебя $Скл ?     | |||
| 13
    
        mikecool 28.08.20✎ 15:00 | 
        прицепить левым Склады и фильтровать по ним     | |||
| 14
    
        AAA 28.08.20✎ 15:01 | 
        (11)естественно
 FROM | $РегистрОстатки.ОперСклады as Рег, | $Справочник.Склады as Скл Откуда бы кй значть что такое у Вас "Скл" По моему рановато Вам прямые запросы писать | |||
| 15
    
        Mikeware 28.08.20✎ 15:01 | 
        (13) Не левым, а внутренним. Но это не столь важно. Важно понять, что в регистре нет никакого "Скл"     | |||
| 16
    
        Mikeware 28.08.20✎ 15:01 | 
        (14) начинать никогда не рано.     | |||
| 17
    
        AAA 28.08.20✎ 15:04 | 
        |    $Справочник.МестаХранения as Скл     | |||
| 18
    
        mikecool 28.08.20✎ 15:14 | 
        (15) хрен значет, говорят левое быстрее, понимаю, что условие на правую таблицу даст внутреннее, но вдруг )     | |||
| 19
    
        AAA 28.08.20✎ 15:19 | 
        Левое или внутреннее к данному вопросу не имеет отношения, это ловля блох     | |||
| 20
    
        torinn 28.08.20✎ 15:32 | 
        Спасибо) Переделал вот так: |
 |SELECT | Рег.Товар as [Тов $Справочник.ТМЦ], | Рег.Склад as [Скл $Справочник.МестаХранения], | Рег.КолЕдИзм1Остаток as Кол |FROM | $РегистрОстатки.ОперСклады as Рег | $Справочник.МестаХранения as Скл |WHERE | $Скл.РазрешенаОтгрузка = :ВыбСклад"; RS.УстановитьТекстовыйПараметр("ВыбСклад", Перечисление.Булево.Да); RS.УстановитьТекстовыйПараметр("ВыбДата", ВыбДатаФорма); Выдаёт - Неправильный синтаксис около конструкции "sc41" sc41 - справочник "МестаХранения" | |||
| 21
    
        Mikeware 28.08.20✎ 15:38 | 
        (20) хреново переделал     | |||
| 22
    
        Mikeware 28.08.20✎ 15:40 | 
        попробуй объяснить товарищу/коллеге/начальнику/сотруднику - что ты хочешь, чтоб он сделал ("вместо сервера")
 т.е. "возьми из таблицы... содержимое столбцов ... там где ... равно... " | |||
| 23
    
        AAA 28.08.20✎ 15:56 | 
        Нет запятой в источниках и нет связи по складам )     | |||
| 24
    
        torinn 28.08.20✎ 16:03 | 
        Спасибо, запятую заметил)     | |||
| 25
    
        torinn 28.08.20✎ 16:08 | 
        Спасибо, заработало)     | |||
| 26
    
        tgu82 31.08.20✎ 12:22 | 
        А почему не так: 
 SELECT | Рег.Товар as [Тов], | Рег.Склад as [Скл], Для чего надо as [Тов $Справочник.ТМЦ] ? Это же итак программе очевидно | |||
| 27
    
        Ёпрст гуру 31.08.20✎ 12:24 | 
        (26) это нужно вк 1сpp для типизации результата, то что в (26) выведет тебе просто id элементов как есть     | |||
| 28
    
        Ёпрст гуру 31.08.20✎ 12:25 | 
        Ну и.. вместо 1000 слов..
 https://www.1cpp.ru/docum/html/ODBC.html | |||
| 29
    
        Salimbek 31.08.20✎ 13:24 | 
        (20) И что за хрень в итоге ты получаешь, ты хотя бы понимаешь?     | |||
| 30
    
        Mikeware 31.08.20✎ 13:41 | 
        (28) вместо 1000 слов ты предложил ему 10550  :-)     | |||
| 31
    
        Salimbek 31.08.20✎ 14:04 | 
        (30) Эт точно )))
 Товарищу из (20) надо бы просто, сначала, сделать запрос: |SELECT TOP 10 | Рег.Товар as Товар, | Рег.Склад as Склад, | Рег.КолЕдИзм1Остаток as Кол |FROM | $РегистрОстатки.ОперСклады as Рег"; И посмотреть на то, что в итоге в табличке получит. А будут там просто ИД-шники. И на этот ИД-шник никак условие $Скл.РазрешенаОтгрузка = :ВыбСклад не натягивается. Потом надо сделать запрос |SELECT TOP 10 | Спр.Id as Идшник, | Спр.Descr as Наименование, | $Спр.РазрешенаОтгрузка as Отгрузка, |FROM | $Справочник.МестаХранения as Спр"; И тоже посмотреть, что вот тут его ИД-шники лежат, и флаги отгрузки. А затем все это останется соединить. Как и писали автору в (7) Выбери такие-то поля из Таблицы Рег, соедини ее с таблицей МестаХранения по условию (поле Рег.Склад должно равняться МестаХранения.ИД). В полученной выборке отбери записи, у которых МестаХранения.РазрешенаОтгрузка = чему-то там. И, кстати, параметры в запросе можно называть как угодно. Не обязательно ставить Перечисление с именем ВыбСклад. Больше подойдет имя флОтгрузка. В итоге получим: |SELECT | Рег.Товар as [Тов $Справочник.ТМЦ], | Рег.Склад as [Скл $Справочник.МестаХранения], | Рег.КолЕдИзм1Остаток as Кол |FROM | $РегистрОстатки.ОперСклады as Рег INNER JOIN | $Справочник.МестаХранения as Скл ON Рег.Склад=Скл.id |WHERE | $Скл.РазрешенаОтгрузка = :флОтгрузка"; RS.УстановитьТекстовыйПараметр("флОтгрузка", Перечисление.Булево.Да); | |||
| 32
    
        tgu82 31.08.20✎ 20:54 | 
        (31) Все вроде понятно кроме
 ON Рег.Склад=Скл.id | |||
| 33
    
        Salimbek 31.08.20✎ 23:58 | 
        (32) Ну смотри, у тебя из Рег получается табличка:
 
А в справочнике МестаХранения 
На самом деле, поля РазрешенаОтгрузка в SQL-е нет, там что-то типа SP327. И, чтобы можно было указывать человеческое "РазрешенаОтгрузка", разработчики 1с++ сделали такую фишку, что можно перед именем поля указать $ и тогда на этапе подготовки этого запроса, 1С++ сама найдет правильное имя для этого поля и подставит его в запрос. Поэтому к ID мы обращаемся как Скл.id, а к РазрешенаОтгрузка - как $Скл.РазрешенаОтгрузка. Далее, вот эти таблицы надо связать между собой. Для этого и используется соединение таблиц командой JOIN которому указываем условие связывания Рег.Склад(например, значение "YYY_ИД_YYY")=Скл.ID(тот же "YYY_ИД_YYY") Получается такая табличка: 
И вот для этой таблички мы уже ставим условие: $Скл.РазрешенаОтгрузка = :флОтгрузка Если надо будет добавить условие на Товар, или какие-то дополнительные поля товара вытащить, то, аналогично, добавляем связывание JOIN к таблице Справочник.ТМЦ с условием Рег.Товар(ХХХ_ИД_ХХХ)=ТМЦ.ID(ХХХ_ИД_ХХХ) Отдельно замечу, что SQL-ю, в общем-то, пофиг, что и с чем связывать, так что ему вполне можно дать команду | $РегистрОстатки.ОперСклады as Рег INNER JOIN | $Справочник.МестаХранения as Скл ON Рег.Товар=Скл.id //<-- тут ошибочно связали ИД от Склада к ИД Товара В итоге получится мусор, но код отработает без проблем. Поэтому надо внимательно смотреть, что и с чем соединяется. Поэтому и претензия к именованию переменных, т.к. условие идет на флаг "РазрешенаОтгрузка", а имя переменной ВыбСклад. Можно легко запутаться. Особенно если запросы километровой длинны. | |||
| 34
    
        Mikeware 01.09.20✎ 08:03 | 
        (32) см.(22)     | |||
| 35
    
        tgu82 01.09.20✎ 09:53 | 
        (34) ДА, спасибо!
 А вот это что: SELECT A.* в SQL-запросе ? Я помню давно из работы с фокспро select поля from базы затем если баз несколько то какие-то варианты их соединения затем where и т.д. А.* это все поля из таблицы А что ли? | |||
| 36
    
        tgu82 01.09.20✎ 10:03 | 
        (35)+ Спасибо. Разобрался вроде. Теперь бы еще разобраться как имена 1С в запросе получаются через $     | |||
| 37
    
        Mikeware 01.09.20✎ 10:13 | 
        (35) Да, это все поля из таблицы А     | |||
| 38
    
        Mikeware 01.09.20✎ 10:23 | 
        (36) Всё очень просто:
 Сказки-обман!© :-) В таблицах 1с поля именуются особым образом: есть предопределенные имена (id, iddoc, descr, deleted, и т.п.) (которым соотвествуют внутренние идентификаторы, или типовые поля - наименование, удален, проведен, дата, и т.п.), а есть добавленные реквизиты, которые в таблице имеют имя SP*****, а в 1с - то, ктоторое им дал разработчик. к первым образаются напрямую - Журнал.isMark, СправочникНоменклатура.id ко вторым можно тоже обращаться напрямую, посмотрев соотвествия в dd/dds (т.е. Журнал.SP1234), а можно поручить разыменовывание имен 1с во внутренние имена полей препроцессору 1с++, и написать $Журнал.МойРеквизит | |||
| 39
    
        torinn 01.09.20✎ 12:02 | 
        Спсасибо всем. Работает.     | |||
| 40
    
        torinn 01.09.20✎ 12:02 | 
        Процедура Сформировать()
 ТЗ=СоздатьОбъект("ТаблицаЗначений"); ВыбДок = СоздатьОбъект("Документ"); Если СокрЛП(ВыбТовар) = "" Тогда ДопУсловие ="(Товар <> '')"; Иначе ДопУсловие ="(Товар = :ВыбТовар)"; КонецЕсли; Если СокрЛП(ВыбСклад) = "" Тогда ДопУсловие2 ="(Склад <> '')"; Иначе ДопУсловие2 ="(Склад = :ВыбСклад)"; КонецЕсли; Если СокрЛП(ВыбГрузополучатель) = "" Тогда ДопУсловие3 ="(Заказ <> '')"; Иначе ДопУсловие3 ="($Зак.Заказчик = :ВыбГрузополучатель)"; КонецЕсли; RS = СоздатьОбъект("ODBCRecordset"); RS.УстБД1С(); ТекстЗапроса = " |SELECT | Рег.Товар as [Тов $Справочник.ТМЦ], | Рег.Склад as [Скл $Справочник.МестаХранения], | Рег.Заказ as [Зак $Справочник.Заказы], | Рег.КолЕдИзм1Остаток as Кол |FROM | $РегистрОстатки.ОперСклады as Рег | INNER JOIN | $Справочник.ТМЦ as Тов ON Рег.Товар=Тов.id |INNER JOIN | $Справочник.МестаХранения as Скл ON Рег.Склад=Скл.id | INNER JOIN | $Справочник.Заказы as Зак ON Рег.Заказ=Зак.id |WHERE | ($Скл.РазрешенаОтгрузка = :флОтгрузка) AND "+ДопУсловие+" AND "+ДопУсловие2+" AND "+ДопУсловие3+" "; RS.УстановитьТекстовыйПараметр("флОтгрузка", Перечисление.Булево.Да); RS.УстановитьТекстовыйПараметр("ВыбТовар", ВыбТовар); RS.УстановитьТекстовыйПараметр("ВыбСклад", ВыбСклад); RS.УстановитьТекстовыйПараметр("ВыбГрузополучатель", ВыбГрузополучатель); ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса); ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку() = 1 Цикл й=1; КонецЦикла; КонецПроцедуры | |||
| 41
    
        Ёпрст гуру 01.09.20✎ 12:06 | 
        Товар <> '' ...это пять     | |||
| 42
    
        Ёпрст гуру 01.09.20✎ 12:08 | 
        И как бэ..соединение лишние
 INNER JOIN | $Справочник.ТМЦ as Тов ON Рег.Товар=Тов.id | |||
| 43
    
        Ёпрст гуру 01.09.20✎ 12:23 | 
        (40) и это...смотри параметры виртуальной таблицы Остатки и накладывай фильтры туда + либо вообще не добавляй условий в текст запроса (свои +Допусловия)
 или хотя бы так where 1=1 and 2=2 ....Текст запроса = СтрЗаменить(ТекстЗапроса,"1=1","$Рег.Вася=:Федя") | |||
| 44
    
        Mikeware 01.09.20✎ 12:33 | 
        (43) как сформировать текст запроса - это вторично. 
 Я вот не уверен, что он представляет себе, что и зачем он пишет... хотя в принципе, так тоже можно - "программировать, не приходя в сознание" | |||
| 45
    
        Андрей_Андреич naïve 01.09.20✎ 12:42 | 
        (43) А правильно все фильтры накладывать "внутри" виртуальной таблицы?     | |||
| 46
    
        Mikeware 01.09.20✎ 12:46 | 
        (45) Ну так меньше остатков-оборотов отберется, быстрее суммируется,  меньше результирующая табличка     | |||
| 47
    
        Андрей_Андреич naïve 01.09.20✎ 12:48 | 
        (46) Так и думал а то разнервичался - вдруг столько лет фигней страдал     | |||
| 48
    
        Mikeware 01.09.20✎ 12:55 | 
        (47) зато я вот задумался - а могут ли "внутренние" фильтры ухудшить работу по сравнению с "внешними".
 Вспомнил, что был один какой-то старый (лет 10 или больше назад) случай -с фильтрами внутри запрос вообще не работал. С наружными отрабатывался на ура. Трассировка в 1CQA клала систему. Спрашивал у кого-то из гуру, типа DmitrO или Садовникова, но им некогда было. в общем, забил. | |||
| 49
    
        Sserj 01.09.20✎ 13:19 | 
        (48) Да легко могут. Если для фильтра нужно произвести несколько соединений то они будут проводиться с допустим десятком тысяч строк движений.
 А после свертки это будет соединение с допустим сотнями или даже десятками. А если уж там что-то не попадающее в индекс при соединении будет то вообще туши свет. | |||
| 50
    
        Sserj 01.09.20✎ 13:23 | 
        +(49) К примеру практически всегда отобрать остатки нужной группы быстрее получив все итоги и потом уже их соединять с номенклатурой и отбирать по группам.     | |||
| 51
    
        Ёпрст гуру 01.09.20✎ 13:26 | 
        (48) если писать без вт Остатки\ОститкиИОбороты , а всё руками, как в дбф, то там таких проблем не возникает :)     | |||
| 52
    
        trad 01.09.20✎ 13:29 | 
        (48) я тебе больше скажу, в некоторых случаях "внешние" фильтры могут стать "внутренними". Оптимизатор такое может     | |||
| 53
    
        Mikeware 01.09.20✎ 13:36 | 
        (51) (52) как говаривал Голд, "ненавижу умные компиляторы"©
 (49) попадание в индексы - отдельная тема. а отношение количества к вариабельности - да, тут что-то есть... | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |