Доброй ночи.

Есть код :

```1c
    Для каждого СтрТЧ Из ТабАнализа Цикл

    Если ТабНезависимых.Найти(СтрТЧ.Ссылка,"Ссылка")=Неопределено Тогда
    СтрТЧ.МожноПомечать = Истина;
    КонецЕсли;

    КонецЦикла;
```

(код взят на просторах инфостарта но к сожалению не помню где именно)
ТабАнализа и ТабНезависимых это табличные части.

Проблема в том что этот кусок кода просто дико медленно работает на серверном варианте (SQL) в каждой Табличной части более 250000 соответственно код на серверном варианте выполняется более 15 часов На файловом 6 часов.

Так как у меня уже ночь а завтра необходимо что то придумать по поводу оптимизации этого кода поэтому прошу помощи.

Как можно сравнить две табличных части более быстро ???

П.С. Как я понял тормоза происходят в методе ТабНезависимых.Найти(СтрТЧ.Ссылка,"Ссылка")

П.С.С Я видел что буквально двумя темами ниже разбирают похожую проблему но к сожалению нет сил читать все да и там расматиривается относительно маленькие тз.
---
asdevlog,

```1c
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ТабАнализа.Ссылка,
    | ТабАнализа.МожноПомечать,
    | ТабАнализа.ПрочиеВсякиеРеквизиты
    |ПОМЕСТИТЬ ТабАнализаВТ
    |ИЗ
    | &ТабАнализа КАК ТабАнализа
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ТабАнализаВТ.Ссылка,
    | ВЫБОР
    | КОГДА ТабАнализаВТ.Ссылка В (&МассивПоиска)
    | ТОГДА ЛОЖЬ
    | ИНАЧЕ ИСТИНА
    | КОНЕЦ КАК МожноПомечать,
    | ТабАнализаВТ.ПрочиеВсякиеРеквизиты
    |ИЗ
    | ТабАнализаВТ КАК ТабАнализаВТ";

    Запрос.УстановитьПараметр("ТабАнализа" ,ТабАнализа.Выгрузить());
    Запрос.УстановитьПараметр("МассивПоиска",ТабНезависимых.ВыгрузитьКолонку("Ссылка"));

    Результат = Запрос.Выполнить();

    Если Результат.Пустой() Тогда
    Возврат;
    КонецЕсли;

    ТабАнализа.Загрузить(Результат.Выгрузить());
```
---
asdevlog, открой ссылку в (2), там типовое решение от 1С в 4 посте.
---
Покупай попкорн, немного пива и читай :)
http://forum.infostart.ru/forum86/topic118274/
---
dj_serega, не парьте товарищу мозг) Нет здесь сравнения двух ТЗ и сравнения двух ТЧ тоже нет).
ТабАнализа в запрос параметром (&ТабАнализа)
Колонку "Ссылка" ТабНезависимых в массив, &Массив в параметр запроса
выборка всех строк в запросе из &ТабАнализа, где сразу устанавливаем поле "МожноПомечать" в истину или ложь в зависимости от того находится ли поле Ссылка в переданном &Массиве
выгрузили резалт в таблицу значений, загрузили в ТабАнализа (если это ТЧ конечно)
не забудьте проиндексировать по полю Ссылка во временной таблице при выборке из &ТабАнализа
и скуэль скажет вам спасибо)

ЗЫ. Индексировать не надо, да, забудьте про индексирование)
---
Пан, А можно пример кода ? Не могу сообразить !
---
asdevlog,

