Вообще-то ответ я, кажется, знаю. Этим вопросом я приглашаю задуматься и, возможно, предложить свое, еще более быстрое решение.
---
awk, Результат в аттаче.
Вы проверяли на файловой базе или в режиме клиент-сервер?
---
ildarovich, зачем их нумеровать ? Если уж на то пошло, то у строк ТЗ сразу есть индексы. Просто берем и пользуемся ими, только они с 0 начинаются.
---
Boneman, индексы отражают не сущности, связанные с конкретной записью, а то, как они сейчас расположились в памяти. Отсортируйте строки - первоначальная картина изменится, а иногда ее нужно зафиксировать чтобы, например, сделать "как было".
Да вот взять хотя бы задачу "место в рейтинге". Этот товар находится на 99-м месте по продаваемости, эта торговая точка находится на 55-м месте по проходимости, этот менеджер находится на 11-м месте по продажности и прочее.
Да вообще, давайте не будем, как бюрократы от программирования в 1С обсуждать "сценарии использования", а абстрактную задачу решим.

Кстати, пришло в голову, что многочисленные "перенумераторы", которых тут пруд-пруди - это тоже пример решения данной задачи. То есть она популярна. Разве что скорость в этой задаче не так критична.
---
ildarovich, Вот именно, у строк ТЗ уже есть индексы. Или имеете ввиду добавление колонки "Дополнительный номер" и его дальнейшая нумерация? В этом случае если сортировать по разному строки ТЗ то нумерация по "дополнительному номеру" может отличаться в различных вариациях
---
tsmgeorg@gmail.com, вот именно,имеете ввиду добавление колонки "Дополнительный номер" и его дальнейшая нумерация
---
ildarovich, циклом по индексам в строку, есть что то быстрее?
---
ildarovich, Вы же здесь http://forum.infostart.ru/forum24/topic41974/message1244332/#message1244332 уже обмолвились о решении.
---
kuzev, Запрос выполнен на UKR: 144,8 сек.

```1c
    ВЫБРАТЬ
    0 КАК Х
    ПОМЕСТИТЬ Регистр1

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    1
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    Младшие.Х + 2 * Старшие.Х КАК Х
    ПОМЕСТИТЬ Регистр2
    ИЗ
    Регистр1 КАК Младшие,
    Регистр1 КАК Старшие
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    Младшие.Х + 4 * Старшие.Х КАК Х
    ПОМЕСТИТЬ Регистр4
    ИЗ
    Регистр2 КАК Младшие,
    Регистр2 КАК Старшие
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    Младшие.Х + 16 * Старшие.Х КАК Х
    ПОМЕСТИТЬ Регистр8
    ИЗ
    Регистр4 КАК Младшие,
    Регистр4 КАК Старшие
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    Младшие.Х + 256 * Старшие.Х КАК Х
    ПОМЕСТИТЬ Регистр16
    ИЗ
    Регистр8 КАК Младшие,
    Регистр8 КАК Старшие
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    Младшие.Х + 65536 * Старшие.Х КАК Х
    ПОМЕСТИТЬ Регистр20
    ИЗ
    Регистр16 КАК Младшие,
    Регистр4 КАК Старшие
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ РАЗЛИЧНЫЕ
    Регистр20.Х КАК Х
    ИЗ
    Регистр20 КАК Регистр20

    УПОРЯДОЧИТЬ ПО
    Х
```

Тесты на нумерацию 1 000 000 строк - 2-3 сек.
---
В СКД есть НомерПоПорядку, для рейтинга. А если нужно сохранить рейтинг то это уже РегСведений.
---
вопрос только зачем?
---
1000 строк

```1c
    Для ит=1 По ТЗ.Количество() Цикл
    ТЗ[ит-1].НомерСтроки = ит;
    КонецЦикла;
```

2,5 микросекунд

```1c
    Для Каждого Строка Из ТЗ Цикл
    Строка.НомерСтроки = ТЗ.Индекс(Строка);
    КонецЦикла;
```

3,5 микросекунд
---
awk, в первом решении нужно убрать и - 1, вместо этого цикл с 0 начинать. Так вот, мой вопрос в том - а можно ли быстрее? Строк, конечно, для заметности, побольше нужно взять. 100 000, например.
---
ildarovich, Не прибегая к конфигурационно-ориентированным методам (выгрузить/загрузить табличную часть)? Нет. А поскольку на 10 000 время нумерации порядка 22 микросек., то не вижу смысла оптимизировать. Для объектов базы есть метод: "ОбновитьНумерациюОбъектов".
---
awk, вы замерили непонятно что, непонятно на чем и зачем
Для "велосипедоизобретателей" см. сюда: http://algolist.manual.ru/misc/o_n.php

:)
---
monkbest, мы люди бесхитростные и используем подход номер 1 из http://algolist.manual.ru/misc/o_n.phpСамый бесхитростный - просто запустить каждый алгоритм на нескольких задачах и сравнить время исполненияи здесь не об алгоритмах речь идет, а о способах - применении разных конструкций языка.
---
ildarovich, awk поймёт, не только ему тролить людей :)
---
monkbest, Простите забыл сложность алгоритмов О(n).
---
Автор видимо не в курсе, что в запросе получающем тз можно указать порядок сортировки. Тогда и индекс на одних и тех же данных будет константным. Только вот при изменении данных он обновится. И поменьше абстракции (выше уже предлагали решение, которое Вас почему-то не устроило), опишите конкретную задачу.
---
ojiojiowka, - а если порядок сортировки будет задаваться разным? - Потребуется перенумеровывать.
Давайте такие задачи возьмем:
1) Оцените девиц в своем коллективе (классе, группе, отделе) с точки зрения: умная, красивая, хорошо готовит (программирует?). По каждому "свойству" от 0 до 9 баллов. Отсортируйте список по каждому показателю. Найдите место каждой в списке, отсортированному по каждому свойству. Найдите для каждой среднее этих мест. Получите интегральную всестороннюю оценку, часто более правильную, чем сортировка по сумме баллов.
2) Лыжная гонка для любителей - марафон. Участники представители разных городов. Получите место каждого по его результату, а затем - получите среднее место участников каждого города, чтобы расставить города в командном зачете.
3) Дан список документов поступления (расхода) некоторого товара за все время работы организации. Найти номер поступления (партии) по порядку с начала ведения учета.
4) Даны ПКО за год - номера должны идти подряд без пропусков и повторений и соответствовать хронологии. Получить в таблице правильные номера ПКО.
Еще много чего можно придумать, но стоит ли?
- Попробуйте решить задачу для общего случая. Дана таблица значений N строк и M столбцов. N достаточно велико. Нужно за минимальное время на 1С добавить столбец с номером строки и заполнить его номером строки.
---
ildarovich, как бы там ни было,
способов заполнить ТЗ всего 2, это либо загрузить подготовленную колонку, либо перебрать коллекцию строк циклом.
Все остальное - демагогия.
---
Boneman, вот, например, можно загрузить ТЗ в соответствующую табличную часть обработки, а выгрузить ее обратно с номером строки. - Мне этот способ не очень нравится, но я не называю его демагогией. Возможно, и еще что-то подобное есть. - Думайте еще.
---
ildarovich, В данных примерах нет никакой перенумерации. Просто есть нумерация, потом выгрузка колонки с номером. А уж затем после каждой сортировки спокойно загружается колонка номеров. Т.е. по факту нумерация нужна всего один раз. Если иметь голову и приберечь массив с номерами:)
---
dusha0020, Приставка пере- при добавлении к глаголам образует глаголы со значением повторного действия над чем-либо
Нумерация Числовое упорядочение объектов, облегчающее ссылки на них

При создании ТЗ имеем "неправильную" нумерацию. Так что термин: "перенумерация" вполне подходящий. И более того семантически единственно верный.
---
awk, Ну уж не знаю что там верно. Но если мы гоняем девиц по всем показателям сортировкой и после каждой сортировки нам нужно знать новое место каждой, то зачем после каждой сортировки исправлять "неправильную" нумерацию (то что я и понимал под перенумерацией)? Достаточно сделать нумерацию один раз и поместить в массив. Конечно, задачу загрузить в колонку с номером после очередной сортировки, сохраненный после первой нумерации массив можно назвать перенумерацией, но я не думаю что алгоритмическую сложность и оптимальность по времени такого действия стоит так долго обсуждать в топике:)
---
dusha0020, вопрос не совсем практический. Задачи придумал наспех, чтобы ответить, что вообще такие задачи есть. Если хорошо подумать, можно и более актуальные точно подходящие случаю задачи предложить. Вы правы насчет возможности один раз сохранить массив с номерами и потом загружать, сколько нужно.
---
мерял проценты, их проще получить замером производительности
100000 строк, 5 колонок строка 100, колонка нумератор число 5

```1c
    к=ТЗ.Количество()-1;
    Для ит=0 По к Цикл
    ТЗ[ит].номер = ит;
    КонецЦикла;
```

18,61%

```1c
    Для ит=0 По ТЗ.Количество()-1 Цикл
    ТЗ[ит].номер = ит;
    КонецЦикла;
```

15,23%

```1c
    Для ит=1 По ТЗ.Количество() Цикл
    ТЗ[ит-1].номер = ит;
    КонецЦикла;
```

16,62%

```1c
    Для Каждого Строка Из ТЗ Цикл
    Строка.номер = ТЗ.Индекс(Строка);
    КонецЦикла;
```

23,56%

```1c
    м = Новый Массив;
    Для ж=1 По 100000 Цикл
    м.Добавить(ж);
    КонецЦикла;
    тз.ЗагрузитьКолонку(м,"номер");
```

10,82% - победитель

Подготовить массив и загрузить его быстрее всего
---
monkbest, а еще быстрее нельзя?
---
Сообщение было скрыто модератором.
---
Вариант не быстрый, приведу просто как один из возможных:

```1c
    ТЗ.Колонки.Добавить("номер");
    НЗ = РегистрыНакопления.US_МестаХранения.СоздатьНаборЗаписей();
    НЗ.Загрузить(ТЗ);
    М = НЗ.ВыгрузитьКолонку("НомерСтроки");
    ТЗ.ЗагрузитьКолонку(М, "номер");
```
---
Предлагаю следующий вариант, это использование запроса и выгрузка результата запроса в таблицу значений. Но данный случай будет работать быстрее, если таблица значений большая, а если количество строк немного то целесообразнее использовать вариант уже предложенный monkbest, как я предполагаю. В данном случае уже будет затрачиваться время на преобразование запроса и выполнение его на сервере, что тоже занимает определенное время, но с точки зрения нагруженных систем я бы выбрал именно этот вариант.
   Запрос.Текст = "ВЫБРАТЬ
  | Т.НомерСтроки + 1 Как ДопНомер,
                | Т.РеквизитN
                | Поместить ТаблицаТЗ
  |ИЗ
  | &ТаблицаЗначений КАК Т";
                |;
                |
                |////////////////////////////////////////////////////////////­////////////////////
                |ВЫБРАТЬ
  | ТаблицаТЗ.ДопНомер,
                | ТаблицаТЗ.РеквизитN
                |из ТаблицаТЗ Как ТаблицаТЗ
  Запрос.УстановитьПараметр("ТаблицаЗначение", ТЗ);
  ТЗ = Запрос.Выполнить.Выгрузить();
