Имеется справочник СписокНоменклатура. Необходимо обновить некоторые реквизиты нашего справочника из входящей таблицы (Таб). Связь осуществляется по Код.

```1c
    Кол = СписокНоменклатура.Количество();
    Для Индекс = 0 По Кол - 1 Цикл
    Элемент = Таб.Найти(СписокНоменклатура[Индекс].Номенклатура.Код1С, "Код");
    ...
    КонецЦикла
```

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

Вопрос: Как решать данную задачу быстро?

На ум приходит только запросом, подключив Таб как источник
СписокНоменклатура ЛЕВОЕ СОЕДИНЕНИЕ Таб ПО Код
---
Разобрался.
Да, (15) прав, СправочникСсылка - это результат запроса, выгруженный в таблицу

```1c
    ЗапросНоменклатура.Текст = "
    |ВЫБРАТЬ
    | Спр.Ссылка КАК Номенклатура
    |ИЗ
    | Справочник.МАГ_Номенклатура КАК Спр
    |ГДЕ
    | Спр.ОстаткиВыгрузить = ИСТИНА";
    СписокНоменклатура = ЗапросНоменклатура.Выполнить().Выгрузить();
```
тормоз был в том, что Код1С получал как
СписокНоменклатура[Индекс].Номенклатура.Код1С

и изменив логику на такую:

```1c
    ЗапросНоменклатура.Текст = "
    |ВЫБРАТЬ
    | Спр.Ссылка КАК Номенклатура,
    | Спр.Код1С КАК Код1С
    |ИЗ
    | Справочник.МАГ_Номенклатура КАК Спр
    |ГДЕ
    | Спр.ОстаткиВыгрузить = ИСТИНА";
    СписокНоменклатура = ЗапросНоменклатура.Выполнить().Выгрузить();
```
СписокНоменклатура[Индекс].Код1С

получил увеличение с 40-50 сек до мгновенного.

и индексы
(2) Таб.Индексы.Добавить("Код")да, дают прирост скорости на моих данных в несколько раз точно, но это уже почти незаметно :)

т.е. как указал
(16) дело в разыменованиях
---
Каким образом сформирован СписокНоменклатуры? Что есть Таб и как она сформирована?
---
Каким образом сформирован СписокНоменклатуры
это Справочник

(6) Что есть Таб и как она сформирована
Таб = Новый ТаблицаЗначений;
и потом заполняется данными из внешнего xml
---
В таком случае - запросом.
---
Необходимо обновить некоторые реквизиты нашего справочника
Запросом однозначно, но в любом случае будет "тормозить", вот это означает получение/запись объектов в цикле. Что само по себе затратная операция. Делайте в транзакции порционно.
---
если изменяемых элементов очень много, то возможно проще и быстрее будет делать напрямую в базе, если база серверная.
---
Судя по приведенному отрывку кода, СписокНоменклатура - это вообще ни разу не справочник:

```1c
    СписокНоменклатуры[Индекс]
```

У СправочникСсылка нет получения значения по индексу, а для СправочникОбъект - это вообще бессмыслено в приведенном контексте.
СписокНоменклатура - это, я так понимаю, все-таки таблица значений? Добавьте в нее колонку "Код", при заполнении таблицы "СписокНоменклатура" сразу заполняйте эту колонку и далее ищите строки по ней. Но лучше в запрос передавайте
---
вместо таблицы значений использовать соответствие
https://infostart.ru/1c/articles/79285/
---
Добавьте индексы в таблицу значений Таб:
```1c
    Таб.Индексы.Добавить("Код")
```
 Элемент ищите методом НайтиСтроки:
```1c
    Таб.НайтиСтроки(Новый Структура("Код", Код1С))
```
Откажитесь от получения реквизитов объекта через точку во встроенном языке.
---
Таб.Индексы.Добавить("Код")
фактически ничего индексы не дали

(2) Таб.НайтиСтроки(Новый Структура("Код", Код1С))
замена на НайтиСтроки аналогично - прироста скорости нет
---
замена на НайтиСтроки аналогично - прироста скорости нет Прироста не может не быть – скорее он не существенен по сравнению с временем выполнения процедур и обработчиков, вызываемых записью объекта. Если это нештатное изменение реквизитов и не требуется регистрация изменений, то можно ускорить запись установив ОбменДанными.Загрузка = Истина.
---
Разобрался.
Да, (15) прав, СправочникСсылка - это результат запроса, выгруженный в таблицу

```1c
    ЗапросНоменклатура.Текст = "
    |ВЫБРАТЬ
    | Спр.Ссылка КАК Номенклатура
    |ИЗ
    | Справочник.МАГ_Номенклатура КАК Спр
    |ГДЕ
    | Спр.ОстаткиВыгрузить = ИСТИНА";
    СписокНоменклатура = ЗапросНоменклатура.Выполнить().Выгрузить();
```
тормоз был в том, что Код1С получал как
СписокНоменклатура[Индекс].Номенклатура.Код1С

и изменив логику на такую:

```1c
    ЗапросНоменклатура.Текст = "
    |ВЫБРАТЬ
    | Спр.Ссылка КАК Номенклатура,
    | Спр.Код1С КАК Код1С
    |ИЗ
    | Справочник.МАГ_Номенклатура КАК Спр
    |ГДЕ
    | Спр.ОстаткиВыгрузить = ИСТИНА";
    СписокНоменклатура = ЗапросНоменклатура.Выполнить().Выгрузить();
```
СписокНоменклатура[Индекс].Код1С

получил увеличение с 40-50 сек до мгновенного.

и индексы
(2) Таб.Индексы.Добавить("Код")да, дают прирост скорости на моих данных в несколько раз точно, но это уже почти незаметно :)

т.е. как указал
(16) дело в разыменованиях
---
А если сделать наоборот - перебирать таблицу и искать элемент справочника через

```1c
    Ссылка = СписокНоменклатура.НайтиПоРеквизиту("Код1С", СтрокаТаб.Код)
```

Думаю, платформенный метод должен искать за сравнимое с запросом время.
---
Это будет запрос в цикле.
---
ИЗ таб
             Левое соединение СправочникНоменклатуры
---
Запросом можно попробовать, добавив в запросе "ПРОИНДЕКСИРОВАТЬ ПО" Код

Хотя код уже вероятно по умолчанию проиндексирован.
---
Вам бы пройти ликбез про назначение слова "ПРОИНДЕКСИРОВАТЬ" в запросе...
---
ну да не прав.
---
В (2) еще упоминалось, что нужно отказаться от разыменований.
Если индексы не дали эффекта, то дело в разыменованиях. Т.е., тут:

```1c
    Элемент = Таб.Найти(СписокНоменклатура[Индекс].Номенклатура.Код1С, "Код")
```