```1c
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ТабАнализа.Ссылка,
    | ТабАнализа.МожноПомечать,
    | ТабАнализа.ПрочиеВсякиеРеквизиты
    |ПОМЕСТИТЬ ТабАнализаВТ
    |ИЗ
    | &ТабАнализа КАК ТабАнализа
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ТабАнализаВТ.Ссылка,
    | ВЫБОР
    | КОГДА ТабАнализаВТ.Ссылка В (&МассивПоиска)
    | ТОГДА ЛОЖЬ
    | ИНАЧЕ ИСТИНА
    | КОНЕЦ КАК МожноПомечать,
    | ТабАнализаВТ.ПрочиеВсякиеРеквизиты
    |ИЗ
    | ТабАнализаВТ КАК ТабАнализаВТ";

    Запрос.УстановитьПараметр("ТабАнализа" ,ТабАнализа.Выгрузить());
    Запрос.УстановитьПараметр("МассивПоиска",ТабНезависимых.ВыгрузитьКолонку("Ссылка"));

    Результат = Запрос.Выполнить();

    Если Результат.Пустой() Тогда
    Возврат;
    КонецЕсли;

    ТабАнализа.Загрузить(Результат.Выгрузить());
```
---
По сравнению двух таблиц значений тоже хотел указать на многостраничную дискуссию, но вот более интересна задача как оптимально обработать таблицу значений для добавки типов с целью создания ее копии. Хотел для удоства доработать одну из консолей запросов для наглядного предстваления значений
```1c
    <NULL>, <НЕОПРЕРЕДЕЛЕНО>, <0>, <Пустая строка>, <ПустаяСсылка (спр. такой-то)>.(еще что уже мне нужно чтоб бросалось в глаза)..
```

В чем спросите минус - если в колонке перед выводом в табличное поле типа ДеревоЗначений в консоли акулова и еще в другие прицепить эту процедуру перед выводом (запросы ловить труднее) есть такой прикол. Перед выводом тех колонок таб. значений где есть эти "невидимые" значения нужно добавить тип "строка".
Пробовал запоминать индекс, сохранить массив значений колонки и добавить колонку с доп. типом после анализа ее типов - каша с коллекцией при удалении и сдвиг колонок. Лучше всего сделать копию таблицы значений (про дерево еще подумаю как тут копировать).
По возможности при переборе строк лучше встроенные методы таблицы значений (и потом также дерева).

