Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Прямой запрос к текстовому реквизиту 1С 7.7

v7: Прямой запрос к текстовому реквизиту 1С 7.7
Я
   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
   Aleksey
 
1 - 01.08.20 - 11:34
% забыл
   Aleksey
 
2 - 01.08.20 - 11:36
LIKE '%"+СтрокаПоиска+"%';
   ObmanOZ
 
3 - 01.08.20 - 12:49
(2) Не, просто не выложил продолжение
_СтрокаПоиска="%"+СокрЛП(Врег(СтрокаПоиска))+"%";
Запрос.УстановитьТекстовыйПараметр("СтрокаПоиска", _СтрокаПоиска);
тз = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
   Ёпрст
 
4 - 01.08.20 - 15:47
(3) забыл апострофы одиночные
   ObmanOZ
 
5 - 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 на моей базе норм отработал.. а что там у ТС в базе - хз, доступа не дал.
   hhhh
 
7 - 03.08.20 - 00:31
может Врег выбросить?
   Злопчинский
 
8 - 03.08.20 - 00:54
(7) там все равно цифры  по ИНН поиск идет
   hhhh
 
9 - 03.08.20 - 06:01
(8) тогда значит у него строка поиска типа число.
   ДенисЧ
 
10 - 03.08.20 - 06:35
(0) Покажи метаданные ИНН из юрморд...
   palpetrovich
 
11 - 03.08.20 - 09:36
Запрос.Отладка(1) - что дает?
и да, непонятно зачем там врег
   Salimbek
 
12 - 03.08.20 - 10:49
+(11) И 
ТекстЗапроса = "
        |SELECT TOP 10
        |    *
        |FROM
        |    $Справочник.ЮрЛица as ЮрЛица";
тоже было бы неплохо посмотреть
   Злопчинский
 
13 - 03.08.20 - 11:44
(10) ну, автор декларирует что это ТИС
.
Спр.ЮрЛица.ИНН - строка, 20, сортировка=1
   MWWRuza
 
14 - 03.08.20 - 11:53
Большого смысла искать ИНН прямым запросом - я не вижу... Там прекрасно ищется/отбирается и по реквизиту, штатными методами, так, как для поля ИНН сортировка=1. Вот искать по реквизиту без сортировки, иногда бывает очень полезно, я для этого в дбф базах запросы SqlLite применяю. Иногда бывает это интереснее, чем добавлять сортировку, и соответственно, дополнительный индекс.
   tgu82
 
15 - 03.08.20 - 12:04
(14) ДБФ сколько индексов не добавляй - мне кажется все равно достаточно шустро если в терминальном режиме работать.
И потом кажется для того же Foxpro технология услоия "For" все равно создает хоть временный индекс.
   Злопчинский
 
16 - 03.08.20 - 12:31
(14) "Там прекрасно ищется/отбирается и по реквизиту" - угу, найди мне когда на вход поступает только ИНН. а вреквизите ИНН стоит ИНН\КПП
   tgu82
 
17 - 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
он тоже корректный, но только на чтение данных, не на изменение
   MWWRuza
 
25 - 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);
    Возврат Контр;
КонецФункции

Может это и несколько "кривовато", но работает... Тогда я об прямых запросах даже и не думал, сделал так, и до сих пор работает...
   MWWRuza
 
26 - 03.08.20 - 14:34
+(25) Но, это ОФФТоп для этой темы... Просто "костыль", как обойти этоу проблему в типовой ТииС...
   Arbuz
 
27 - 03.08.20 - 16:45
(18) современный 1sqlite, стараниями Djelf'а, как раз на тяжёлых и очень тяжёлых запросах работает побыстрее фокса и самый главный плюс - cte, оконные, вот это всё.
   Djelf
 
28 - 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
   Djelf
 
35 - 03.08.20 - 17:56
(31) Дерево на CTE https://cloud.mail.ru/public/2T4u/3RNG17VkX
Оконки не использую (у меня лапки), но оно работает!
   Djelf
 
36 - 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) запилить бы.. эх... с фильтрами, упорядочиванием/сортировкой по колонкам... этакий журнал... хорошо бы... но никаки.. никак.. все руки не дойдут...
   Djelf
 
40 - 04.08.20 - 08:03
(37) Цимус в том что дерево справочника на табличном поле без cte сложно сделать, а с cte очень просто.
А если прикрутить оконки, можно легко и быстро посчитать и итоги по группам этого дерева.

Ну а привязки там не нужны вообще. Это кусок древнего эксперимента, можно выкинуть.
   ObmanOZ
 
41 - 04.08.20 - 16:58
Спасибо еще раз всем за советы, перечитал ветку, переделал. Косяк явно у меня в базе, ток я не знаю пока какой
В свойствах реквизита ИНН стоит Строка, длина 20, с флагом Сортировка
Хотел еще показать что находит поиск на прямом запросе по ИНН по строке с значением "2" - https://prnt.sc/ttvlp5
Обработина говорит что вот искомый элемент, причем на форме у меня все иначе и че с этим делать я пока не в курсе
   Djelf
 
42 - 04.08.20 - 17:14
(41) Чудеса, like поиск по "2" должен выдавать значительно больше одного значения!
Скинь весь код поиска, где то ты ошибаешься...
   Ёпрст
 
43 - 04.08.20 - 17:23
(42) top 1 ? )
   Djelf
 
44 - 04.08.20 - 17:35
(43) Возможно, но не верю что именно этот Юрик попал в топ1. Вероятность очень мала.
   ObmanOZ
 
