Имя: Пароль:
1C
1C 7.7
v7: Прямой запрос к текстовому реквизиту 1С 7.7
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
(52) https://prnt.sc/ttxdxt
https://prnt.sc/ttxea0

не взлетело
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
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С++ фыорума на типовоцй ТИС все норм на дбф отрабатывает, и скулайт тестовый примерчик набросали - тоже все ок, на этом время кончилось, а прямо в базу не смотрел...
ну вот и разрешилось все...