Имя: Пароль:
1C
1C 7.7
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С-ка на ХР вылетает