```1c
    //###Дораборка+ (13.01.2015 kostyaomsk Юрин К.А.) --> Прямой перебор строк и колонок в строке на предмет значения NULL
    // Примечание. Более оптимальный способ это динамическая замена в запросах типа NULL на текст "<NULL>" - этот медленнее

    Если ВыделитьNULL Тогда
    Если ТипЗнч(Рез)<>ТипЗнч(ДЗ) Тогда

    НовРез = Новый ТаблицаЗначений;

    Для каждого Кол Из Рез.Колонки Цикл
    МасНул = Рез.НайтиСтроки(Новый Структура(Кол.Имя, NULL) ); // МассивСтрок с нуллами по очередной колонке
    МасНеопр = Рез.НайтиСтроки(Новый Структура(Кол.Имя, НЕОПРЕДЕЛЕНО) ); // МассивСтрок с нуллами по очередной колонке
    МасНоль = Рез.НайтиСтроки(Новый Структура(Кол.Имя, 0) ); // МассивСтрок с нуллами по очередной колонке
    МасПустаяСтр = Рез.НайтиСтроки(Новый Структура(Кол.Имя, ") ); // МассивСтрок с нуллами по очередной колонке

    // Запомним данные по колонке для создания копии
    индСохр = Рез.Колонки.Индекс(Кол); // запомнил индекс удаляемой колонки!
    СтарыйТип = Кол.ТипЗначения; // Описание типов!
    ИмяСохр = Кол.Имя;
    ЗаголовокСохр = Кол.Заголовок; // Если был заголовок?!
    ШиринаСохр = Кол.Ширина; // То же ?!

    // Если колонка нам нужна по одному из "невидимых" критериев
    Если (МасНул.Количество() > 0) Или
    (МасНеопр.Количество() > 0) Или
    (МасНоль.Количество() > 0) ИЛИ
    (МасПустаяСтр.Количество() > 0) Тогда
    Если НЕ Кол.ТипЗначения.СодержитТип(Тип("Строка")) Тогда
    СтарыйТип = Новый ОписаниеТипов(СтарыйТип, "Строка"); // дополним тип до строки если он уже не строка
    КонецЕсли;
    КонецЕсли; // Добавим строковый тип для рисования НЕОПРЕДЕЛЕНО и NULL

    НовРез.Колонки.Добавить(ИмяСохр, СтарыйТип, ЗаголовокСохр, ШиринаСохр);
    НовРез.ЗагрузитьКолонку(Рез.ВыгрузитьКолонку(ИмяСохр), ИмяСохр);

    Если МасПустаяСтр.Количество() > 0 Тогда
    Для каждого СтрРез из МасПустаяСтр Цикл
    СтрРез[ИмяСохр] = "<Пустая строка>"; // НЕ заполненный множественный тип.
    КонецЦикла; // Для каждого СтрРез из Мас Цикл...
    КонецЕсли;

    Если МасНул.Количество() > 0 Тогда
    // Меняем только там где есть
    Для каждого СтрРез из МасНул Цикл
    СтрРез[ИмяСохр] = "<NULL>";
    КонецЦикла; // Для каждого СтрРез из Мас Цикл...
    КонецЕсли;

    Если МасНеопр.Количество() > 0 Тогда
    // Меняем только там где есть
    Для каждого СтрРез из МасНеопр Цикл
    СтрРез[ИмяСохр] = "<НЕОПРЕДЕЛЕНО>"; // НЕ заполненный множественный тип.
    КонецЦикла; // Для каждого СтрРез из Мас Цикл...
    КонецЕсли;

    Если МасНоль.Количество() > 0 Тогда
    Для каждого СтрРез из МасНоль Цикл
    СтрРез[ИмяСохр] = "<ноль>"; // НЕ заполненный множественный тип.
    КонецЦикла; // Для каждого СтрРез из Мас Цикл...
    КонецЕсли;

    // Еще есть тип "Пустая ссылка" у ссылочных типов и GUID
    КонецЦикла; // Для каждого Кол Из Рез.Колонки Цикл...
    Иначе
    // Тут сложнее - перебор дерева приходится дублировать код :) Поиск по подчиненным
    //Для каждого Кол Из Рез.Колонки Цикл
    // Мас = Рез.НайтиСтроки(Новый Структура(Кол.Имя, NULL), ИСТИНА); // МассивСтрок с нуллами по очередной колонке
    // Если Мас.Количество() > 0 Тогда
    // Если НЕ Кол.ТипЗначения.СодержитТип(Тип("Строка")) Тогда
    // Кол. = Новый ОписаниеТипов(Кол.ТипЗначения, "Строка"); // Добавим к сложному исходному типу еще строку
    // КонецЕсли;
    // КонецЕсли; // Добавим строковый тип для рисования НЕОПРЕДЕЛЕНО и NULL
    // Для каждого СтрРез из Мас Цикл
    // Если СтрРез[Кол.Имя] = NULL Тогда
    // СтрРез[Кол.Имя] = "<NULL>";
    // КонецЕсли; // Для каждого СтрРез из Мас Цикл...
    // КонецЦикла;
    //КонецЦикла; // Для каждого Кол Из Рез.Колонки Цикл...
    КонецЕсли; // Если ТипЗнч(Рез)<>ТипЗнч(ДЗ) Тогда...
    КонецЕсли; // Если ВыделитьNULL Тогда ...
    //###Дораборка-

    Если ТипЗнч(Рез)=ТипЗнч(ДЗ) Тогда
    ДЗ = Рез;
    ЭлементыФормы.ДЗ.Данные = "ДЗ";
    Иначе
    ТЗ = Рез;
    ЭлементыФормы.ДЗ.Данные = "ТЗ";
    КонецЕсли;
```

Не хотелось бы чтоб все тормозило. По сравнению то таблиц нам запросы помогут (и так дискуссия помним про нее http://infostart.ru/forum/f86/t118274/)
Что лучше по программной копии таблицы и дерева? Консоль то нужна больше для отладки (чтоб сразу в глаза бросалось что там-то и там-то получается и какого типа - это уже больше для администрирования базы при разборе данных из неизвестного источника и также при разборе 10 этажных запросов.
---
Интересный вопрос - посмотрю позднее.
---
Спасибо ПАН!

Дынный код отработал за 25 минут !
---
asdevlog, нема за шо) рад что помог)
---
С поиском то проблем нет - запросы 1С помогут. Вот только как эффективнее модифицировать таблицы значений. Только по частям по фоновым процессам разбивать? Было тут еще какое-то решение из области фантастики - разбивать нагрузку по ядрам процессора. Только не попадалось.