---
tsmgeorg@gmail.com,
Содержимое объекта данных можно грузить только во временную таблицу. Кроме того даже если бы это сработало, то откуда у вас заполнится НомерСтроки? В таблице значений его нет. А если его создали, то по условию задачи он еще не заполнен.

// Ред.
На момент написания этого коммента запрос из 24 не содержал временных таблиц.
---
Lotar, Ну тогда запрос будет примерно таким, а так я имел ввиду в принципе методику использования запроса. Следующий запрос тоже написан на скорую руку, но принцип думаю использовать такой.
Запрос.Текст = "ВЫБРАТЬ
         | Т.РеквизитN Как РеквизитN
| | Т.РеквизитN_1 Как РеквизитN_1
                | Поместить ТаблицаТЗ
  |ИЗ
  | &ТаблицаЗначений КАК Т"
                |ИНДЕКСИРОВАТЬ ПО
                | РеквизитN
                |;
                |
                |////////////////////////////////////////////////////////////­////////////////////
                |ВЫБРАТЬ
  | КОЛИЧЕСТВО(ТаблицаТЗ2.РеквизитN)+1 КАК ДопНомер,
                | ТаблицаТЗ.РеквизитN,
                | ТаблицаТЗ.РеквизитN_1
                |из ТаблицаТЗ Как ТаблицаТЗ
                | ВнутреннееСоединение ТаблицаТЗ Как ТаблицаТЗ2
                |по ТаблицаТЗ.Т.РеквизитN >= ТаблицаТЗ2.РевизитN
                |Cгруппировать По
                | ТаблицаТЗ.РеквизитN,
                | ТаблицаТЗ.РеквизитN_1,
                |Упорядочить По ТаблицаТЗ2.РеквизитN
  Запрос.УстановитьПараметр("ТаблицаЗначение", ТЗ);
  ТЗ = Запрос.Выполнить.Выгрузить();
---
tsmgeorg@gmail.com, может стоит попытаться это запустить прежде чем выкладывать?
---
10 000 строк.
Цикл 27 мсек:

```1c
    Для ит=1 По ТЗ.Количество() Цикл
    ТЗ[ит-1].НомерСтроки = ит;
    КонецЦикла;
```

Загрузить из массива 13 мсек:

```1c
    М = новый Массив;
    Для ит=1 По ТЗ.Количество() Цикл
    М.Добавить(ит);
    КонецЦикла;
    ТЗ.ЗагрузитьКолонку(М,"НомерСтроки");
```
---
А так

```1c
    ит=1;
    Для Каждого стр из ТЗ Цикл
    Стр[ИндексКолонкиНомерСтроки ]= ит;
    ит=ит+1;
    КонецЦикла;
```
---
awk, У меня выходит, что если массиву заранее выделить память и заполнять его не через Добавить, а через [], и цикл написать не в 3 строки, а одной, то скорость больше.
Для 1 000 000 записей

ТЗ[ё].НомерСтр = ё; :9 338 мс
врМас[ё] = ё; (3 строки): 7 442 мс
врМас[ё] = ё; (1 строка): 2 893 мс
врМас.Добавить(ё); (3 строки): 6 890 мс
врМас.Добавить(ё); (1 строка): 2 960 мс

Можете у себя проверить?
---
Silenser, Что я делаю не так (1 000 000 строк)
---
awk, Понял. Вместо [] использовал Установить.
---
awk, Можете выложить свою обработку? Я у себя запущу, сравним.
---
Silenser,
---
awk, Результат в аттаче.
Вы проверяли на файловой базе или в режиме клиент-сервер?
---
Silenser, Отладку выключи. На файловой.
---
awk, Без отладки картина аналогична вашей.
---
Народ! Всем спасибо! - Я ошибся - не тот ответ обозначил лучшим - картинки были похожие. Но уже нажал. Теперь останусь awk должен - сочтемся. На самом деле мне больше всего понравился ответ (36) awk - он был правильным - все методы были сравнены, я выбрал установить значение в массив и загрузить в колонку - вряд ли найду лучший. Метод через порождающий запрос, который я показывал в Минимализмах, показывает результаты ровно в ТРИ раза хуже этого (на 5-ти миллионах). Правда при этом еще СОЗДАЕТ таблицу из одной нумерованной колонки. И тоже проигрывает добавлению строки в цикле - но уже в два раза. Так что использовать запрос для создания таблиц значений с нужным числом строк медленнее традиционного способа.
Что же, для меня отрицательный результат - тоже результат.
Спасибо!
---
ildarovich, Метод через порождающий запрос, который я показывал в Минимализмах, показывает результаты ровно в ТРИ раза хуже этого (на 5-ти миллионах). А можно сам запрос. Точнее его окончание. У меня что-то жутко медленно работает. Правда грешу на "УПОРЯДОЧИТЬ ПО" + "РАЗЛИЧНЫЕ".
---
awk, там в Минимализмах в примере 17 функция prototext его формирует автоматом по заданному количеству строк. Запрос результаты помещает в табличку r333, где 333 - это требуемое количество строк. То есть, если вызвать с параметром 5555, то табличка будет r5555. Потом в следующей функции я это имя использую, добавляя запрос выборки результата (вот сейчас понял, что этот запрос - лишний и на этом можно сэкономить, просто убрав последнее ПОМЕСТИТЬ) в виде ВЫБРАТЬ * ИЗ r5555, например. Функция написана по-английски, поэтому столбец называется X (eng).
Я сделал эту функцию, чтобы не писать запрос-генератор числового ряда каждый раз руками.
Поэтому текста запроса готового у меня нет - я их сейчас генерирую "на лету".
Впрочем, приведу все то же самое здесь. Чуть позже приведу вариант без лишней выборки.
```1c
    // Возвращает текст запроса, формирующего таблицу чисел rN с одной колонкой X (eng), содержащую ряд: 0, 1, (N - 1).
    function ProtoText(N, M = 1000000000) export
    return ?(N > 2
    , ProtoText(M - Int(M - Sqrt(N)))
    + strreplace(strreplace(";sel ect top #2 a.X * #1 + b.X X into r#2 fr om r#1 a, r#1 b; drop r#1", "#2", format(N, "NG=")), "#1", format(M - Int(M - Sqrt(N)), "NG="))
    , "sel ect 0 X into r2 uni on sel ect 1")
    endfunction

    // Возвращает таблицу, содержащую последовательность чисел: 0, 1, 2, ..., (ЧислоСтрок - 1)
    Функция ПоследовательностьЧиселТаблицей(ЧислоСтрок) Экспорт
    Возврат НовыйЗапрос(ProtoText(ЧислоСтрок) + "; sel ect * fr om r" + format(ЧислоСтрок, "NG=")).Выполнить().Выгрузить()
    КонецФункции
```

Вот вариант без лишней выборки
```1c
    // Возвращает текст запроса, формирующего таблицу чисел rN с одной колонкой X (eng), содержащую ряд: 0, 1, (N - 1).
    function ProtoText(N, M = 1000000000) export
    return ?(N > 2
    , ProtoText(M - Int(M - Sqrt(N)))
    + strreplace(strreplace(";select top #2 a.X * #1 + b.X X into r#2 fr om r#1 a, r#1 b; drop r#1", "#2", format(N, "NG=")), "#1", format(M - Int(M - Sqrt(N)), "NG="))
    , "select 0 X into r2 uni on select 1")
    endfunction

    // Возвращает таблицу, содержащую последовательность чисел: 0, 1, 2, ..., (ЧислоСтрок - 1)
    Функция ПоследовательностьЧиселТаблицей(ЧислоСтрок) Экспорт
    Запрос = Новый Запрос(СтрЗаменить(ProtoText(ЧислоСтрок), "into r" + format(ЧислоСтрок, "NG="), "));
    Возврат Запрос.Выполнить().Выгрузить()
    КонецФункции

    // Возвращает массив, содержащий последовательность чисел: 0, 1, 2, ..., (ЧислоЭлементов - 1)
    Функция ПоследовательностьЧиселМассивом(ЧислоЭлементов) Экспорт
    Возврат ПоследовательностьЧиселТаблицей(ЧислоЭлементов).ВыгрузитьКолонку(0)
    КонецФункции
```

У меня получается, что для миллиона элементов обычный самый быстрый способ - 4,368 сек.
А вариант через порождающий запрос - 7,192 сек.
На SQL не проверял - могут быть тормоза.

Тут, видимо, какая-то защита против SQL injection стоит, поэтому нужно после копирования себе убрать пробелы в словах sel ect и union.
---
Кстати цикл 32 сливает

Вот такой цикл самый быстрый

```1c
    Функция ПолучитьИдексПоля(Тз,имяПоля)

    Колонки=Тз.Колонки;
    Колонка=Колонки.Найти(ИмяПоля);

    Если Колонка=неопределено Тогда
    тз.ВыбратьСтроку();

    ВызватьИсключение "Не найдена колонка "+ИмяПоля;
    КонецЕсли;

    возврат Колонки.Индекс(Колонка);
    КонецФункции

    Процедура Тест(Параметры) Экспорт

    Индекс=ПолучитьИдексПоля(Тз,"НомерСтроки");

    Граница=Тз.Количество()-1;
    Для сч=1 По Граница Цикл Тз[сч][Индекс]=сч КонецЦикла
    КонецПроцедуры
```

То есть Доступ через индекс быстрее
Ну и

Граница=Тз.Количество()-1;
Для сч=1 По Граница Цикл

быстрее чем
Для ит=0 По ТЗ.Количество()-1 Цикл
---
Serginio,Граница=Тз.Количество()-1;
Для сч=1 По Граница Цикл

быстрее чем
Для ит=0 По ТЗ.Количество()-1 Циклэто странно, я как-то проверял - граничное значение цикла вычисляется один раз. Пора все эти советы по микрооптимизации где-то зафиксировать - потом замаемся искать.
---
Так можно в студию код победителя? а то сказали, что больше всего понравился вариант (36), а там куска кода-то и нет:) только картинка

а то получается в конкурсе на лучший код победила картинка
это, как лучший прыгун в высоту - боксер, остальные отказались прыгать по состоянию здоровья
---
monkbest, ищите в этой теме. все есть.
---
МихаилМ, перечитал - не нашел

реально скажите номер поста, в котором самый оптимальный код

последние посты с кодом - 26 и 32, дальше идут замеры и рассуждения
---
последний с кодом - (50) пост.

предпоследний - (39)

я считаю, что оптимальный мой код (50), но он не универсален и громоздкий.

опишите точнее критерии оптимальности.
---
МихаилМ, в (50) обработка, которая сравнивает разные методы, в том числе и те, которые были предложены другими участниками переписки.
я правильно понял, что лидер - последний вариант в вашей обработке?

хотя, конечно, спорный момент. Все равно, что самый быстрый способ сложить 2 + 2, это сразу писать в память 4, не выполняя никаких вычислений)
---
нет. Вы не правильно поняли : в моей обработке - не все методы, которые есть в (39)

обработка - пример идеи, а не законченный рабочий код.

"хотя, конечно, спорный момент"-
В вычислительной математике - все моменты спорные, т.к. контекстные.
---
monkbest, Победитель - Цузе, Конрад.
---
Во втором варианте 13мсек это только загрузка массива в колонку ТЗ, или формирование+загрузка вместе? Просто странно как-то, откуда такая разница в обходе 2 коллекций с равным количеством элементов.
---
mymyka, Замер ставился на вместе...
---
можно еще
использовать сохраненное значение массива в ХЗ в строку внутреннюю .

способ не универсальный
эффективен где-то строк ТЗ до 500 000 (может зависеть от типа процессора)
---
Резюмируя: Циклы в одну строку дают прирост, но... Прирост порядка 0.2 секунды, на миллион строк. Что вполне сопоставимо с погрешностью измерения. Следовательно данные улучшения малоцелесообразны, в связи с резким падением читабельности.
---
Если речь идёт об однозначной идентификации строк то я использую "хеш". Может я что-то путаю, но я называю это так.
Это функция, которая создаёт уникальный идентификатор каждой строки. Например, если таблица значений состоит из двух колонок с типом "справочник" (спр1 и спр2), то хеш у меня будет выглядеть примерно так:

Функция Хеш(СтрокаТаблицы)
   Возврат СтрокаТаблицы.Спр1.Код+СтрокаТаблицы.Спр2.Код;
КонецФункции;

Можно к таблице добавить ещё одну колонку и записать хеш для каждой строки туда, а потом отсортировать.

Прошу прощения если, возможно, не в тему.

P.S. Можно и в запросе это реализовать
---
написал "полноценный" , не оценочный метод создания пронумерованного массива из строки внутренней

"полноценный" тк можно и нужно увеличить грануляцию.
---
МихаилМ, я, кстати, на основе вашей находки вот такую функцию написал. Правда, оказалась пока бесполезной, потому, что медленная, но может где как запчасть подойдет. Правда из серии "спички детям не игрушка"
```1c
    Функция ПротоТаблица(Строк) Экспорт
    Если Строк > 1 Тогда
    Инь = ПротоТаблица(Цел(Строк / 2));
    Янь = ПротоТаблица(Строк - Цел(Строк / 2));
    КучаСтрок = Инь.НайтиСтроки(Новый Структура("_", 0));
    Для Каждого Строка Из Янь Цикл КучаСтрок.Добавить(Строка) КонецЦикла;
    Возврат Инь.Скопировать(КучаСтрок)
    Иначе
    Инь = Новый ТаблицаЗначений;
    Инь.Колонки.Добавить("_", Новый ОписаниеТипов("Число"));
    Инь.Добавить();
    Возврат Инь
    КонецЕсли
    КонецФункции
```
Функция создает таблицу из одной колонки с заданным числом строк.
---
ildarovich, зачем 1 колонка(а не нужное количество) , почему тип число(а не строка).
---
+(55) у 1с рекурсия - ресурсоёмка, строках на 135 000 должна зависнуть навсегда.
---
МихаилМ, не могу себе этого объяснить. Ведь здесь и параметры и результат - указатели(ссылки). Массив должен из кучи браться, то есть в стек практически ничего не помещается. Что может тормозить? Глубина рекурсии здесь совсем небольшая - для миллиона строк всего 20 уровней.
---
МихаилМ, я вообще-то хотел сделать таблицу вообще без колонок из заданного количества строк, чтобы потом по-быстрому добавить нужное число колонок сразу ко всем строкам. Хотел быстрее. Но одна колонка получалась рабочей - для отбора и я не стал заморачиваться с ее добавлением-удалением в каждом уровне рекурсии.
---
(59) понял.
ildarovich
 так какой самый быстрый алгоритм ?
---
МихаилМ, я так посчитал, что из (36) обозначенный голубым цветом - лучший, но я его с вашим методом загрузки из подготовленного сериализованного массива не сравнивал - просто взял ваш метод на заметку. Мне на самом деле был нужен конкурент для сравнения с методом формирования таблицы чисел запросом. Мои начальные замеры содержали не оптимальный код для традиционного метода. Когда его тут аккуратно переписали, запрос тут же проиграл.
---
у меня 4 и 5 варианты в явном преимуществе, а из них 5 опережает по скорости на 3-5%. БД на скуле
также искал вариант что быстро отрабатывает. выбрал 5-й т.к. в нем нумерацию колонок можно начать с 1, а не 0