45 - 04.08.20 - 18:02
(42) Эта обработина с форума 1сpp, я ее привожу в пример, т.к. там люди его написавшие в мульон раз мудрее меня) Ссылка на обработину https://yadi.sk/d/aRyFeLmtnDGJ7g
мой же дает аналогичный результат... выкладываю фотками ) мой вариант - https://prnt.sc/ttx0ht
Результат - https://prnt.sc/ttx1cj
   ObmanOZ
 
46 - 04.08.20 - 18:03
(43) Нихт топ 1
   Ёпрст
 
47 - 04.08.20 - 18:07
да уж..
дбф у тя что ле ?
   ObmanOZ
 
48 - 04.08.20 - 18:09
(47) Уху, я разве не упоминал этого, да? Прошу простить, согласен, эт было важно!
   Djelf
 
49 - 04.08.20 - 18:10
(48) Ну ты жжешь, топ1 при поиске по like это круто ;)
   ObmanOZ
 
50 - 04.08.20 - 18:12
(49) Эм, не понял где у меня том 1 по при like ? ) Чет туплю, тыкните пжл )
   ObmanOZ
 
51 - 04.08.20 - 18:15
(47) Проверил обработку Поиска на скульной базе ТИСа, поиск по ИНН отрабатывает нормально
   Ёпрст
 
52 - 04.08.20 - 18:16
Короче


|where ЮрЛица.ИНН LIKE '%"+ПодСтрокаП+"%'
|";

и выкини установку параметров. Усё.
   ObmanOZ
 
53 - 04.08.20 - 18:21
   Djelf
 
54 - 04.08.20 - 18:26
У тебя СтрокаПоиска видимо на форме сидит, зачем закомментировал _СтрокаПоиска?
Ну и там с "%" разберись - лишние не нужны.
   ObmanOZ
 
55 - 04.08.20 - 18:32
(54) Так попровал вариант по совету Ёпрст, на форме своей обработки есть текстовый реквизит СтрокаПоиска, его видно на втором скрине, попробовал без УстановитьТекстовыйПараметр.
Я если чесна не думаю что проблема в моем запросе ) я уже даже в этом уверен ) Меняем в моем варианте ИНН на Descr и все прекрасно отрабатывает.
   Salimbek
 
56 - 04.08.20 - 18:39
(55) А так: LIKE '%"+СокрЛП(СтрокаПоиска)+"%'
???
А то может у тебя там пробелы еще попадают и получается, что ищет что-то похожее на "хххх2    хххх"
   ObmanOZ
 
57 - 04.08.20 - 18:42
(56) Вы были правы, но результат вернулся только 1 опять МОС АВС
   Salimbek
 
58 - 04.08.20 - 18:45
(57) А у тебя там реально ИНН такой "4525000... Банк" ???
   ObmanOZ
 
59 - 04.08.20 - 18:51
   Salimbek
 
60 - 04.08.20 - 18:51
+(58) Посмотрел, вроде ИНН другой "503107..." - почему же он в этом запросе тебе вернул какую-то другую ерунду?
Надо бы сделать следующее:
Испытать запрос "Select * FROM
        |    $Справочник.ЮрЛица as ЮрЛица
        |WHERE $ЮрЛица.ИНН LIKE (:СтрокаПоиска)"; и посмотреть - какие поля вообще выйдут
Посмотреть - в каком поле будет ИНН "503107..."
 
 Рекламное место пустует
   Salimbek
 
61 - 04.08.20 - 18:53
+(60) Судя по запросу - у тебя ИНН - это поле sp494 - посмотреть можно тогда в файле 1с.DD в каталоге базы - действительно ли так.
   ObmanOZ
 
62 - 04.08.20 - 18:53
(60) https://prnt.sc/tty04s
нет нигде
   ObmanOZ
 
63 - 04.08.20 - 18:55
(61) https://prnt.sc/tty18c - действительно так)
   Salimbek
 
64 - 04.08.20 - 18:58
(62) Хм, странно. Может просто индекс порушенный, удалить этот файл SC493.CDX и пусть 1С-ка базу переиндексирует.
   ObmanOZ
 
65 - 04.08.20 - 19:00
(64) Удалял все CDX, прям ваще все, переиндексировал и все осталось как прежде ) Прямой запрос не тащит этот реквизит ) sqlite  - тащит , обычным запросом - тащит ) Проблема в прямом )
   Salimbek
 
66 - 04.08.20 - 19:02
(65) Там и в поле sp497 тоже какая-то ерунда.
   Salimbek
 
67 - 04.08.20 - 19:07
(65) Тогда единственное, что может сказаться, это поле sp498 с длиной 900 - может оно как-то не так хранится в базе и FoxPro из-за него криво поля вытаскивает?
   Salimbek
 
68 - 04.08.20 - 19:10
Вообще говоря, странно, как оно работает: http://www.foxclub.ru/rhproject/project/html/6e27027b-806b-4f96-b7e5-5f24af2901e0.htm
Максимальный размер символьных полей.  - 254
   Salimbek
 
69 - 04.08.20 - 19:12
к (65) Кстати, а в Полном наименовании у этого МОС АВС есть это строки:
"45250000104 Банк: ГУ"
и
"Банка России"
   ObmanOZ
 
70 - 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С++ фыорума на типовоцй ТИС все норм на дбф отрабатывает, и скулайт тестовый примерчик набросали - тоже все ок, на этом время кончилось, а прямо в базу не смотрел...
ну вот и разрешилось все...


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.