Имя: Пароль:
1C
1C 7.7
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
http://catalog.mista.ru/public/141197/

вот, можешь и готовое изделие посмотреть, если писать лень
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
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
(37)База, надеюсь, sql ?
вот, всё работает:

http://pics.rsh.ru/img/_02o814fl.png
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)


    Попытка
        база = СоздатьОбъект("SQLiteBase");
    Исключение
        ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
        база = СоздатьОбъект("SQLiteBase");
    КонецПопытки;
    
    база.Открыть(":memory:");
    запрос = база.НовыйЗапрос();
        ТекстЗапроса = "select id [Номенклатура :Справочник.Номенклатура] from Справочник.Номенклатура where descr like 'ма%'";
        ТЗ = запрос.ВыполнитьЗапрос(ТекстЗапроса);
    ТЗ.ВыбратьСтроку();



(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)


ТекстЗапроса = "

    |    SELECT
    |      Итоги.Товар [Товар :Справочник.Товари]
    |      ,Итоги.Количество Останки
    |    FROM
    |        [РегистрИтоги.ОстаткиТовари] as Итоги
    |
    |    WHERE
    |        Итоги.period = :НачПериод
        |            and Итоги.Товар in (select id from [Справочник.Товари] where  descr like '"+СокрЛП(Поле)+"%'";
      мд = СоздатьОбъект("MetaDataWork");
    НачПериод = мд.ПолучитьНачПериода(НачДата);//начало периода
    Запрос.Подставлять("НачПериод",НачПериод);
    ТЗ = запрос.ВыполнитьЗапрос(ТекстЗапроса);
    ТЗ.ВыбратьСтроку();

100 Djelf
 
23.09.20
10:58
(99) Не очень хороший запрос для sqlite.
В sqlite, IN нужно использовать только если иначе никак уже не получается!
Запрос в (99) будет прогонять условие в IN для каждой строки в Итоги.Товар
Лучше либо использовать INNER JOIN (если нужны только товары на остатках)

FROM [РегистрИтоги.ОстаткиТовари] as Итоги
INNER JOIN [Справочник.Товари] AS ТовариON Товари.ID=Итоги.Номенклатура AND Товари.descr like '"+СокрЛП(Поле)+"%'"

Либо поменять местами таблицы, если нужны все Товари, а не только на остатках

SELECT
Товари.ID [Товар :Справочник.Номенклатура]
,Итоги.Количество [Количество]
FROM
[Справочник.Товари] AS Товари
LEFT JOIN
[РегистрИтоги.ОстаткиТовари] as Итоги ON Товари.ID=Итоги.Номенклатура AND Итоги.period = :НачПериод
WHERE
Товари.descr like '"+СокрЛП(Поле)+"%'"
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
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.

- and Итоги.Товар in (select id from [Справочник.Товари] where descr like '"+СокрЛП(Поле)+"%'";
+ and Итоги.Товар in (select id from [Справочник.Товари] where id=Итоги.Товар and descr like '"+СокрЛП(Поле)+"%'";
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) хочешь его добить ? ;)


На вот, развлекайся


    Попытка
        база = СоздатьОбъект("SQLiteBase");
    Исключение
        ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
        база = СоздатьОбъект("SQLiteBase");
    КонецПопытки;
    база.Открыть(":memory:");
    запрос = база.НовыйЗапрос();    
    
    
    Запрос.Подставлять("Счет",СчетПоКоду("28.1"));
    Запрос.Подставлять("ДатаОстатков",НачКвартала(ТекущаяДата()));
    ПолеПоиска = "ма";
    //Запрос.Отладка(1);
    
    ТекстЗапроса="SELECT
    |Остатки.SD КоличествоОстаток
    |,Остатки.SC0 [Товари:Справочник.Товари]
    |FROM [_1S.BKTTL]  Остатки
    |Inner join [Справочник.Товари] Спр on спр.id = Остатки.SC0 and спр.descr like '%"+ПолеПоиска+"%'
    |WHERE (Остатки.ACCID = :Счет)
    |    AND (Остатки.DATE = :ДатаОстатков)
    |";
    ТЗ=Запрос.ВыполнитьЗапрос(ТекстЗапроса);
    ТЗ.ВыбратьСтроку();
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
Независимо от того, куда вы едете — это в гору и против ветра!