|
v7: Поиск строк в таблице значений (аналог НайтиСтроки в 8) | ☑ | ||
---|---|---|---|---|
0
13Дима13
15.05.18
✎
14:49
|
Доброго времени суток, коллеги.
Есть ли в 7.7 аналог НайтиСтроки для таблицы значений? Чтобы найти в таблице значений все строки, в которых значение в определенной колонке равно заданному? Спасибо. |
|||
1
mehfk
15.05.18
✎
14:57
|
(0) Напиши свой класс-потомок от таблицы значений.
|
|||
2
Slypower
15.05.18
✎
14:58
|
По мне так в 7.7 лучше устроено получение значения из ТЗ. Имхо, этого не хватает в 1с8.
А по вашему запросу: вроде нет, только перебором по условию |
|||
3
FIXXXL
15.05.18
✎
15:06
|
(2) и чего же именно не хватает?
|
|||
4
FIXXXL
15.05.18
✎
15:07
|
(0) получай, проверяй, откладывай
|
|||
5
Franchiser
гуру
15.05.18
✎
15:08
|
Сортируешь таблицу, затем ищешь первое значение и дальше с этой строки циклом получаешь остальной блок значений.
Есть еще варианты: 1. Сворачиваешь ТЗ, 2. Ищешь данные в исходной ТЗ по данным свернутой ТЗ. |
|||
6
Slypower
15.05.18
✎
15:13
|
(3) ТЗ.ПолучитьЗначение(Строка,Колонка);
|
|||
7
mehfk
15.05.18
✎
15:16
|
(6) Дарю: ТЗ[Строка][Колонка]
|
|||
8
Сияющий Асинхраль
15.05.18
✎
15:31
|
(7) Подарок, конечно, замечательный :-))) Жаль, что для 7.7 неработающий :-)
|
|||
9
Сияющий Асинхраль
15.05.18
✎
15:32
|
(5) +100
|
|||
10
mehfk
15.05.18
✎
15:33
|
(8) Дружищще, ты тупишь.
|
|||
11
Сияющий Асинхраль
15.05.18
✎
15:40
|
(10) А что говорит по этому поводу 1С:
Сообщить(ТЗ<<?>>[1][Сч]); {(16)}: Переменная не объявлена как массив (ТЗ) При проверке модуля обнаружены синтаксические ошибки! |
|||
12
Сияющий Асинхраль
15.05.18
✎
15:42
|
+(11) Покажи хоть одно место в типовых с таким обращением к таблице значений...
|
|||
13
mehfk
15.05.18
✎
15:44
|
(12) Ты это в 7-ке пытался запустить?
|
|||
14
Кац
15.05.18
✎
15:44
|
(12) он про восьмерку
|
|||
15
Сияющий Асинхраль
15.05.18
✎
15:49
|
(13) А ты тему читал и мой комментарий (8)? Тема про семерку, комментарий (8) тоже про семерку - х.з. зачем ты сюда влез с восьмерочным кодом (я в (8) тебе сразу и сказал, что код не семерочный)...
|
|||
16
mehfk
15.05.18
✎
15:50
|
(15) Ты (3) пробовал читать?
|
|||
17
Сияющий Асинхраль
15.05.18
✎
15:52
|
Но если уж говорить про "чего для ТЗ не хватает в восьмерке", скажу, в семерке есть замечательная команда "Заполнить" - с ее помощью можно без проблем одной строкой соединить две одинаковые ТЗ, а в восьмерке до сих пор:
ЗаполнитьЗначенияСвойств() в цикле... |
|||
18
mehfk
15.05.18
✎
15:52
|
Для танкистов на бронепоезде. Человек в (2) говорит, что ему в 8-ке не хватает семерочного получения значения ячейки по индексу колонки и стороки. Ему предлагается решение.
|
|||
19
Сияющий Асинхраль
15.05.18
✎
15:53
|
(18) Ну теперь найди аналог (17) :-)
|
|||
20
mehfk
15.05.18
✎
15:55
|
(19) Какой, к черту, аналог? Ты читать пробовал?
Ему нужен аналого в восьмерке, а не семерке! |
|||
21
mehfk
15.05.18
✎
15:56
|
Аналогом семерочного кода ТЗ.ПолучитьЗначение(Строка,Колонка) будет ТЗ[Строка][Колонка].
Вопросы? |
|||
22
Сияющий Асинхраль
15.05.18
✎
15:57
|
(20) Это ты не читаешь: найди аналог семерочной команды в восьмерке...
(21) -> (19) |
|||
23
mehfk
15.05.18
✎
15:57
|
(22) Тупишь. Жестко.
|
|||
24
FIXXXL
15.05.18
✎
15:59
|
(17) напиши один разик функцию СоединитьТаблицы() в общем модуле :) если так часто нужно
|
|||
25
Эльниньо
15.05.18
✎
18:26
|
Твр.УстановитьФильтр(Клиент, Клиент, "Клиент");
|
|||
26
Злопчинский
15.05.18
✎
19:51
|
//********************************************************************************************************************************
// Функция глОтобратьПоКолонке(ТЗВход,Колонка,Значение) Экспорт //возвращает отобранную ТЗ Перем ТЗ, ТЗВрем; ТЗВход.Выгрузить(ТЗ); ТЗ.Сортировать(Колонка+"*"); //по внутр значению НомСтр = 0; Если ТЗ.НайтиЗначение(Значение, НомСтр, Колонка) = 0 Тогда ТЗ.УдалитьСтроки(); Возврат ТЗ; КонецЕсли; //нет такого значения //найдем строку, в которой уже не встречается Значение ТЗКС = ТЗ.КоличествоСтрок(); Для счСтрок = НомСтр По ТЗКС Цикл Если ТЗ.ПолучитьЗначение(счСтрок, Колонка) <> Значение Тогда //нужное значение есть до пред.строки НомСтр2 = счСтрок - 1; Прервать; КонецЕсли; Если счСтрок = ТЗКС Тогда //нужное значение встречается до конца таблицы НомСтр2 = ТЗКС; КонецЕсли; КонецЦикла; ТЗВрем = СоздатьОбъект("ТаблицаЗначений"); ТЗ.Выгрузить(ТЗВрем,НомСтр,НомСтр2); //выгрузим только строки с нужным значением Возврат ТЗВрем; КонецФункции //глОтобратьПоКолонке() |
|||
27
Злопчинский
15.05.18
✎
19:54
|
ТЗрезультат = глОтобратьПоКолонке(ТЗвкоторойищем,ИдКолонкиПоКоторойИщем,ЗначениеКотороеИщем);
флЧтоТоНашли = 1-ПустоеЗначение(ТЗрезультат); |
|||
28
HawkEye
15.05.18
✎
19:57
|
(26) если НомСтр2 = ТЗКС; поставить перед циклом - выкинешь лишнее условие из цикла....))
|
|||
29
HawkEye
15.05.18
✎
19:59
|
+(28) а если еще перед циклом проверить последнее значение в ТЗ = нужному - вообще без цикла иногда будет обходиться )
|
|||
30
Злопчинский
15.05.18
✎
20:05
|
(29) Я выдрал откуда-то кучу, просто кучу лет назад. По быстройдействию удовлетворяет, поэтому особо и не вглядывался.
|
|||
31
Злопчинский
15.05.18
✎
20:14
|
(28) перенес. про вторую поправку лень думать. сильно думаю над своей работой - трясти надо!
|
|||
32
HawkEye
15.05.18
✎
20:26
|
(31)
ТЗКС = ТЗ.КоличествоСтрок(); НомСтр2 = ТЗКС; Если ТЗ.ПолучитьЗначение(ТЗКС, Колонка) <> Значение Тогда //если последнее значение не равно нужному, тогда ищем перебором Для счСтрок = НомСтр По ТЗКС - 1 Цикл //последнее значение уже не то, зачем его два раза проверять Если ТЗ.ПолучитьЗначение(счСтрок, Колонка) <> Значение Тогда//нужное значение есть до пред.строки НомСтр2 = счСтрок - 1; Прервать; КонецЕсли; КонецЦикла; КонецЕсли; конечно эффект будет только на больших ТЗ, на малых - пофигу... |
|||
33
Злопчинский
16.05.18
✎
04:45
|
(32) скопипастил, но заремил...
|
|||
34
Злопчинский
16.05.18
✎
04:54
|
(32) неоптимальный у вас код... ;-)
надо Для счСтрок = НомСтр+1 ... - значение в НомСтр - уже проверяли... |
|||
35
SleepyHead
гуру
16.05.18
✎
05:01
|
(0) Как один из вариантов - создать колонку, которая будет ключом, и состоять из значений, по которым ищешь. Не годится для больших таблиц значений и требует предварительного заполнения на этапе построения ТЗ, зато искать проще.
|
|||
36
Злопчинский
16.05.18
✎
06:06
|
если юзать ИТЗ то все должно получаться гораздо проще.
можно создать на ИТЗ индекс и выборку по индексу делать. будет ли построенияе индекса быстрее описанного выше алгоритма фильтрации обычной ТЗ - хз... |
|||
37
ADirks
16.05.18
✎
08:41
|
(36) будет быстрее, начиная с каких-то объёмов. Щас уже точно не вспомню, но порядка нескольких тысяч строк.
И вообще, ИТ это не столько про быстродействие, сколько про удобство. |
|||
38
Сияющий в темноте
16.05.18
✎
09:29
|
В родной 7.7 индексации у таблицы нет,и поиск идет полным перебором,так что как вы не ищите,все равно медленно будет.
Но,в семерке не нужно получать строку таблицы для поиска значения,можно получать только нужные ячейки,поэтому перебор в коде будет быстрен,чем в восьмерке. Если таблица отсортирована,то для поиска можно использовать деление пополам,а потом от найденного значения подняться вверх и спуститься вниз |
|||
39
AliAksA
16.05.18
✎
09:56
|
(38) Имхо, так шустрее будет:
Процедура ВыборкаИзТаблицы(перТаблица, перКолонка, перЗначение) Результат = СоздатьОбъект("ТаблицаЗначений"); перТаблица.Выгрузить(Результат); Результат.УдалитьСтроки(); НомСтроки = 0; Пока Таблоид.НайтиЗначение(перЗначение, НомСтроки, перКолонка) > 0 Цикл Результат.НоваяСтрока(); // обходим колонки перТаблицы и устанавливаем значения в результирующую КонецЦикла; Возврат Результат; КонецПроцедуры // ВыборкаИзТаблицы() |
|||
40
AliAksA
16.05.18
✎
10:28
|
+(39) сорки, не то скопипастил, рабочая функция:
Функция ВыборкаИзТаблицы(перТаблица, перКолонка, перЗначение) Результат = СоздатьОбъект("ТаблицаЗначений"); перТаблица.Выгрузить(Результат); Результат.УдалитьСтроки(); НомСтроки = 0; Пока перТаблица.НайтиЗначение(перЗначение, НомСтроки, перКолонка) > 0 Цикл Результат.НоваяСтрока(); Для Счетчик = 1 По перТаблица.КоличествоКолонок() Цикл текКолонка = перТаблица.ТекущаяКолонка(Счетчик); текЗначение = перТаблица.ПолучитьЗначение(перТаблица.ТекущаяСтрока(), текКолонка); Результат.УстановитьЗначение(Результат.ТекущаяСтрока(), текКолонка, текЗначение); КонецЦикла; КонецЦикла; Возврат Результат; КонецФункции // ВыборкаИзТаблицы() Ну вместо выгрузки и удаления строк можно ещё поколдовать с переносом структуры таблицы, хотя и так работает быстро |
|||
41
Сияющий Асинхраль
16.05.18
✎
13:51
|
(40) С переносом колдовать можно, но чуток быстрее будет вот так:
Если перТаблица.КоличествоСтрок() = 0 Тогда перТаблица.Выгрузить(Результат); Иначе // копируем не всю таблицу, а только одну строчку... перТаблица.Выгрузить(Результат,1,1); Результат.УдалитьСтроки(); КонецЕсли; |
|||
42
Duke1C
16.05.18
✎
13:57
|
Функция ВыборкаИзТаблицы(перТаблица, перКолонка, перЗначение)
Результат = СоздатьОбъект("ТаблицаЗначений"); перТаблица.Выгрузить(Результат); КС=перТаблица.КоличествоСтрок(); Для Л=-КС по -1 Цикл Если Результат.ПолучитьЗначение(-Л,перКолонка)<>перЗначение Тогда Результат.УдалитьСтроку(-Л); КонецЕсли; КонецЦикла; Возврат Результат; КонецФункции// ВыборкаИзТаблицы() |
|||
43
Злопчинский
16.05.18
✎
13:58
|
(40) сумлеваюсь я...
|
|||
44
Злопчинский
16.05.18
✎
14:01
|
ну, вообще-то код в (26) - самый быстрый, еще давно-давно сравнение проводилось...
его еще можно ускорить если вместо .Выгрузить юзать/переделать на .Заполнить |
|||
45
Попытка1С
16.05.18
✎
14:03
|
Вроде какой то класс умел делать запросы к ТЗ?
|
|||
46
Злопчинский
16.05.18
✎
14:08
|
(40)
1. код бредовый 2. код не рабочий |
|||
47
Злопчинский
16.05.18
✎
14:10
|
это было видно с первого взгляда. но если человек заявляет что код рабочий я начинаю параноить - потому как я уже практически в деменции и маразме, но за слова привык отвечать.
в итоге - код бредовый и нерабочий |
|||
48
Duke1C
16.05.18
✎
14:26
|
+42 писал прям в браузере на основе (40), но должно работать
(47) Сергей, если не влом, сравни на своих задачах замер производительности (26) и (42) |
|||
49
Злопчинский
16.05.18
✎
14:33
|
(48) сейчас - влом
УдалитьСтроку в середине таблицы - затратная операция |
|||
50
Злопчинский
16.05.18
✎
14:34
|
(48) ..тем более что такие сравнения уже делались.
в (26) самый быстрый КОНЦЕПТУАЛЬНЫЙ вариант |
|||
51
Злопчинский
16.05.18
✎
14:37
|
(40) валиться на ошибках времени исполнения
Функция ВыборкаИзТаблицы(перТаблица, перКолонка, перЗначение) Результат = СоздатьОбъект("ТаблицаЗначений"); перТаблица.Выгрузить(Результат); Результат.УдалитьСтроки(); НомСтроки = 0; Пока перТаблица.НайтиЗначение(перЗначение, НомСтроки, перКолонка) > 0 Цикл Результат.НоваяСтрока(); Для Счетчик = 1 По перТаблица.КоличествоКолонок() Цикл текКолонка = перТаблица.ТекущаяКолонка(Счетчик); текЗначение = перТаблица.ПолучитьЗначение(перТаблица.ТекущаяСтрока(), текКолонка); Результат.УстановитьЗначение(Результат.ТекущаяСтрока(), текКолонка, текЗначение); КонецЦикла; КонецЦикла; Возврат Результат; КонецФункции// ВыборкаИзТаблицы() //******************************************* Процедура Сформировать() ТЗ = СоздатьОбъект("ТаблицаЗначений"); ТЗ.НоваяКолонка("ОПС","Число"); ТЗ.НоваяКолонка("Строка","Строка",10); ТЗ.НоваяСтрока(); ТЗ.ОПС = 1; ТЗ.Строка = "111"; ТЗ.НоваяСтрока(); ТЗ.ОПС = 2; ТЗ.Строка = "222"; ТЗ.НоваяСтрока(); ТЗ.ОПС = 3; ТЗ.Строка = "111"; ТЗ.НоваяСтрока(); ТЗ.ОПС = 4; ТЗ.Строка = "222"; ТЗ.НоваяСтрока(); ТЗ.ОПС = 5; ТЗ.Строка = "111"; ТЗ.НоваяСтрока(); ТЗ.ОПС = 6; ТЗ.Строка = "222"; ТЗ.НоваяСтрока(); ТЗ.ОПС = 7; ТЗ.Строка = "111"; ТЗраб = ВыборкаИзТаблицы(ТЗ,"Строка", "222 "); ПечатьТЗ(ТЗраб); КонецПроцедуры |
|||
52
Злопчинский
16.05.18
✎
14:39
|
а за попытку диверсии товарища из (40) на годик надо в е-бан отправить.. ;-)
|
|||
53
ADirks
16.05.18
✎
14:53
|
нашёл тут в закромах вариант с дихотомическим поиском (ТЗ естественно д.б. отсортирована)
помнится, чисто ради прикола, делал реализацию qsort, но не сохранилось (причём, оно было быстрее, чем ТЗ.Сортировать()) //_____________________________________________________________________________ //Возвращает число: // 0 - ЗначениеКлюча = ЗначениеТЗ // 1 - ЗначениеКлюча > ЗначениеТЗ // -1 - ЗначениеКлюча < ЗначениеТЗ Функция СравнитьСКлючом(Ключ, ТЗ, НомерСтроки, ПоВнутрПредставлению = 0) Перем нк, ИмяКолонки, ЗначениеКлюча, ЗначениеТЗ; Для нк = 1 По Ключ.РазмерСписка() Цикл ЗначениеКлюча = Ключ.ПолучитьЗначение(нк, ИмяКолонки); ЗначениеТЗ = ТЗ.ПолучитьЗначение(НомерСтроки, ИмяКолонки); Если ТипЗначения(ЗначениеКлюча) > 3 Тогда ЗначениеКлюча = ЗначениеДляСравнения(ЗначениеКлюча, ПоВнутрПредставлению); ЗначениеТЗ = ЗначениеДляСравнения(ЗначениеТЗ, ПоВнутрПредставлению); КонецЕсли; Если ЗначениеКлюча > ЗначениеТЗ Тогда Возврат 1; ИначеЕсли ЗначениеКлюча < ЗначениеТЗ Тогда Возврат -1; КонецЕсли; КонецЦикла; Возврат 0; КонецФункции //Бинарный поиск по ключу. Возвращается номер первой или последней строки, совпадающей с ключом //Таблица должна быть предварительно отсортирована (для этого предназначен метод СортироватьПоКлючу()) //Параметры: // - ТЗ - таблица значений, в которой нужно найти строку // - Ключ - список значений, по которым производится поиск. Текстовое представление значения д.б. именем колонки ТЗ. // - ПоВнутрПредставлению - если 1, то при сравнении используется внутреннее представление объекта. // Это нужно в тех случаях, когда есть разные объекты с одинаковым представлением (например, // разные контрагенты с одинаковым наименованием). Естественно, сортировать ТЗ также нужно по внутр. // представлениям (см. СортироватьПоКлючу()). // - НачСтрока, КонСтрока - если отличны от 0, то для поиска будет использован только указанный диапазон строк. // В процессе поиска эти значения меняются таким образом, что их можно затем использовать для // ускорения поиска второй границы. Например: // НачСтрока = 0; КонСтрока = 0; // ТЗ_НайтиПоКлючу2(ТЗ, Ключ, НачСтрока, КонСтрока, 0); //Находим первую запись // ТЗ_НайтиПоКлючу2(ТЗ, Ключ, НачСтрока, КонСтрока, 1); //Находим последнюю запись, но уже гораздо быстрее // - НайтиПоследнюю - 0 - будет найдена первая строка, совпадающая с ключом; 1 - последняя Функция ТЗ_НайтиПоКлючу2(ТЗ, Ключ, ПоВнутрПредставлению = 0, НачСтрока=0, КонСтрока=0, ИскатьПоследнюю = 0) Экспорт Перем н1, н, н2, Рез; Если НачСтрока = 0 Тогда н1 = 1; Иначе н1 = НачСтрока; КонецЕсли; Если КонСтрока = 0 Тогда н2 = ТЗ.КоличествоСтрок(); Иначе н2 = КонСтрока; КонецЕсли; Найдено = 0; Пока н1 < н2 Цикл н = Цел((н1+н2) / 2); Если ИскатьПоследнюю = 1 Тогда н = мин(н + 1, н2); КонецЕсли; Рез = СравнитьСКлючом(Ключ, ТЗ, н, ПоВнутрПредставлению); Если Рез = 0 Тогда Если ИскатьПоследнюю = 0 Тогда н2 = н; Иначе н1 = н КонецЕсли; Найдено = 1; ИначеЕсли Рез < 0 Тогда н2 = н - 1; КонСтрока = н2; Иначе н1 = н + 1; НачСтрока = н1; КонецЕсли; КонецЦикла; Если Найдено = 0 Тогда Если СравнитьСКлючом(Ключ, ТЗ, н1, ПоВнутрПредставлению) = 0 Тогда Найдено = 1; КонецЕсли; КонецЕсли; Если Найдено = 1 Тогда ТЗ.ПолучитьСтрокуПоНомеру(н1); Возврат н1; Иначе Возврат 0; КонецЕсли; КонецФункции //_____________________________________________________________________________ Процедура СортироватьПоКлючу(ТЗ, Ключ, ПоВнутрПредставлению = 0) Экспорт Перем нк, ИмяКолонки, СтрокаСортировки, Зпт; СтрокаСортировки = ""; Зпт = ""; Для нк = 1 По Ключ.РазмерСписка() Цикл Ключ.ПолучитьЗначение(нк, ИмяКолонки); СтрокаСортировки = СтрокаСортировки + Зпт + ИмяКолонки; Зпт = ","; КонецЦикла; Если ПоВнутрПредставлению = 1 Тогда СтрокаСортировки = "*" + СтрЗаменить(СтрокаСортировки, ",", ",*"); КонецЕсли; ТЗ.Сортировать(СтрокаСортировки, 1); КонецПроцедуры |
|||
54
Сияющий Асинхраль
16.05.18
✎
14:55
|
(42) Не анализировал полностью, также как и (42), но зачем перебирать ВСЮ ТЗ? Достаточно сортировать ТЗ по одному реквизиту, найти его и перебрать только строки с этим реквизитом, как только нужный реквизит поменяет значение выход из цикла...
|
|||
55
Сияющий Асинхраль
16.05.18
✎
14:58
|
+(54) И да, ну не надо, чтобы скопировать структуру копировать всю ТЗ, а если там 500000 строчек? Достаточно выгрузить первую строчку...
|
|||
56
FIXXXL
16.05.18
✎
15:45
|
до-ооооо, в семерке все просто :)
|
|||
57
Злопчинский
16.05.18
✎
16:36
|
(54) в (26) так и есть
|
|||
58
Il19
16.05.18
✎
16:50
|
(0) в (1) же ответили! http://www.1cpp.ru/docum/html/IndexedTable.html
|
|||
59
ptiz
16.05.18
✎
17:17
|
Хорошая ветка! 15 лет назад подобных обсуждений была тьма :)
|
|||
60
Сияющий в темноте
16.05.18
✎
17:26
|
В семерке НайтиЗначение просто перебирает строки,поэтому,ожидать,что выполнение этого несколько раз даст результат,неоправданно,т.к.выполнитсч тот же перебор
и,создавать таблицу или удалять строки нежелательно,можнл просто заменять значение,но,вопрос в поиске,если перебором,то проще свой перебор,чем что то мудрить.я я в семерке переводид все значения в строки и использовал обьект scripting.dictionary для хранения индекса,с помощью этого обьекта все искалось намноно шустрее |
|||
61
Il19
16.05.18
✎
17:27
|
(59) хоть на мисте можно поностальгировать по клюшкам
|
|||
62
Il19
16.05.18
✎
17:34
|
(60) для задачи ТС вполне ИТЗ хватит
|
|||
63
Duke1C
16.05.18
✎
20:09
|
(54) Вот именно по этому просил Серегу проверить, самому не на чем. Просто самому казалось, что как сказал (60), НайтиЗначение() работает полным перебором, и в (26) оно используется полюбому + еще цикл с проверкой + выгрузить...
А у меня в (42) всего лишь один цикл с проверкой... Может быть УдалитьСтроку() у ТЗ и затратный метод, но насколько не знаю, эмпирически не проверял в данном контексте и для (55) - копирование таблицы осуществляется для того чтобы вернуть результат, сохранив исходную ТЗ. |
|||
64
AliAksA
18.05.18
✎
09:15
|
Итак вернемся к нашим баранам ....
Прежде всего мои извинения за старый код - нашел более новую - хотелось побыстрее ((( В обработке: //******************************************* Функция ВыборкаИзТаблицы(перТаблица, перКолонка, перЗначение) Результат = СоздатьОбъект("ТаблицаЗначений"); Если перТаблица.КоличествоСтрок() = 0 Тогда перТаблица.Выгрузить(Результат); Иначе перТаблица.Выгрузить(Результат,1,1); Результат.УдалитьСтроки(); КонецЕсли; перТаблица.ПолучитьСтрокуПоНомеру(1); НомСтроки = 0; Пока перТаблица.НайтиЗначение(перЗначение, НомСтроки, перКолонка) > 0 Цикл Результат.НоваяСтрока(); Для Счетчик = 1 По перТаблица.КоличествоКолонок() Цикл текКолонка = перТаблица.ТекущаяКолонка(Счетчик); Если ПустоеЗначение(текКолонка) = 0 Тогда текЗначение = перТаблица.ПолучитьЗначение(НомСтроки, текКолонка); Результат.УстановитьЗначение(Результат.НомерСтроки, текКолонка, текЗначение); КонецЕсли; КонецЦикла; перТаблица.УдалитьСтроку(НомСтроки); НомСтроки = 0; КонецЦикла; Возврат Результат; КонецФункции // ВыборкаИзТаблицы() //******************************************* Процедура Сформировать() ТЗ = СоздатьОбъект("ТаблицаЗначений"); ТЗ.НоваяКолонка("ОПС", "Число", 1, 0); ТЗ.НоваяКолонка("Значение","Число", 10, 0); текОПС = 0; Для Счетчик1 = 1 По 5 Цикл Для Счетчик2 = 1 По 1000000 Цикл текОПС = текОПС + 1; ТЗ.НоваяСтрока(); ТЗ.ОПС = текОПС; ТЗ.Значение = Счетчик2; КонецЦикла; КонецЦикла; ОчиститьОкноСообщений(); Сообщить("================================="); Сообщить("Начало теста 1 - " + ТекущееВремя()); ТЗраб = СоздатьОбъект("ТаблицаЗначений"); ТЗраб = ВыборкаИзТаблицы(ТЗ, "Значение", 666); ТЗраб.ВыбратьСтроки(); Пока ТЗраб.ПолучитьСтроку() = 1 Цикл Сообщить("" + ТЗраб.ОПС + " - " + ТЗраб.Значение); КонецЦикла; Сообщить("Конец теста 1 - " + ТекущееВремя()); Сообщить("================================="); Сообщить("Начало теста 2 - " + ТекущееВремя()); Для Счетчик = - ТЗ.КоличествоСтрок() По -1 Цикл ТЗ.ПолучитьСтрокуПоНомеру(-Счетчик); Если ТЗ.Значение <> 666 Тогда ТЗ.УдалитьСтроку(-Счетчик); КонецЕсли; КонецЦикла; Сообщить("Конец теста 2 - " + ТекущееВремя()); Сообщить("================================="); КонецПроцедуры //******************************************* в окне сообщений: ================================= Начало теста 1 - 09:08:20 9 - 0 9 - 666 9 - 666 9 - 666 9 - 666 Конец теста 1 - 09:08:20 ================================= Начало теста 2 - 09:08:20 Конец теста 2 - 09:08:23 ================================= Но в первом варианте баг - первый раз не определяет наименование колонки - может кто подскажет как его убрать? Ну а быстродействие - налицо ... ну сами попробуйте - может другие результаты выдаст |
|||
65
AliAksA
18.05.18
✎
09:24
|
+(64) кстати у кого комп помощнее и х64 - проверьте на милионе строк (Для Счетчик2 = 1 По 10000000 Цикл) а то у меня 1С-ка на ХР вылетает
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |