Версия для печати темы (https://pro1c.org.ua/index.php?s=caa8592ee8309f0921e121c3047abf67&showtopic=4518)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ Поиск строки таблицы значений по нескольким параметрам

Автор: Batchir 23.08.11, 12:53

В общем возникла необходимость в процедуре поиска строки таблицы значений по нескольким параметрам.
В 8-ке то всё элементарно, но в 7.7 с этим проблема.
НайтиЗначение() находит первую строку где находится искомое значение. Может у кого-то есть готовая функция которая ищет строку по нескольким параметрам.

Если у кого-то есть, поделитесь пожалуйста.

З.ы. я когда-то пользовался такой, но с 7.7 уже не работаю несколько лет, вот и подзабыл немного, а нужно как обычно вчера.

Автор: Vofka 23.08.11, 13:32

Написать самому функцию, которая переберёт все строки и сравнит с нужным фильтром.

Автор: g789 23.08.11, 13:44

как вариант при формировании ТаблицыЗначений добавить ключевое поле (тбл.Поле1 + "$$$"+тбл.Поле2) - потом искать по нему. ну или 1с++ - индексированная таблица

Автор: Batchir 23.08.11, 13:47

Сильно громоздко (в плане выполнения)
Допустим у меня цикл из 100000 записей и нужно найти в таблице значений (допустим имеет тоже 100000 записей) строку по параметрам.
Каждый раз перебирать тз напряжно.
Думал может есть более оптимальное решение

Автор: g789 23.08.11, 13:58

Цитата(Batchir @ 23.08.11, 14:47) *
Допустим у меня цикл из 100000 записей и нужно найти в таблице значений (допустим имеет тоже 100000 записей) строку по параметрам.

Вариант с ключевым полем подойдет

Автор: alex040269 23.08.11, 14:20

Цитата(g789 @ 23.08.11, 14:58) *
Вариант с ключевым полем подойдет


или строки вставлять не в конец, а в нужное место в тз, тогда тз будет упорядоченной и искать можно половинным делением, хотя с ключевым полем должно работать очень даже неплохо.

Автор: 5_kopeek 23.08.11, 15:36

Цитата(g789 @ 23.08.11, 13:44) *
как вариант при формировании ТаблицыЗначений добавить ключевое поле (тбл.Поле1 + "$$$"+тбл.Поле2) - потом искать по нему. ну или 1с++ - индексированная таблица

Тоже пользовалась подобным алгоритмом, только это называла индексными полями, что не принципиально. Работает достаточно быстро при поиске, но теряется время при формировании подобных индексов. Кстати, разделитель значений в индексном поле совсем необязателен.

Автор: g789 23.08.11, 15:43

Цитата(5_kopeek @ 23.08.11, 16:36) *
Кстати, разделитель значений в индексном поле совсем необязателен.

Конечно не обязателен, но бывает полезен - я использую, обычно, несколько символов, которых гарантированно не будет в полях поиска, так спокойней.

Автор: Fynjy 23.08.11, 15:47

Цитата(g789 @ 23.08.11, 14:44) *
как вариант при формировании ТаблицыЗначений добавить ключевое поле (тбл.Поле1 + "$$$"+тбл.Поле2) - потом искать по нему. ну или 1с++ - индексированная таблица

Индексная колонка +1

Автор: alex040269 23.08.11, 15:56

Цитата(5_kopeek @ 23.08.11, 16:36) *
Кстати, разделитель значений в индексном поле совсем необязателен.


Тогда нужно выравнивать значения складываемых полей по длине.

Автор: 5_kopeek 23.08.11, 23:14

Цитата(alex040269 @ 23.08.11, 15:56) *
Тогда нужно выравнивать значения складываемых полей по длине.

Зачем? Индексные поля не заменяют поля данных, они лишь служат для быстрого поиска нужной строки по нескольким критериям.

Автор: kalyamov 24.08.11, 0:40

Цитата(5_kopeek @ 24.08.11, 0:14) *
они лишь служат для быстрого поиска нужной строки по нескольким критериям.


Думаю, автор это и имеет ввиду, просто иногда, разделитель может быть весьма полезен, поэтому так и написано.

Автор: Batchir 24.08.11, 10:46

Можете растолковать пример, а то что то я до сих пор не в теме
Я например получаю запросам данные и выгружаю их в таблицу значения для того что бы в дальнейшем из этой таблицы получать необходимые мне данные.
Вот например есть таблица со 100000 строками:
_____ Колонка1 | Колонка2 | Колонка3 | Колонка4 | Колонка5|

1____ Значение1|Значение2|Значение3|Значение4|Значение5|
2____ Значение1|Значение2|Значение3|Значение4|Значение5|
и т.д.
Затем программно добавляется индексная колонка Колонка6.
Насколько я понял для каждой строки в её значение добавляется что то типа
""+ Значение1+"$$$"+Значение2+"$$$"+Значение3+"$$$"+Значение4+"$$$"+Значение5.

Как потом осуществить поиск строки по значениям (Значение3 И Значение4)
или (Значение1 и Значение3 и Значение5)

Автор: kalyamov 24.08.11, 18:04

Цитата(Batchir @ 24.08.11, 11:46) *
_____ Колонка1 | Колонка2 | Колонка3 | Колонка4 | Колонка5|

1____ Значение1|Значение2|Значение3|Значение4|Значение5|
2____ Значение1|Значение2|Значение3|Значение4|Значение5|
и т.д.
Затем программно добавляется индексная колонка Колонка6.
Насколько я понял для каждой строки в её значение добавляется что то типа
""+ Значение1+"$$$"+Значение2+"$$$"+Значение3+"$$$"+Значение4+"$$$"+Значение5.

Как потом осуществить поиск строки по значениям (Значение3 И Значение4)
или (Значение1 и Значение3 и Значение5)

Насколько я понимаю, поиск можно осуществить, если заранее известно, по каким колонкам будете искать.

Автор: Batchir 24.08.11, 20:04

Цитата(kalyamov @ 24.08.11, 19:04) *
Насколько я понимаю, поиск можно осуществить, если заранее известно, по каким колонкам будете искать.

Это я понял. Индексная колонка строиться на основании тех данных, по которым нужно искать.
Но как назло нужен именно поиск по разным наборам колонок.

Но всё равно всем спасибо, значит заранее обдумаю все варианты поиска которые мне нужны и создам столько индексных колонок сколько нужно.

Автор: Fynjy 24.08.11, 20:31

Цитата(Batchir @ 24.08.11, 21:04) *
Это я понял. Индексная колонка строиться на основании тех данных, по которым нужно искать.
Но как назло нужен именно поиск по разным наборам колонок.

Но всё равно всем спасибо, значит заранее обдумаю все варианты поиска которые мне нужны и создам столько индексных колонок сколько нужно.

Подкину, как вариант и как более быстрый быстрый способ по сравнению с ТЗ - работа с внешней таблицей: MS SQL, DBF.

Автор: Batchir 24.08.11, 20:37

Как вариант использовать можно, но разве у ДБФ нет проблем с украинскими символами?

Автор: kalyamov 24.08.11, 21:22

Цитата(Batchir @ 24.08.11, 21:04) *
Это я понял. Индексная колонка строиться на основании тех данных, по которым нужно искать.
Но как назло нужен именно поиск по разным наборам колонок.

Но всё равно всем спасибо, значит заранее обдумаю все варианты поиска которые мне нужны и создам столько индексных колонок сколько нужно.


Есть еще вариант 1С++ "ИндекснаяТаблица" - но это только предположения, что там можно решить вопрос.

Автор: Batchir 24.08.11, 21:33

Нет, 1С++ не подходит, нужно решение без внешних компонент.
Ну собственно повторюсь Индексные колонки подходят, просто нужно заранее подготовить все необходимые колонки.

Автор: alex040269 25.08.11, 8:40

Цитата(Batchir @ 24.08.11, 21:37) *
Как вариант использовать можно, но разве у ДБФ нет проблем с украинскими символами?

Если в виндузной кодировке, то кажись нет!

Автор: Fynjy 25.08.11, 8:41

Цитата(kalyamov @ 24.08.11, 22:22) *
Есть еще вариант 1С++ "ИндекснаяТаблица" - но это только предположения, что там можно решить вопрос.

1С++ конечно вещь, но я бы 3ды подумал прикручивая ее к рабочей базе

Автор: Batchir 25.08.11, 14:32

В общем всем спасибо поставленная задача решена с помощью индексных колонок

Я 1С++ ставил только для прямых запросов, в свое время это давало хорошую отсрочку для перехода с 7.7. на 8.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua