Вход | Регистрация


1С:Предприятие ::

Метки: 

v7: Поиск строк в таблице значений (аналог НайтиСтроки в 8)

Я
   13Дима13
 
15.05.18 - 14:49
Доброго времени суток, коллеги.
Есть ли в 7.7 аналог НайтиСтроки для таблицы значений? Чтобы найти в таблице значений все строки, в которых значение в определенной колонке равно заданному?
Спасибо.
 
 
   mehfk
 
1 - 15.05.18 - 14:57
(0) Напиши свой класс-потомок от таблицы значений.
   Slypower
 
2 - 15.05.18 - 14:58
По мне так в 7.7 лучше устроено получение значения из ТЗ. Имхо, этого не хватает в 1с8.
А по вашему запросу: вроде нет, только перебором по условию
   FIXXXL
 
3 - 15.05.18 - 15:06
(2) и чего же именно не хватает?
   FIXXXL
 
4 - 15.05.18 - 15:07
(0) получай, проверяй, откладывай
   Franchiser
 
5 - 15.05.18 - 15:08
Сортируешь таблицу, затем ищешь первое значение и дальше с этой строки циклом получаешь остальной блок значений.
Есть еще варианты: 1. Сворачиваешь ТЗ, 2. Ищешь данные в исходной ТЗ по данным свернутой ТЗ.
   Slypower
 
6 - 15.05.18 - 15:13
(3) ТЗ.ПолучитьЗначение(Строка,Колонка);
   mehfk
 
7 - 15.05.18 - 15:16
(6) Дарю: ТЗ[Строка][Колонка]
   Сияющий Асинхраль
 
8 - 15.05.18 - 15:31
(7) Подарок, конечно, замечательный :-))) Жаль, что для 7.7 неработающий :-)
   Сияющий Асинхраль
 
9 - 15.05.18 - 15:32
(5) +100
   mehfk
 
10 - 15.05.18 - 15:33
(8) Дружищще, ты тупишь.
 
  Рекламное место пустует
   Сияющий Асинхраль
 
11 - 15.05.18 - 15:40
(10) А что говорит по этому поводу 1С:

Сообщить(ТЗ<<?>>[1][Сч]);
{(16)}: Переменная не объявлена как массив (ТЗ)
При проверке модуля обнаружены синтаксические ошибки!
   Сияющий Асинхраль
 
12 - 15.05.18 - 15:42
+(11) Покажи хоть одно место в типовых с таким обращением к таблице значений...
   mehfk
 
13 - 15.05.18 - 15:44
(12) Ты это в 7-ке пытался запустить?
   Кац
 
14 - 15.05.18 - 15:44
(12) он про восьмерку
   Сияющий Асинхраль
 
15 - 15.05.18 - 15:49
(13) А ты тему читал и мой комментарий (8)? Тема про семерку, комментарий (8) тоже про семерку - х.з. зачем ты сюда влез с восьмерочным кодом (я в (8) тебе сразу и сказал, что код не семерочный)...
   mehfk
 
16 - 15.05.18 - 15:50
(15) Ты (3) пробовал читать?
   Сияющий Асинхраль
 
17 - 15.05.18 - 15:52
Но если уж говорить про "чего для ТЗ не хватает в восьмерке", скажу, в семерке есть замечательная команда "Заполнить" - с ее помощью можно без проблем одной строкой соединить две одинаковые ТЗ, а в восьмерке до сих пор:
ЗаполнитьЗначенияСвойств() в цикле...
   mehfk
 
18 - 15.05.18 - 15:52
Для танкистов на бронепоезде. Человек в (2) говорит, что ему в 8-ке не хватает семерочного получения значения ячейки по индексу колонки и стороки. Ему предлагается решение.
   Сияющий Асинхраль
 
19 - 15.05.18 - 15:53
(18) Ну теперь найди аналог (17) :-)
   mehfk
 
20 - 15.05.18 - 15:55
(19) Какой, к черту, аналог? Ты читать пробовал?
Ему нужен аналого в восьмерке, а не семерке!
   mehfk
 
21 - 15.05.18 - 15:56
Аналогом семерочного кода ТЗ.ПолучитьЗначение(Строка,Колонка) будет ТЗ[Строка][Колонка].

Вопросы?
   Сияющий Асинхраль
 
22 - 15.05.18 - 15:57
(20) Это ты не читаешь: найди аналог семерочной команды в восьмерке...
(21) -> (19)
   mehfk
 
23 - 15.05.18 - 15:57
(22) Тупишь. Жестко.
   FIXXXL
 
24 - 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-ПустоеЗначение(ТЗрезультат);
   HawkEye
 
28 - 15.05.18 - 19:57
(26) если НомСтр2 = ТЗКС; поставить перед циклом - выкинешь  лишнее условие из цикла....))
   HawkEye
 
29 - 15.05.18 - 19:59
+(28) а если еще перед циклом проверить последнее значение в ТЗ = нужному - вообще без цикла иногда будет обходиться )
   Злопчинский
 
Ведущий
30 - 15.05.18 - 20:05
(29) Я выдрал откуда-то кучу, просто кучу лет назад. По быстройдействию удовлетворяет, поэтому особо и не вглядывался.
   Злопчинский
 
Ведущий
31 - 15.05.18 - 20:14
(28) перенес. про вторую поправку лень думать. сильно думаю над своей работой - трясти надо!
   HawkEye
 
32 - 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 ...

- значение в НомСтр - уже проверяли...
   SleepyHead
 
35 - 16.05.18 - 05:01
(0) Как один из вариантов - создать колонку, которая будет ключом, и состоять из значений, по которым ищешь. Не годится для больших таблиц значений и требует предварительного заполнения на этапе построения ТЗ, зато искать проще.
   Злопчинский
 
Ведущий
36 - 16.05.18 - 06:06
если юзать ИТЗ то все должно получаться гораздо проще.
можно создать на ИТЗ индекс и выборку по индексу делать.
будет ли построенияе индекса быстрее описанного выше алгоритма фильтрации обычной ТЗ - хз...
   ADirks
 
37 - 16.05.18 - 08:41
(36) будет быстрее, начиная с каких-то объёмов. Щас уже точно не вспомню, но порядка нескольких тысяч строк.

И вообще, ИТ это не столько про быстродействие, сколько про удобство.
   Сияющий в темноте
 
38 - 16.05.18 - 09:29
В родной 7.7 индексации у таблицы нет,и поиск идет полным перебором,так что как вы не ищите,все равно медленно будет.
Но,в семерке не нужно получать строку таблицы для поиска значения,можно получать только нужные ячейки,поэтому перебор в коде будет быстрен,чем в восьмерке.
Если таблица отсортирована,то для поиска можно использовать деление пополам,а потом от найденного значения подняться вверх и спуститься вниз
   AliAksA
 
39 - 16.05.18 - 09:56
(38) Имхо, так шустрее будет:

Процедура ВыборкаИзТаблицы(перТаблица, перКолонка, перЗначение)
    
    Результат = СоздатьОбъект("ТаблицаЗначений");
    перТаблица.Выгрузить(Результат);
    Результат.УдалитьСтроки();
    
    НомСтроки = 0;
    Пока Таблоид.НайтиЗначение(перЗначение, НомСтроки, перКолонка) > 0 Цикл
        Результат.НоваяСтрока();
        // обходим колонки перТаблицы и устанавливаем значения в результирующую

    КонецЦикла;
    
    Возврат Результат;
    
КонецПроцедуры// ВыборкаИзТаблицы()
   AliAksA
 
40 - 16.05.18 - 10:28
+(39) сорки, не то скопипастил, рабочая функция:

Функция ВыборкаИзТаблицы(перТаблица, перКолонка, перЗначение)
    
    Результат = СоздатьОбъект("ТаблицаЗначений");
    перТаблица.Выгрузить(Результат);
    Результат.УдалитьСтроки();
    
    НомСтроки = 0;
    Пока перТаблица.НайтиЗначение(перЗначение, НомСтроки, перКолонка) > 0 Цикл
        Результат.НоваяСтрока();
        Для Счетчик = 1 По перТаблица.КоличествоКолонок() Цикл
            текКолонка = перТаблица.ТекущаяКолонка(Счетчик);
            текЗначение = перТаблица.ПолучитьЗначение(перТаблица.ТекущаяСтрока(), текКолонка);
            Результат.УстановитьЗначение(Результат.ТекущаяСтрока(), текКолонка, текЗначение);
        КонецЦикла;
    КонецЦикла;
    
    Возврат Результат;
    
КонецФункции// ВыборкаИзТаблицы()


Ну вместо выгрузки и удаления строк можно ещё поколдовать с переносом структуры таблицы, хотя и так работает быстро
   Сияющий Асинхраль
 
41 - 16.05.18 - 13:51
(40) С переносом колдовать можно, но чуток быстрее будет вот так:

Если перТаблица.КоличествоСтрок() = 0 Тогда
     перТаблица.Выгрузить(Результат);
Иначе// копируем не всю таблицу, а только одну строчку...

     перТаблица.Выгрузить(Результат,1,1);
     Результат.УдалитьСтроки();
КонецЕсли;
   Duke1C
 
42 - 16.05.18 - 13:57
Функция ВыборкаИзТаблицы(перТаблица, перКолонка, перЗначение)
    Результат = СоздатьОбъект("ТаблицаЗначений");
    перТаблица.Выгрузить(Результат);
    КС=перТаблица.КоличествоСтрок();
    Для Л=-КС по -1 Цикл
        Если Результат.ПолучитьЗначение(-Л,перКолонка)<>перЗначение Тогда
            Результат.УдалитьСтроку(-Л);         
        КонецЕсли;
    КонецЦикла;
    Возврат Результат; 
КонецФункци// ВыборкаИзТаблицы()
   Злопчинский
 
Ведущий
43 - 16.05.18 - 13:58
(40) сумлеваюсь я...
   Злопчинский
 
Ведущий
44 - 16.05.18 - 14:01
ну, вообще-то код в (26) - самый быстрый, еще давно-давно сравнение проводилось...

его еще можно ускорить если вместо .Выгрузить юзать/переделать на .Заполнить
   Попытка1С
 
45 - 16.05.18 - 14:03
Вроде какой то класс умел делать запросы к ТЗ?
   Злопчинский
 
Ведущий
46 - 16.05.18 - 14:08
(40)
1. код бредовый
2. код не рабочий
   Злопчинский
 
Ведущий
47 - 16.05.18 - 14:10
это было видно с первого взгляда. но если человек заявляет что код рабочий я начинаю параноить - потому как я уже практически в деменции и маразме, но за слова привык отвечать.

в итоге - код бредовый и нерабочий
   Duke1C
 
48 - 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) на годик надо в е-бан отправить.. ;-)
   ADirks
 
53 - 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 Цикл
        н = Цел((н12) / 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 строчек? Достаточно выгрузить первую строчку...
   FIXXXL
 
56 - 16.05.18 - 15:45
до-ооооо, в семерке все просто :)
   Злопчинский
 
Ведущий
57 - 16.05.18 - 16:36
(54) в (26) так и есть
   Il19
 
58 - 16.05.18 - 16:50
   ptiz
 
59 - 16.05.18 - 17:17
Хорошая ветка! 15 лет назад подобных обсуждений была тьма :)
   Сияющий в темноте
 
60 - 16.05.18 - 17:26
В семерке НайтиЗначение просто перебирает строки,поэтому,ожидать,что выполнение этого несколько раз даст результат,неоправданно,т.к.выполнитсч тот же перебор
и,создавать таблицу или удалять строки нежелательно,можнл просто заменять значение,но,вопрос в поиске,если перебором,то проще свой перебор,чем что то мудрить.я

я в семерке переводид все значения в строки и использовал обьект scripting.dictionary для хранения индекса,с помощью этого обьекта все искалось намноно шустрее
   Il19
 
61 - 16.05.18 - 17:27
(59) хоть на мисте можно поностальгировать по клюшкам
   Il19
 
62 - 16.05.18 - 17:34
(60) для задачи ТС вполне ИТЗ хватит
   Duke1C
 
63 - 16.05.18 - 20:09
(54) Вот именно по этому просил Серегу проверить, самому не на чем. Просто самому казалось, что как сказал (60), НайтиЗначение() работает полным перебором, и в (26) оно используется полюбому + еще цикл с проверкой + выгрузить...
А у меня в (42) всего лишь один цикл с проверкой...

Может быть УдалитьСтроку() у ТЗ и затратный метод, но насколько не знаю, эмпирически не проверял в данном контексте

и для (55) - копирование таблицы осуществляется для того чтобы вернуть результат, сохранив исходную ТЗ.
   AliAksA
 
64 - 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
=================================

Но в первом варианте баг - первый раз не определяет наименование колонки - может кто подскажет как его убрать?
Ну а быстродействие - налицо ... ну сами попробуйте - может другие результаты выдаст
   AliAksA
 
65 - 18.05.18 - 09:24
+(64) кстати у кого комп помощнее и х64 - проверьте на милионе строк (Для Счетчик2 = 1 По 10000000 Цикл) а то у меня 1С-ка на ХР вылетает



Список тем форума
Рекламное место пустует  
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует