|
v7: Прямой запрос к текстовому реквизиту 1С 7.7 , PHAISTOS
| ☑ | ||
---|---|---|---|---|
0
ObmanOZ
01.08.20
✎
11:08
|
Всем добрый день! Может кто работал с прямыми запросами и сталкивался с подобным...
Пишу простой запрос по поиску в справочнике ЮрЛица в ТИСе по части ИНН ТекстЗапроса = " |SELECT | ЮрЛица.ID as [Элемент $Справочник.ЮрЛица] |FROM | $Справочник.ЮрЛица as ЮрЛица |WHERE $ЮрЛица.ИНН LIKE (:СтрокаПоиска)"; Чтобы я не подставлял в СтрокаПоиска - результат всегда пустой, в справочнике есть искомый мной элемент, обычным запросом по четкому поиску результат нахожу. На форуме 1срр скачал обработку поиска по подстрокам https://www.1cpp.ru/forum/YaBB.pl?num=1211491690/0 и в ней не ищет по части ИНН, но эта обработка отображает колонки со значением реквизитов, так вот у меня показывает в ней что ИНН пустая, наименование и код - есть, а вот ИНН именно пустые.. вот для примера скрин где видно что реквизит заполнен но в обработине колонка пустая https://prnt.sc/ts6qgo Может кто-нибудь в курсе почему так? ИНН обычный текстовый реквизит с длиной 20 |
|||
1
Aleksey
01.08.20
✎
11:34
|
% забыл
|
|||
2
Aleksey
01.08.20
✎
11:36
|
LIKE '%"+СтрокаПоиска+"%';
|
|||
3
ObmanOZ
01.08.20
✎
12:49
|
(2) Не, просто не выложил продолжение
_СтрокаПоиска="%"+СокрЛП(Врег(СтрокаПоиска))+"%"; Запрос.УстановитьТекстовыйПараметр("СтрокаПоиска", _СтрокаПоиска); тз = Запрос.ВыполнитьИнструкцию(ТекстЗапроса); |
|||
4
Ёпрст
01.08.20
✎
15:47
|
(3) забыл апострофы одиночные
|
|||
5
ObmanOZ
02.08.20
✎
22:07
|
(4) Пасиб за ответ, перепроверил, с апострофами получаю ошибку. FAILED! ICommandText::Execute(): Function argument value, type, or count is invalid.
Так и не разобрался почему именно прямой запрос не видит реквизит ИНН. запрос на SQlite отработал |
|||
6
Злопчинский
02.08.20
✎
22:26
|
(4) запрос и на VFP на моей базе норм отработал.. а что там у ТС в базе - хз, доступа не дал.
|
|||
7
hhhh
03.08.20
✎
00:31
|
может Врег выбросить?
|
|||
8
Злопчинский
03.08.20
✎
00:54
|
(7) там все равно цифры по ИНН поиск идет
|
|||
9
hhhh
03.08.20
✎
06:01
|
(8) тогда значит у него строка поиска типа число.
|
|||
10
ДенисЧ
03.08.20
✎
06:35
|
(0) Покажи метаданные ИНН из юрморд...
|
|||
11
palpetrovich
03.08.20
✎
09:36
|
Запрос.Отладка(1) - что дает?
и да, непонятно зачем там врег |
|||
12
Salimbek
03.08.20
✎
10:49
|
+(11) И
ТекстЗапроса = " |SELECT TOP 10 | * |FROM | $Справочник.ЮрЛица as ЮрЛица"; тоже было бы неплохо посмотреть |
|||
13
Злопчинский
03.08.20
✎
11:44
|
(10) ну, автор декларирует что это ТИС
. Спр.ЮрЛица.ИНН - строка, 20, сортировка=1 |
|||
14
MWWRuza
гуру
03.08.20
✎
11:53
|
Большого смысла искать ИНН прямым запросом - я не вижу... Там прекрасно ищется/отбирается и по реквизиту, штатными методами, так, как для поля ИНН сортировка=1. Вот искать по реквизиту без сортировки, иногда бывает очень полезно, я для этого в дбф базах запросы SqlLite применяю. Иногда бывает это интереснее, чем добавлять сортировку, и соответственно, дополнительный индекс.
|
|||
15
tgu82
03.08.20
✎
12:04
|
(14) ДБФ сколько индексов не добавляй - мне кажется все равно достаточно шустро если в терминальном режиме работать.
И потом кажется для того же Foxpro технология услоия "For" все равно создает хоть временный индекс. |
|||
16
Злопчинский
03.08.20
✎
12:31
|
(14) "Там прекрасно ищется/отбирается и по реквизиту" - угу, найди мне когда на вход поступает только ИНН. а вреквизите ИНН стоит ИНН\КПП
|
|||
17
tgu82
03.08.20
✎
12:34
|
(16) так не найдешь. там условие будет типа "содержит" хотя могут быть с одним инн и разными кпп - и как вообще искать тогда?
|
|||
18
Ёпрст
03.08.20
✎
12:42
|
Для дбф, запрос через оледб выполняется в большинстве запросов быстрее, чем sqllite, если правильно написан и попадает в индекс.
Единственное, на sqllite писать проще, ессть уложитьтз, поставщик данных и прочие плюшки. Но, если тяжелый запрос или изменения данных, то тут лучше фокс. |
|||
19
Злопчинский
03.08.20
✎
12:45
|
(18) я вот вообще нулевый.
есть оледб, есть одбц - это вообще как и что? |
|||
20
Ёпрст
03.08.20
✎
13:09
|
(19) натрави гугл..
odbc oledb vfpoledb |
|||
21
Ёпрст
03.08.20
✎
13:10
|
Если че, корректно с дбф работает только vfpoledb, с sql - odbc обычно используют
|
|||
22
Злопчинский
03.08.20
✎
13:16
|
(21) "Если че, корректно с дбф работает только vfpoledb"
- а SQLite тогда зачем если он "некорректный"..? |
|||
23
Ёпрст
03.08.20
✎
14:06
|
(22) ты про него не спрашивал
|
|||
24
Ёпрст
03.08.20
✎
14:07
|
он тоже корректный, но только на чтение данных, не на изменение
|
|||
25
MWWRuza
гуру
03.08.20
✎
14:31
|
(16) Ну, да, есть такое...
Если база не большая, и контрагентов не миллион - то я когда-то очень давно такую функцию делал: Функция НайтиКонтрагентаПоИННбезКПП(ИННКПП) Экспорт ИНН = ВыделитьИНН(ИННКПП); Спр = СоздатьОбъект("Справочник.ЮрЛица"); ТЗ = СоздатьОбъект("ТаблицаЗначений"); ТЗ.НоваяКолонка("КодКонтрагента"); ТЗ.НоваяКолонка("ЮЛ","Справочник.ЮрЛица"); ТЗ.НоваяКолонка("Контрагент","Справочник.Контрагенты"); ТЗ.НоваяКолонка("ИНН"); ТЗ.НоваяКолонка("КПП"); ТЗ.НоваяКолонка("КодГруппыКонтр"); Спр.ВыбратьЭлементы(0); Пока Спр.ПолучитьЭлемент() = 1 Цикл Если Спр.ЭтоГруппа() = 1 Тогда Продолжить; КонецЕсли; Если СокрЛП(Спр.ИНН) = "" Тогда Продолжить; КонецЕсли; ТекИНН = ВыделитьИНН(СокрЛП(Спр.ИНН)); Если ТекИНН = ИНН Тогда ТЗ.НоваяСтрока(); ТЗ.КодКонтрагента = СокрЛП(Спр.Владелец.Код); ТЗ.ЮЛ = Спр.ТекущийЭлемент(); ТЗ.Контрагент = Спр.Владелец; ТЗ.ИНН = ТекИНН; ТЗ.КПП = ВыделитьКПП(СокрЛП(Спр.ИНН)); ТЗ.КодГруппыКонтр = СокрЛП(Спр.Владелец.Родитель.Код); КонецЕсли; КонецЦикла; Если ТЗ.КоличествоСтрок() = 0 Тогда Возврат 0; // Ничего не нашли... КонецЕсли; // При выборе контрагента будем отдавать предпочтение "Поставщикам", так, как по ним могут быть движения по регистрам, // а производители только элементы справочника, их можно объединять, пореподчинять, удалять лишних и т.д... Стр = ""; Если ТЗ.НайтиЗначение(СокрЛП(Константа.ГрПоставщиковАлкоголя),"Стр","КодГруппыКонтр") = 1 Тогда ТЗ2 = СоздатьОбъект("ТаблицаЗначений"); ТЗ.Выгрузить(ТЗ2); ТЗ2.УдалитьСтроки(); ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку() = 1 Цикл Если СокрЛП(ТЗ.КодГруппыКонтр) = СокрЛП(Константа.ГрПоставщиковАлкоголя) Тогда ТЗ2.НоваяСтрока(); ТЗ2.КодКонтрагента = ТЗ.КодКонтрагента; ТЗ2.ЮЛ = ТЗ.ЮЛ; ТЗ2.Контрагент = ТЗ.Контрагент; ТЗ2.ИНН = ТЗ.ИНН; ТЗ2.КПП = ТЗ.КПП; ТЗ2.КодГруппыКонтр = ТЗ.КодГруппыКонтр; КонецЕсли; КонецЦикла; ТЗ2.Выгрузить(ТЗ); КонецЕсли; // ****************************************************************************************************************** ТЗ.Сортировать("КодКонтрагента"); Контр = ТЗ.ПолучитьЗначение(1,3); Возврат Контр; КонецФункции Может это и несколько "кривовато", но работает... Тогда я об прямых запросах даже и не думал, сделал так, и до сих пор работает... |
|||
26
MWWRuza
гуру
03.08.20
✎
14:34
|
+(25) Но, это ОФФТоп для этой темы... Просто "костыль", как обойти этоу проблему в типовой ТииС...
|
|||
27
Arbuz
03.08.20
✎
16:45
|
(18) современный 1sqlite, стараниями Djelf'а, как раз на тяжёлых и очень тяжёлых запросах работает побыстрее фокса и самый главный плюс - cte, оконные, вот это всё.
|
|||
28
Djelf
03.08.20
✎
17:07
|
(27) Это не совсем так ;)
Элементарный запрос SELECT sum(Количество) FROM Регистр_ПартииНаличие
на фоксе в 2 раза быстрее 1sqlite, но это только в транзакции 1sqlite, а без транзакции фокс в 30 раз быстрее!!! Не нашел нормального плагина к sqlite чтобы читать dbf в обход 1С, а то бы прикрутил ;( Но, это без индекса же. С индексами ситуация может сильно поменяться, в 1sqlite попадание в индекс сейчас почти идеальное, а с фоксом конструирование попадания в индекс - дикая головная боль. В любом случае 1sqlite быстрее черных запросов, ну а если кто cte и оконки освоит то фокс однозначно в пролете ;) |
|||
29
Ёпрст
03.08.20
✎
17:10
|
(27) неа
|
|||
30
Ёпрст
03.08.20
✎
17:12
|
(28) это точно. Написать запрос с попаданием в нужный индекс, на фоксе еще уметь надо и проверить, чтоб работатл.
Зато если напишешь..летает :) |
|||
31
Злопчинский
03.08.20
✎
17:14
|
(28) " cte и оконки" - а где почитать что это такое и фобще что за фейхоа врукт?
|
|||
32
Ёпрст
03.08.20
✎
17:15
|
Если кому интересна скорость, вот, примитивный запрос
https://cloud.mail.ru/public/AeJK/71o1vuzd1 и , для быстрой обработки движений там расскоментить надо, будет еще быстрее |
|||
33
Ёпрст
03.08.20
✎
17:15
|
(21) оконные функции жешь
|
|||
34
Ёпрст
03.08.20
✎
17:16
|
||||
35
Djelf
03.08.20
✎
17:56
|
(31) Дерево на CTE https://cloud.mail.ru/public/2T4u/3RNG17VkX
Оконки не использую (у меня лапки), но оно работает! |
|||
36
Djelf
03.08.20
✎
18:38
|
А у (0) правильно справил ДенисЧ в (10), может он и текстовой, но переделан в периодический.
Когда вы в последнее время видели "Девственно чистую" ТиС? |
|||
37
Злопчинский
04.08.20
✎
00:44
|
(35) Лапки - ??
. из 500 строк кода - 250 = привязки. "нужен ли нам такой футбол"..? ;-) . Запустил. работает. Показывает дерево справочника. В чем цимус? я неграмотный. |
|||
38
Злопчинский
04.08.20
✎
00:46
|
(35) из всего этого меня впечатлило как меняется ширина колонок при таскании мышкой ширины люой колонки...
|
|||
39
Злопчинский
04.08.20
✎
00:48
|
у меня монитор заявок на прямых запросах. делает все что надо, но выглядит ублюдочно, ибо на ТЗ, а вот если как в (35) запилить бы.. эх... с фильтрами, упорядочиванием/сортировкой по колонкам... этакий журнал... хорошо бы... но никаки.. никак.. все руки не дойдут...
|
|||
40
Djelf
04.08.20
✎
08:03
|
(37) Цимус в том что дерево справочника на табличном поле без cte сложно сделать, а с cte очень просто.
А если прикрутить оконки, можно легко и быстро посчитать и итоги по группам этого дерева. Ну а привязки там не нужны вообще. Это кусок древнего эксперимента, можно выкинуть. |
|||
41
ObmanOZ
04.08.20
✎
16:58
|
Спасибо еще раз всем за советы, перечитал ветку, переделал. Косяк явно у меня в базе, ток я не знаю пока какой
В свойствах реквизита ИНН стоит Строка, длина 20, с флагом Сортировка Хотел еще показать что находит поиск на прямом запросе по ИНН по строке с значением "2" - https://prnt.sc/ttvlp5 Обработина говорит что вот искомый элемент, причем на форме у меня все иначе и че с этим делать я пока не в курсе |
|||
42
Djelf
04.08.20
✎
17:14
|
(41) Чудеса, like поиск по "2" должен выдавать значительно больше одного значения!
Скинь весь код поиска, где то ты ошибаешься... |
|||
43
Ёпрст
04.08.20
✎
17:23
|
(42) top 1 ? )
|
|||
44
Djelf
04.08.20
✎
17:35
|
(43) Возможно, но не верю что именно этот Юрик попал в топ1. Вероятность очень мала.
|
|||
45
ObmanOZ
04.08.20
✎
18:02
|
(42) Эта обработина с форума 1сpp, я ее привожу в пример, т.к. там люди его написавшие в мульон раз мудрее меня) Ссылка на обработину https://yadi.sk/d/aRyFeLmtnDGJ7g
мой же дает аналогичный результат... выкладываю фотками ) мой вариант - https://prnt.sc/ttx0ht Результат - https://prnt.sc/ttx1cj |
|||
46
ObmanOZ
04.08.20
✎
18:03
|
(43) Нихт топ 1
|
|||
47
Ёпрст
04.08.20
✎
18:07
|
да уж..
дбф у тя что ле ? |
|||
48
ObmanOZ
04.08.20
✎
18:09
|
(47) Уху, я разве не упоминал этого, да? Прошу простить, согласен, эт было важно!
|
|||
49
Djelf
04.08.20
✎
18:10
|
(48) Ну ты жжешь, топ1 при поиске по like это круто ;)
|
|||
50
ObmanOZ
04.08.20
✎
18:12
|
(49) Эм, не понял где у меня том 1 по при like ? ) Чет туплю, тыкните пжл )
|
|||
51
ObmanOZ
04.08.20
✎
18:15
|
(47) Проверил обработку Поиска на скульной базе ТИСа, поиск по ИНН отрабатывает нормально
|
|||
52
Ёпрст
04.08.20
✎
18:16
|
Короче
|where ЮрЛица.ИНН LIKE '%"+ПодСтрокаП+"%' |"; и выкини установку параметров. Усё. |
|||
53
ObmanOZ
04.08.20
✎
18:21
|
||||
54
Djelf
04.08.20
✎
18:26
|
У тебя СтрокаПоиска видимо на форме сидит, зачем закомментировал _СтрокаПоиска?
Ну и там с "%" разберись - лишние не нужны. |
|||
55
ObmanOZ
04.08.20
✎
18:32
|
(54) Так попровал вариант по совету Ёпрст, на форме своей обработки есть текстовый реквизит СтрокаПоиска, его видно на втором скрине, попробовал без УстановитьТекстовыйПараметр.
Я если чесна не думаю что проблема в моем запросе ) я уже даже в этом уверен ) Меняем в моем варианте ИНН на Descr и все прекрасно отрабатывает. |
|||
56
Salimbek
04.08.20
✎
18:39
|
(55) А так: LIKE '%"+СокрЛП(СтрокаПоиска)+"%'
??? А то может у тебя там пробелы еще попадают и получается, что ищет что-то похожее на "хххх2 хххх" |
|||
57
ObmanOZ
04.08.20
✎
18:42
|
(56) Вы были правы, но результат вернулся только 1 опять МОС АВС
|
|||
58
Salimbek
04.08.20
✎
18:45
|
(57) А у тебя там реально ИНН такой "4525000... Банк" ???
|
|||
59
ObmanOZ
04.08.20
✎
18:51
|
(58) неа https://prnt.sc/ttvlp5
|
|||
60
Salimbek
04.08.20
✎
18:51
|
+(58) Посмотрел, вроде ИНН другой "503107..." - почему же он в этом запросе тебе вернул какую-то другую ерунду?
Надо бы сделать следующее: Испытать запрос "Select * FROM | $Справочник.ЮрЛица as ЮрЛица |WHERE $ЮрЛица.ИНН LIKE (:СтрокаПоиска)"; и посмотреть - какие поля вообще выйдут Посмотреть - в каком поле будет ИНН "503107..." |
|||
61
Salimbek
04.08.20
✎
18:53
|
+(60) Судя по запросу - у тебя ИНН - это поле sp494 - посмотреть можно тогда в файле 1с.DD в каталоге базы - действительно ли так.
|
|||
62
ObmanOZ
04.08.20
✎
18:53
|
(60) https://prnt.sc/tty04s
нет нигде |
|||
63
ObmanOZ
04.08.20
✎
18:55
|
(61) https://prnt.sc/tty18c - действительно так)
|
|||
64
Salimbek
04.08.20
✎
18:58
|
(62) Хм, странно. Может просто индекс порушенный, удалить этот файл SC493.CDX и пусть 1С-ка базу переиндексирует.
|
|||
65
ObmanOZ
04.08.20
✎
19:00
|
(64) Удалял все CDX, прям ваще все, переиндексировал и все осталось как прежде ) Прямой запрос не тащит этот реквизит ) sqlite - тащит , обычным запросом - тащит ) Проблема в прямом )
|
|||
66
Salimbek
04.08.20
✎
19:02
|
(65) Там и в поле sp497 тоже какая-то ерунда.
|
|||
67
Salimbek
04.08.20
✎
19:07
|
(65) Тогда единственное, что может сказаться, это поле sp498 с длиной 900 - может оно как-то не так хранится в базе и FoxPro из-за него криво поля вытаскивает?
|
|||
68
Salimbek
04.08.20
✎
19:10
|
Вообще говоря, странно, как оно работает: http://www.foxclub.ru/rhproject/project/html/6e27027b-806b-4f96-b7e5-5f24af2901e0.htm
Максимальный размер символьных полей. - 254 |
|||
69
Salimbek
04.08.20
✎
19:12
|
к (65) Кстати, а в Полном наименовании у этого МОС АВС есть это строки:
"45250000104 Банк: ГУ" и "Банка России" |
|||
70
ObmanOZ
04.08.20
✎
19:14
|
(69) Вы правы, исправил длину на 254 - и все взлетело) спасибо! Отрабатывает четко, по запросу 2 - сотни найденных контрагентов.
|
|||
71
Злопчинский
04.08.20
✎
20:55
|
кстати, если оставить 900 и сдвинуть ПолнНаименование вниз списка реквизитов то может и прокатит.
если нет то ради интереса проверить - прямым запрсоом сделать не Select Descr, ИНН - а Select ИНН, Descr - тоже может прокатит. . и вообще сделать 900 для фиксированной тсроки - это сильное колдунство. 100, 150 - ладно еще, если больше - делать уже строкой неогр.длины |
|||
72
Злопчинский
04.08.20
✎
20:57
|
до (56) пункта с ТС еще позавчера отработали, и упомянутая обработка с 1С++ фыорума на типовоцй ТИС все норм на дбф отрабатывает, и скулайт тестовый примерчик набросали - тоже все ок, на этом время кончилось, а прямо в базу не смотрел...
ну вот и разрешилось все... |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |