|
v7: Побуквенный подбор из справочника | ☑ | ||
---|---|---|---|---|
0
jah1111
05.08.20
✎
13:44
|
Есть справочник Справочник.ТМЦ
В нем есть поле ввода ПолеПоиск Возможно ли реализовать чтоб при вводе каждой последуещей буквы в ПолеПоиск выполнялся поиск в справочнике и активизация строки? пока сделал так: Процедура ПоискПоБукв() ТабПоиск = СоздатьОбъект("Справочник.ТМЦ"); Поиск= ТабПоиск.НайтиПоНаименованию(ПолеПоиск,0,0); ТоварП = ТабПоиск.ТекущийЭлемент(); АктивизироватьОбъект(ТоварП); КонецПроцедуры //ПоискПоБукв() а как реализовать, так сказать, динамический поиск? (похож на штатный поиск в справочнике когда активирована строка справочника и вводишь имя элемента с клавиатуры). на вопросы "Зачем?" сразу отвечаю "Да, ТСД". "Нет, я не наркоман". :) |
|||
1
Ёпрст
05.08.20
✎
13:53
|
(0) штатно, нет
если религия позволяет, то активикс на форме и прямой запрос для поиска |
|||
2
Ёпрст
05.08.20
✎
13:53
|
недавно тут кто-то вспоминал былое
|
|||
3
jah1111
05.08.20
✎
13:59
|
если не затруднит, ссылочку
|
|||
4
Ёпрст
05.08.20
✎
14:31
|
||||
5
Ёпрст
05.08.20
✎
14:37
|
||||
6
MWWRuza
гуру
06.08.20
✎
12:03
|
+(4) Это мое поделие... Там, в теме, есть ссылки для скачки. У меня у пользователей на продуктиве работает, в принципе - всем нравится.
|
|||
7
jah1111
06.08.20
✎
21:04
|
(5) там все очень красиво, но у меня срабатывает только по "ентер"
если кто шарит в чем проблема - помогите |
|||
8
jah1111
06.08.20
✎
21:05
|
win10 64
|
|||
9
Злопчинский
06.08.20
✎
21:22
|
(7) Формекс стоит? 1С++ стоит? указанные в комментах компоненты - установлены?
|
|||
10
jah1111
06.08.20
✎
21:32
|
(9) да.... ну разве может версии не те....
|
|||
11
Ёпрст
06.08.20
✎
22:46
|
(7) дык доработать надо, в классе подменять поле на активикс в котором пасти нажатия клавиш, но, это уже будет совсем другая поделка.
А так, смотри (4) там есть примеры перехвата нажатий и поиск. Просто в (5) - попытка универсально сделать везде. Можно и доработать, только кому это надо нынче ?) Снеговик же на марше |
|||
12
victuan1
07.08.20
✎
06:14
|
(11) Надо. У меня все клиенты на 7.7 и их очень много, постоянно обращаются новые, но я их не беру, т.к. некуда уже. Для 1с8 времени совсем нет, т.к. даже 1С 7.7 не успеваю заниматься.
|
|||
13
Креатив
07.08.20
✎
09:09
|
(12)Открой фирму, найми рабов.
|
|||
14
jah1111
07.08.20
✎
09:14
|
(13) на 7.7 очень много людей сидит, возможно фирма имела бы успех
|
|||
15
jah1111
07.08.20
✎
09:17
|
(11) жалко, я думал (5) таки внатуре "алявосьмерка"
|
|||
16
Сияющий в темноте
07.08.20
✎
09:41
|
основное поеимущество побукаенного поиска в браузере а том,что поиск выполняется на сераере параллельно со вводом пользователя и поток пользователя делает только отправку запроса и показ результата.
|
|||
17
trdm
07.08.20
✎
09:42
|
(12) Есть свободное время, перекидывай заказы.
|
|||
18
obs191
07.08.20
✎
11:57
|
(12) Если неспешно устроит, то могу помочь удаленно.
|
|||
19
jah1111
07.08.20
✎
17:41
|
(17) (18) эй, если у вас времени так много, то "алявосьмерку" допилите
ато разОФФтопились тут :) а я то, наверное, не сдюжу - слишком тяжело для меня |
|||
20
Злопчинский
07.08.20
✎
18:39
|
и эти люди глумятся надо мной что я на клюшках сижу...
|
|||
21
Djelf
07.08.20
✎
18:54
|
(20) Кто эти люди? оО В этой теме ни одного негатива нет.
А для (0): если ТСД - нарисуй свою клавиатуру на 1С с любым подбором по любому параметру. Что-то типа дополнительного "Поиск" внизу формы, ну а дальше - любые фантазии. Не уверен что от ТСД можно в 7.7 поймать событие "Нажатие кнопки". |
|||
22
Злопчинский
07.08.20
✎
19:45
|
(21) "нажатие кнопки"
я хз, что там нужно, но у себя на ТСД в 77 я работаю по нажатиям клавиш в поле ввода. на нормально построенных процессах где используется ТСД как командное устройство (отдающее команды и принимающее подтверждения) - делать какие-то быстрые поиски по нажатию каждой клавиши (типа быстрого поиска в 8-ке) - это настолько редкие и форсмажорные случаи - что ими можно вообще нахер пренебречь и совершенно спокойно отрабатывать "по энтеру". |
|||
23
Злопчинский
07.08.20
✎
19:46
|
(21) и с учетом того что на ТСД отлавливаются формексовские ПриНажатииКлавиши - то вообщем все нормально.
|
|||
24
jah1111
07.08.20
✎
23:11
|
(22)
"но у себя на ТСД в 77 я работаю по нажатиям клавиш в поле ввода." не совсем понял, что Вы имеете в виду |
|||
25
Злопчинский
07.08.20
✎
23:19
|
(24) на ТСД - форма. на форме - единственное поле ввода (видимое или сдвинутое за экран).
на компе/серевре - никаких допдрайверов не стоит. ТСД работает в разрыв клавиатуры. все. дальше смотри по ссылке (и там есть ссылки на предыдущее) http://forums.kuban.ru/f1040/0_5off_%2A_6_ill_back_ili_ckromnost-_ukrashaet_kogda_net_drugih_dostoinstv-8764164.html по этой ссылке - АРМ на ПК - но сделан так, что на ТСД переносится на раз. в более ранних ссылках-ветках - там ТСД-шных экранов вагоy. втыкай. если что непонятно - стучись в личку скайп Zlopun |
|||
26
Злопчинский
07.08.20
✎
23:20
|
вот тебе пример рабочего экрана ТСД
https://content.screencast.com/users/Che66/folders/Jing/media/9bea5e80-c08d-43f1-ad48-7337c537d94d/2018-06-06_2202.png |
|||
27
Злопчинский
07.08.20
✎
23:22
|
||||
28
Злопчинский
07.08.20
✎
23:23
|
||||
29
Злопчинский
07.08.20
✎
23:34
|
вот здесь рабочая каркасная демо-конфига для ТСД
http://catalog.mista.ru/public/266256/ |
|||
30
trdm
08.08.20
✎
09:32
|
(19) я бы эту задачу решал на более низком уровне.
|
|||
31
jah1111
08.08.20
✎
10:13
|
(30) выслушаю и Вас
|
|||
32
jah1111
09.08.20
✎
21:45
|
Это все актуально не так для ТСД как для сенсорных мониторов, поэтому я так настаиваю на "алявосьморке".
Вот еще нашел: http://catalog.mista.ru/public/248100/ может кто знаком, отзовитесь |
|||
33
Злопчинский
10.08.20
✎
00:15
|
(32) еще раз: не надо на ТСД переносить идеологию списков и десктопной работы.
если нет складской системы работы или нет желания ее сделать - тогда да, делайте как на десктопе. основной принцип реализации складских регламентов - это плановость и предсказуемост результата. а не выдача кладовщику в руки стопицот альтернатив. примерно так. "Это все актуально не так для ТСД как для сенсорных мониторов" -с точностью до наоборот: примерно так как сделаноу меня по вышеприведенным ссылкам - сделаны все системы которые активно используют ТСД как направляющий и указывающий инструмент для кладовщика. ТСД говорит кладовщику что делать. а не наоборот. Но такой подход требует пересмотра сложившегося бардака на складе. на что многие конторы не готовы. Поэтому ТСД остается (и похоже и у тебя останется) как и был - вариантом оконечного устройства где планирующая и командная роль отводится кладовщику. |
|||
34
Ёпрст
10.08.20
✎
12:03
|
(19) пиши сам, или возьми готовые классы от рикцента
|
|||
35
Ёпрст
10.08.20
✎
12:06
|
||||
36
Ёпрст
10.08.20
✎
12:11
|
||||
37
jah1111
10.08.20
✎
19:20
|
(36) не завелось у меня, может и руки кривые, но:
_Форма = КонтекстФормы.Форма; {Обработка.классОбщие_ПолеВыбораЗначения.Форма.Модуль(497)}: Значение не не представляет агрегатный объект (Форма) вот здесь Процедура ПриОтжатииЛевойКнопки(Сост, Лево, Верх) Экспорт _Форма = КонтекстФормы.Форма; Если _Форма.АктивныйЭлемент() <> ИдентификаторП оляВвода Тогда Если стрПрефиксНаименования <> "" Тогда стрПрефиксНаименования = ""; ПоказатьТекстНаФорме("", 0); КонецЕсли; фОбрабатываетсяНажатиеКлавиатуры = 0; КонецЕсли; КонецПроцедуры че не так-то? вообще выглядит как-то диковато: https://ibb.co/t2xyVjX |
|||
38
Ёпрст
10.08.20
✎
22:19
|
||||
39
trdm
10.08.20
✎
23:21
|
(35) уже не работает ссыль.
|
|||
40
trdm
10.08.20
✎
23:26
|
||||
41
jah1111
22.09.20
✎
10:39
|
Ребята, помогите подрихтовать поиск в спавочнике. Есть обработка, в которой текстовое поле "Поле" и таблица значенийй ТабВиб. Цель: при вводе текста в "Поле", в ТЗ ТабВиб должна появлятся подборка товаров из справочника наименование которых осоответствует значению "Поле".
Процедура ПоискПоБукв() Спр = СоздатьОбъект("Справочник.Товар"); ном=0; Спр.ВыбратьЭлементы(0); пока Спр.ПолучитьЭлемент()=1 цикл Если Спр.НайтиПоНаименованию(Поле,0,0) = 1 Тогда ном=ном+1; ТоварП = Спр.ТекущийЭлемент(); ТабВиб.НоваяСтрока(ном); ТабВиб.УстановитьЗначение(ном,"Товар",ТоварП); КонецЕсли; КонецЦикла; КонецПроцедуры //ПоискПоБукв() выдает ошибку: пока Спр.ПолучитьЭлемент()=1 цикл {Обработка.Вибор.Форма.Модуль(9)}: Не выбран элемент! |
|||
42
Ёпрст
22.09.20
✎
10:49
|
(41) сбиваешь выборку своим найтипоНаименованию
|
|||
43
jah1111
22.09.20
✎
10:54
|
(42) а как надо то? я только учусь...
|
|||
44
trdm
22.09.20
✎
10:56
|
если Спр.Наименование = Поле Тогда
или если Найти(Спр.Наименование,Поле) > 0 Тогда |
|||
45
jah1111
22.09.20
✎
11:07
|
(44) (42) НайтиПоНаименованию при определенных параметрах ище по первых буквах...
|
|||
46
jah1111
22.09.20
✎
11:11
|
(44) а так чето совсем не ищет...
|
|||
47
Bigbro
22.09.20
✎
11:15
|
ты в цикле где спр.получитьэлемент
сбиваешь выборку спр.НайтиПоНаименованию сделай себе спр2 и в нем изщи по наименованию а спр оставь для цикла. |
|||
48
jah1111
22.09.20
✎
11:35
|
(47) Спр = СоздатьОбъект("Справочник.Товар");
Спр2 = СоздатьОбъект("Справочник.Товар"); ном=0; Спр.ВыбратьЭлементы(0); пока Спр.ПолучитьЭлемент()=1 цикл Если Спр2.НайтиПоНаименованию(Поле,0,0) = 1 Тогда ном=ном+1; ТоварП = Спр2.ТекущийЭлемент(); Если ТоварП.ЭтоГруппа() = 0 тогда ТабВиб.НоваяСтрока(ном); ТабВиб.УстановитьЗначение(ном,"Товар",ТоварП); конецесли; КонецЕсли; КонецЦикла; вроде все правильно, но не взлетает..... |
|||
49
trdm
22.09.20
✎
11:53
|
(46) Все там ищет.
Найти(<?>,) Find(<?>,) Синтаксис: Найти(<Строка1>,<Строка2>) Назначение: Возвращает позицию первого вхождения в строку поиска заданной подстроки. Параметры: <Строка1> - строка в которой ищем (место поиска); <Строка2> - строка которую ищем (шаблон поиска). Замечание: Если не находит - возвращает число 0. Первая позиция имеет индекс 1. |
|||
50
trdm
22.09.20
✎
11:54
|
НайтиПоНаименованию(<?>,,);
FindByDescr(<?>,,); Синтаксис: НайтиПоНаименованию(<Наименование>,<Режим>,<ФлагПоиска>) Назначение: Найти элемент справочника по наименованию. Возвращает: 1 - если действие выполнено; 0 - если действие не выполнено (элемент не найден). Параметры: <Наименование> - строка с наименованием искомого элемента справочника, <Режим> - необязательный параметр. Число: 1 - поиск внутри установленного подчинения (родителя); 0 - поиск во всем справочнике вне зависимости от родителя. Значение по умолчанию - 1. <ФлагПоиска> - необязательный параметр. Число: 1 - найти точное соответствие наименования; 0 - найти наименование по первым символам. Значение по умолчанию - 0. Замечание: Метод можно использовать только для объектов, созданных функцией СоздатьОбъект. |
|||
51
jah1111
22.09.20
✎
12:01
|
(50) я понял, взгляните пожалуйста (48)
почему не заполняет таблицу? |
|||
52
Ёпрст
22.09.20
✎
12:01
|
(48) выкинь из кода цикл и выбратьЭлементы к едрени фени, он там не нужен от слова совсем
|
|||
53
jah1111
22.09.20
✎
12:10
|
выкинул, совсем запутался.
как сделать что бы при вводе в "Поле" к примеру строки "ма" мне в ТЗ ТабВиб показало список всех элементов - не груп, наименование которых начинается с "ма"? |
|||
54
Ёпрст
22.09.20
✎
12:14
|
(52) запросом с descr like 'ма%'
|
|||
55
Mikeware
22.09.20
✎
12:18
|
(54) напомни, плз - фоксовый драйвер для работы с файловой базой обязательно ставить?
|
|||
56
alyuev
22.09.20
✎
12:22
|
(55) Если 1sqlite использовать, то не нужен.
|
|||
57
Ёпрст
22.09.20
✎
12:23
|
(55) ага
|
|||
58
Ёпрст
22.09.20
✎
12:23
|
можно 1sqlite, но он медленнее, на многих запросах
|
|||
59
Ёпрст
22.09.20
✎
12:23
|
хотя и удобнее, писать проще, есть поставщик данных для табличного поля, есть укладка ТЗ в фильтр и т.д..+CTE
|
|||
60
jah1111
22.09.20
✎
12:51
|
охренеть, я такое до смерти не сваяю
а без прямых запросов никак? |
|||
61
Ёпрст
22.09.20
✎
12:53
|
(60) Ну чорный запрос пиши, он тоже отработает, только ммееееедлннно.
Или НайтиПоНаименованию в ложном удалении (только можно обломаться, если форма справочника у кого-то открыта) |
|||
62
Ёпрст
22.09.20
✎
12:53
|
Ну или перебором и Найти
|
|||
63
Ёпрст
22.09.20
✎
12:53
|
еще медленнеее
|
|||
64
jah1111
22.09.20
✎
13:00
|
блин... я в ступоре. если не затруднит дайте пример на 1sqlite или на прямой запрос. я в этом вообще не петрю, но может разберусь
|
|||
65
trad
22.09.20
✎
13:05
|
Ёп опять жути навел! ))
|
|||
66
Mikeware
22.09.20
✎
13:11
|
(59) как его (1sqlite) в моксель закинуть? (как в том примере, что ты давал?)
|
|||
67
Ёпрст
22.09.20
✎
13:12
|
(64)
(65) :) |
|||
68
Ёпрст
22.09.20
✎
13:15
|
(66) эээ..было несколько решений по упаковке, и средствами самой 1с-ины и утилитами exe.. Вот какой именно, не помню, надо покопаться.
Помню тока, что Малаева(МалЯева?) изначальная упаковка не работала, если несколько упаковано в мокселе, пришлось другое решение вкорячивать |
|||
69
Mikeware
22.09.20
✎
13:20
|
(68) ну у тебя по одной длл на моксель
|
|||
70
trad
22.09.20
✎
13:24
|
(69) off
- Сколько длл на моксель? - Одна. - Какую засунем, Формекс или 1цпп? - Вам шашечки или ехать? |
|||
71
Ёпрст
22.09.20
✎
13:24
|
(69) да, но поделка Маляева не умела извлекать несколько..
вот это посмотри, не помню, надо в архивах поискать http://catalog.mista.ru/public/19857/ |
|||
72
Ёпрст
22.09.20
✎
13:25
|
И можно было в один моксель положить
|
|||
73
Ёпрст
22.09.20
✎
13:26
|
||||
74
Ёпрст
22.09.20
✎
13:29
|
Скорее всего, вот последнюю из (73) использовал.
|
|||
75
Mikeware
22.09.20
✎
13:35
|
(70) надо и спп, и формекс, и 1склайт.
Одна из бывших устроилась в какую-то контроку, в которой живут на файловых клюшках. взмолилась. Революцию я там устраивать не хочу, а помочь (совместив с разминкой мозгов) - почему бы и нет? |
|||
76
jah1111
22.09.20
✎
13:44
|
(67) Ёпрст, будь другом, обьясни синтаксис этой строчки
ТекстЗапроса = "select id [Номенклатура :Справочник.Номенклатура] from Справочник.Номенклатура where descr like 'ма%'"; что в квадратных скобках, что после фром (я так полагаю идентификатор справочника) ну и главное - вместо 'ма%' мне надо переменное Поле туда всунуть, как это по одинсикюэловски правильно сделеать? |
|||
77
Mikeware
22.09.20
✎
14:04
|
"select id [Номенклатура :Справочник.Номенклатура] from Справочник.Номенклатура where descr like 'ма%'";
Выбрать колонку "ид", назвать ее в выходном наборе "номеклатура" и типизировать как "справочник.номенклатура" из таблицы Справочник.Номенклатура где поле наименование подобно "ма%" Ну а правила "подобия" смотри в доке |
|||
78
jah1111
22.09.20
✎
14:31
|
Попытка
база = СоздатьОбъект("SQLiteBase"); Исключение ЗагрузитьВнешнююКомпоненту("1sqlite.dll"); база = СоздатьОбъект("SQLiteBase"); КонецПопытки; база.Открыть(":memory:"); запрос = база.НовыйЗапрос(); ТекстЗапроса = " |select id |[Товар :Справочник.Товар] |from |Справочник.Товар |where descr like 'ма%'"; ТабВиб = запрос.ВыполнитьЗапрос(ТекстЗапроса); ТабВиб.ВыбратьСтроку(); в итоге ошибка: ТабВиб = запрос.ВыполнитьЗапрос(ТекстЗапроса); {Обработка.Вибор.Форма.Модуль(42)}: no such table: Справочник.Товар НАЗВАНИЕ СПРАВОЧНИКА ПИШУ ПРАВИЛЬНО |
|||
79
Ёпрст
22.09.20
✎
14:35
|
(78)
|from |[Справочник.Товар] |
|||
80
jah1111
22.09.20
✎
15:22
|
спасибо, добрые люди
в итоге начало получаться. теперь надо научиться отсеивать группы. это как-то через is folder реализуется, да? |
|||
81
Ёпрст
22.09.20
✎
15:23
|
(80) да
|
|||
82
Ёпрст
22.09.20
✎
15:24
|
where isfolder = 0
|
|||
83
alyuev
22.09.20
✎
15:40
|
Не, так нужно:
"Where isfolder=2" см. здесь про значения isfolder и не только: https://script-coding.com/v77tables.html |
|||
84
alyuev
22.09.20
✎
15:41
|
А точнее здесь: https://script-coding.com/v77tables.html#2.3.
|
|||
85
jah1111
22.09.20
✎
16:11
|
(83) спасибо!!!!
помогите еще переменную "Поле" в запрос вставить, ну никак не допетраю и знак доллара ставлю и че только не делаю... |select id |[Товар :Справочник.Товари] |from |[Справочник.Товари] |where isfolder=2 and descr like '.$Поле%.'" Поле - текстовое поле в котором текст по которому ищут |
|||
86
alyuev
22.09.20
✎
16:21
|
Тю... Дык просто:
|where isfolder=2 and descr like '."+Поле+"%.'" |
|||
87
jah1111
22.09.20
✎
16:32
|
просто то прсто, а не летит никуда....
Процедура ПоискПоБукв() Попытка база = СоздатьОбъект("SQLiteBase"); Исключение ЗагрузитьВнешнююКомпоненту("1sqlite.dll"); база = СоздатьОбъект("SQLiteBase"); КонецПопытки; база.Открыть(":memory:"); запрос = база.НовыйЗапрос(); ТекстЗапроса = " |select id |[Товар :Справочник.Товар] |from |[Справочник.Товар] |where isfolder=2 and descr like '."+Поле+"%.'"; ТЗ = запрос.ВыполнитьЗапрос(ТекстЗапроса); ТабВиб.Загрузить(ТЗ); КонецПроцедуры //ПошукПоБукв() Я ЗАМАНАЛСО |
|||
88
Sserj
22.09.20
✎
16:36
|
(87) Ну как вариант: like '."+СокрЛП(Поле)+"%.'" ни или может быть: like '."+СокрП(Поле)+"%.'". Если в начале имени пробелы могут быть.
|
|||
89
Sserj
22.09.20
✎
16:36
|
+(88) У тебя же поле это строка большая и в в конец все что не написано забито пробелами.
|
|||
90
Ёпрст
22.09.20
✎
16:46
|
А точку то зачем перед поиском ?
|
|||
91
Ёпрст
22.09.20
✎
16:47
|
Да и Подставлять есть..
|
|||
92
alyuev
22.09.20
✎
17:00
|
Ну, да. С точками это я протупил... :
|where isfolder=2 and descr like '"+СокрЛП(Поле)+"%'" СокрЛП - только если нужно. |
|||
93
jah1111
22.09.20
✎
17:41
|
добавил фильтр по пометке на удаление ismark и опять ничего не ищет, хоспади какой же ад с этими запросами!
|select id |[Товар :Справочник.Товари] |from |[Справочник.Товари] |where |ismark=0 and |isfolder=2 |and descr like '"+СокрЛП(Поле)+"%'"; |
|||
94
Ёпрст
22.09.20
✎
17:42
|
*
|
|||
95
alyuev
22.09.20
✎
18:21
|
Да,
and IsMark<>'*' |
|||
96
trdm
22.09.20
✎
18:24
|
(93) > |[Товар :Справочник.Товари]
"Справочник.Товари" ????? |
|||
97
Djelf
22.09.20
✎
18:40
|
(96) Возможно потому что не Россия.
Вангую! Следующий вопрос будет такой: "почему sqlite не правильно работает с Украинским алфавитом". |
|||
98
jah1111
22.09.20
✎
21:38
|
(97) мимо.
следующий вопрос будет как делать запрос по остаткам товара, чтобы в ТабВиб отображалась колонка "остаток" с остатками по каждому найденому товару (94) (95) Ёпрст, alyuev - СПАСИБИЩЕ!!! Сегодня за 1 день я научился больше чем за все мои 2 месяца ковыряний в 1с 7.7 |
|||
99
Ёпрст
22.09.20
✎
21:51
|
(98)
|
|||
100
Djelf
23.09.20
✎
10:58
|
(99) Не очень хороший запрос для sqlite.
В sqlite, IN нужно использовать только если иначе никак уже не получается! Запрос в (99) будет прогонять условие в IN для каждой строки в Итоги.Товар Лучше либо использовать INNER JOIN (если нужны только товары на остатках)
Либо поменять местами таблицы, если нужны все Товари, а не только на остатках
|
|||
101
Ёпрст
23.09.20
✎
10:59
|
(100) та ну ? а ин разве не будет в иннер выражен ?
|
|||
102
Ёпрст
23.09.20
✎
11:02
|
+да..вот так еще заменить
//НачПериод = мд.ПолучитьНачПериода(НачДата)//начало периода НачПериод = мд.ПолучитьНачПериода(ТекущаяДата())//начало периода |
|||
103
Ёпрст
23.09.20
✎
11:02
|
это кусок с другого запроса был
|
|||
104
Djelf
23.09.20
✎
11:02
|
(101) Сам посмотри как IN работает: https://gyazo.com/f5c83f0eeee7204b42f72ccdc4fb0819
|
|||
105
Djelf
23.09.20
✎
11:03
|
+(104) А это с INNER JOIN https://gyazo.com/86432cb9a20428f44f862e03175c0341
|
|||
106
Ёпрст
23.09.20
✎
11:04
|
(104) мот только скульлайт так неоптимально ин использует ?
Лень профайлер открывать в скуле |
|||
107
Djelf
23.09.20
✎
11:09
|
(106) Я заметил что последние версии sqlite иногда разворачивают IN в соединение, но почему иногда разворачивает, а иногда нет мне не понятно.
В работе планировщика с IN, от версии к версии происходят очень странные изменения. Лучше его избегать, по мере возможности. |
|||
108
ДенисЧ
23.09.20
✎
11:10
|
(106) МССКЛ вроде как ИН в джойн нормально преобразовывает.
|
|||
109
Ёпрст
23.09.20
✎
11:17
|
(108) ага, вот и я про то.. странно, что в sqllite другое поведение.
Ну и ладно, снеговик на марше! |
|||
110
ДенисЧ
23.09.20
✎
11:19
|
(109) Может, от размера списка зависит?
|
|||
111
Djelf
23.09.20
✎
11:21
|
(109) Ничего странного, таблицы 1С "виртуальные", а у виртуальных таблиц статистики как таковой нет, только предполагаемый вес запроса к таблице и размер самой таблицы.
Планировщику сложно составить оптимальный план с такими скудными данными. |
|||
112
Ёпрст
23.09.20
✎
11:23
|
(111) ясно..после прочтения, сжечь :)
|
|||
113
Djelf
23.09.20
✎
11:48
|
(112) Что так сразу сжечь? Творчески с sqlite надо, творчески ;)
Вот например в запросе внутри IN есть ID, а мы его не используем и перебираем все Товари, пока что-то не нашлось. Преобразуем в коррелирующий подзапрос - становится значительно веселее и даже быстрее чем в варианте с INNER JOIN.
|
|||
114
Ёпрст
23.09.20
✎
12:02
|
(113) ЭЭЭХ..и почему пока коррелирующих подзапросов в селект листе в снеговике не завезли ?
|
|||
115
jah1111
23.09.20
✎
14:30
|
извините за тупость, а НачПериод чему равн у нас? откуда брать?
|
|||
116
Mikeware
23.09.20
✎
14:40
|
(115) Следующий от сегодня "Период Хранения Остатков"
|
|||
117
Ёпрст
23.09.20
✎
14:56
|
(115) см (102)
|
|||
118
jah1111
23.09.20
✎
15:31
|
(117) Ёпрст, выбрал Ваш методо но:
ТекстЗапроса = " | SELECT | Итоги.Товар [Товар :Справочник.Товари] | ,Итоги.Количество Останки | FROM | [РегистрИтоги.ОстаткиТовари] as Итоги | | WHERE | Итоги.period = :НачПериод | and Итоги.Товар in (select id from [Справочник.Товари] where descr like '"+СокрЛП(Поле)+"%'"; мд = СоздатьОбъект("MetaDataWork"); // НачПериод = мд.ПолучитьНачПериода(НачДата);//начало периода НачПериод = мд.ПолучитьНачПериода(ТекущаяДата()); Запрос.Подставлять("НачПериод",НачПериод); ТЗ = запрос.ВыполнитьЗапрос(ТекстЗапроса); ОШИБКА!!! Эти запросы это язык инопланетян! ТЗ = запрос.ВыполнитьЗапрос(ТекстЗапроса); {Обработка.Вибір.Форма.Модуль(82)}: near "'м%'": syntax error "м" - было введено в поле поиска ПОМОГИТЕ УЖЕ ДОБИТЬ ЭТОТ ЗАПРОС К ЕДРЕНИ_ФЕНИ |
|||
119
Ёпрст
23.09.20
✎
15:42
|
(118)
and Итоги.Товар in (select id from [Справочник.Товари] where descr like '"+СокрЛП(Поле)+"%'"); |
|||
120
Ёпрст
23.09.20
✎
15:42
|
точнее
and Итоги.Товар in (select id from [Справочник.Товари] where descr like '"+СокрЛП(Поле)+"%')"; |
|||
121
Ёпрст
23.09.20
✎
15:42
|
скобки , короче не хватало закрытой
|
|||
122
jah1111
23.09.20
✎
15:54
|
(121) спасибо уже разобрался, один хрен не работает, не находит таблицу
no such table: РегистрИтоги.ОстаткиТовари смотрю в моей конфе регистры - пусто. Ниодного регистра. Где это все?. Где искать итоги? |
|||
123
Ёпрст
23.09.20
✎
15:56
|
(122)
Видать, на 41 счете |
|||
124
jah1111
23.09.20
✎
16:00
|
у нас товары на складах 28.1 счет
я знаю что ужасно назойлив, но как обратится к счету в 1іqlite ? как это написать? я сделал вывод остатков обычным перебором строк, но скорость не впечатляет... хоть и база небольшая но притормаживания бывают. а запросом намного быстрее было бы |
|||
125
Ёпрст
23.09.20
✎
16:01
|
(124) не к счету, а к таблице итогов бух учета
|
|||
126
Ёпрст
23.09.20
✎
16:11
|
На вот, почитай на ночь, там в последних постах есть запрос на sqllite для получения сальдо
|
|||
127
Ёпрст
23.09.20
✎
16:11
|
||||
128
jah1111
23.09.20
✎
16:19
|
(127) лучше сразу пристрелите..... :)
|
|||
129
Ёпрст
23.09.20
✎
16:49
|
(128) там почти готовый код в пердпоследнем посте. Тебе только нужно всего лишь запрос к одной табличке + условие на дату и на счет, ну и сложить числовые поля и вывести нужное субконто и усё.
|
|||
130
Ёпрст
23.09.20
✎
16:49
|
дату берешь как начало текущего квартала и всё.
|
|||
131
jah1111
23.09.20
✎
17:43
|
База=СоздатьОбъект("SQLiteBase");
База.Открыть(":memory:"); Запрос=База.НовыйЗапрос(); Запрос.ВыполнитьЗапрос("PRAGMA journal_mode = OFF"); Запрос.ВыполнитьЗапрос("create virtual table _1SBKTTL using dbeng(_1S.Bkttl)"); Запрос.ВыполнитьЗапрос("create virtual table _1SENTRY using dbeng(_1S.ENTRY)"); Запрос.Подставлять("Товари",Товар); Запрос.Подставлять("Счет",СчетПоКоду("28.1")); Запрос.Подставлять("ДатаОстатков",Формат(НачКвартала(Дата),"Д YYYYMMDD")); Запрос.Отладка(1); СтрСальдо = "CAST(Остатки.SD as NUMERIC(15,3))"; ТекстЗапроса="SELECT |"+СтрСальдо+" КоличествоОстаток |FROM _1SBKTTL AS Остатки |WHERE (Остатки.ACCID = :Счет) | AND (Остатки.DATE = :ДатаОстатков) | AND (Остатки.SC0 = :Товар) |"; ТЗ=Запрос.ВыполнитьЗапрос(ТекстЗапроса) Товар и Дата - глобальные переменные? Ошибки: SELECT CAST(Остатки.SD as NUMERIC(15,3)) КоличествоОстаток FROM _1SBKTTL AS Остатки WHERE (Остатки.ACCID = ' 2J ') AND (Остатки.DATE = ' ') AND (Остатки.SC0 = NULL) Подбор индекса для таблицы 1SBKTTL: Ограничения: ACCID=; DATE=; SC0=; В кэше не найдено Выбран индекс ACC1: DTOS(DATE)+SP11076+KIND+ACCID+SC0+SC1+SC2+CURRID Стоимость: 144 ЧТО ЗА ОГРАНИЧЕНИЯ? китайская грамота в окне сообщений |
|||
132
Djelf
23.09.20
✎
17:51
|
(131) Убери Запрос.Отладка(1); и никакой такой, непонятной тебе, грамоты, насчет побора индексов, не будет.
Раз не знаешь что это и зачем, тебе это и не надо. |
|||
133
jah1111
23.09.20
✎
18:05
|
убрал. И теперь понял зачем это.
не ищет нихрена, офрмирует пустую тз с одной колонкой КоличествоОстаток |
|||
134
Ёпрст
23.09.20
✎
18:31
|
(131)
Запрос.Подставлять("ДатаОстатков",НачКвартала(ТекущаяДата())); + на твоём 28.1 какие субконто и в каком порядке ? |
|||
135
Djelf
23.09.20
✎
18:37
|
(133) Не ищет нихрена не из-за этого. Что-то не так у тебя с условиями.
Эта штука нужна когда у тебя начинает тупить запрос, либо ты хочешь из него выжать лишние пару микросекунд. Но нужно смотреть какие индексы есть в 1Cv7.DD, понимать как работают индексы, и т.д. и т.п. |
|||
136
Djelf
23.09.20
✎
18:44
|
+(135) Возможно класс ПрямойЗапрос https://www.1cpp.ru/forum/YaBB.pl?num=1273512019 будет проще.
Синтаксис приближен к 8ке, не сильно переучиваться надо будет, и работает и с mssql и с sqlite. И документация замечательная! |
|||
137
Ёпрст
23.09.20
✎
19:00
|
(136) хочешь его добить ? ;)
На вот, развлекайся
|
|||
138
Ёпрст
23.09.20
✎
19:00
|
Это при условии, что на 28.1 первым субконто твои Твари
|
|||
139
Ёпрст
23.09.20
✎
19:00
|
Товари, т.е
|
|||
140
jah1111
23.09.20
✎
19:07
|
как на зло на втором
|
|||
141
jah1111
23.09.20
✎
19:18
|
(138)
SCx Значение субконто X+1 (x - от 0 до МаксСубконто-1). Если по счету не предусмотрено проставление субконто X - заполняется пустой строкой ' ' .Тип - Строка (9-20). Char(9-20). Правильно копаю? |
|||
142
Ёпрст
23.09.20
✎
19:19
|
(140) тогда так:
ТекстЗапроса="SELECT |Остатки.SD КоличествоОстаток |,Остатки.SC1 [Товари:Справочник.Товари] |FROM [_1S.BKTTL] Остатки |Inner join [Справочник.Товари] Спр on спр.id = Остатки.SC1 and спр.descr like '%"+ПолеПоиска+"%' |WHERE (Остатки.ACCID = :Счет) | AND (Остатки.DATE = :ДатаОстатков) |"; ТЗ=Запрос.ВыполнитьЗапрос(ТекстЗапроса); ТЗ.ВыбратьСтроку(); |
|||
143
Ёпрст
23.09.20
✎
19:20
|
и вот тут еще пробел воткни:
|,Остатки.SC1 [Товари :Справочник.Товари] |
|||
144
jah1111
23.09.20
✎
20:06
|
(140) а писать надо не просто SD а както пометить что это количество
KIND Тип итогов. 9 - 1001 - К-во все, еду крышей, это же надо субконто1 тоже учитывать если субконто1 - это подразделение(склад) Запрос.Подставлять("Склад",Склад); вроде более-менее понимаю а написать не могу...... куда это Kind втыкать? хочу чтобы колонка 1 - товар, колонка2 - остатки количественные товара... да еще и по определенному складу |
|||
145
Ёпрст
23.09.20
✎
20:10
|
(144) а у тя там помимо количественного, еще и суммовой ?
|
|||
146
Ёпрст
23.09.20
✎
20:17
|
Ну добавь там
Запрос.Подставлять("ВыбСклад",ТвойСклад); ..... |AND Остатки.KIND = '3' and SC0 = :ВыбСклад |
|||
147
Ёпрст
23.09.20
✎
20:18
|
И еще так, чтоб нулевые итоги выкинуть
|And Остатки.SD<>0 |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |