День добрый.
Возникла задача по заполнению табличной части документа внешней обработкой (БСП).
Вид = "ЗаполнениеОбъекта"
Использование = "ЗаполнениеФормы"

Алгоритм заполнения кратко:

```1c
    Выборка = Запрос.Выполнить.Выбрать();

    Пока Выборка.Следующий() Цикл

    Форма.Объект.Товары[Выборка.НомерСтроки-1].СерийныйНомер = СокрЛП(Выборка.САПКод);

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

где НомерСтроки - это Стандартный реквизит табличной части.

Т.е. обращаюсь к строке по индексу, считая что "Индекс строки" = "Номер строки - 1"

Вопрос - а всегда ли это так? Может где-то описано?

Спасибо.
---
не совсем так. При изменении ДанныеФормыКоллекция индексы также будут перестроены. По сути это индексы массива строк. И всегда Индекс будет соответствовать (НомерСтроки-1). НомерСтроки так же перестраивается. Другое дело, что НомерСтроки перестроенных строк на форме могут не соответствовать НомерСтроки из БД.
Помимо этого есть еще ИсходныйНомерСтроки и скрытый индекс(Идентификатор), который можно получить через метод ПолучитьИдетнификатор(). Вот они остаются неизменными(ИсходныйНомерСтроки до записи в БД) и удаленные строки не освобождают нумерацию Идентификатора.
---
Индекс выборки всегда от нуля.
---
Индекс строки - неизменный идентификатор строки, номер строки - изменяемый пользователем альтернативный идентификатор строки.
---
Вопрос - а всегда ли это так?
Не всегда. Индексы формируются при создании формы, и далее все время жизни формы только увеличиваются. Т.е. при открытии формы в которой уже есть 5 строк, они действительно заполнятся от 0 до 4, но дальше при перемещении этих строк вверх-вниз их индексы останутся неизменными и вы получите произвольный порядок (2-3-0-1-4, например). При удалении строки индекс также не освобождается, например, если вы удалите строку с индексом 4, то новая добавленная будет иметь индекс 5
---
не совсем так. При изменении ДанныеФормыКоллекция индексы также будут перестроены. По сути это индексы массива строк. И всегда Индекс будет соответствовать (НомерСтроки-1). НомерСтроки так же перестраивается. Другое дело, что НомерСтроки перестроенных строк на форме могут не соответствовать НомерСтроки из БД.
Помимо этого есть еще ИсходныйНомерСтроки и скрытый индекс(Идентификатор), который можно получить через метод ПолучитьИдетнификатор(). Вот они остаются неизменными(ИсходныйНомерСтроки до записи в БД) и удаленные строки не освобождают нумерацию Идентификатора.
---
Спасибо за развернутый ответ!
И всегда Индекс будет соответствовать (НомерСтроки-1) - а это личный опыт, или где-то описано такое поведение платформы?

Кто хочет поэкспериментировать, вот код

```1c
    &НаКлиенте
    Процедура ТабличнаяЧасть1ПриАктивизацииСтроки(Элемент)

    Если Объект.ТабличнаяЧасть1.Индекс(Элемент.ТекущиеДанные) > -1 Тогда
    Сообщить("Индекс: " + Объект.ТабличнаяЧасть1.Индекс(Элемент.ТекущиеДанные)+ " Номер строки: " +
    Элемент.ТекущиеДанные.НомерСтроки + " Идентификатор строки: " + Элементы.ТабличнаяЧасть1.ТекущаяСтрока);
    КонецЕсли;

    КонецПроцедуры
```
---
- а это личный опыт, или где-то описано такое поведение платформы?
Скорее личный опыт. По индексу вопросов нет, как и говорил, это по сути индекс массива строк. А НомерСтроки тоже перестраивается. Вот и получается их связанное поведение.
---
Индекс соответствует (НомерСтроки-1) только тогда когда документ создан и в табличной части ничего не менялось...
Если добавить, убавить строки, сделать обеспечение руками, то - все индексы разбежались
---
то - все индексы разбежались Ты бы проверил хотя бы сам, что пишешь.

Номер строки, который хранится в базе и который при выгрузке табличной части в таблицу значений появляется - он всегда от 1, и всегда на 1 больше индекса в коллекции.

Индекс, который в коллекции - он всегда от 0 и всегда на 1 меньше текущего номера строки.

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

Правильное использование этого числового идентификатора

```1c
    Идентификатор = Элементы.ТаблицаФормы.ТекущаяСтрока;

    СтрокаДанных = ДанныеТаблицыФормы.НайтиПоИдентификатору(Идентификатор);
    Если СтрокаДанных = Неопределено Тогда
    // Это не строка данных, а какая-то строка группировки или что-то левое
    Иначе
    ИндексВКоллекции = ДанныеТаблицыФормы.Индекс(СтрокаДанных);
    ТекущийНомерСтроки = ИндексВКоллекции + 1;
    ИсходныйНомерСтроки = СтрокаДанных.ИсходныйНомерСтроки;
    КонецЕсли;
```
---
Только что проверил...
---
Вы в выборку засунули табличную часть формы? Или перед использованием записываете документ?

Обычно перед заполнением табличная часть очищается и просто заполняется результатом запроса. Если нужно сохранить порядок строк, то отсортируйте по номеру строки. А искать соответствие так себе идея