Всем добрый день. УФ
Есть таблица на форме(ФотоНоменклатуры - Порядок,ИмяФайла), при выборе номенклатуры она заполняется данными из регистра, если таковы имеются. При заполнение Порядок всегда встает по порядку 1,2,3.
 У меня следующая задача:
1) Добавить кнопки движения строк вверх/вниз. С учетом изменения реквизита "Порядок". То есть сдвинули строку 1 вниз, порядок стал =2. У сдвинутой строки был порядок 2, должен стать 1. И так всегда.
2) Добавлять новую строку. Добавление последнего порядка учитывается. - вроде ок.

Собственно проблема со сдвигами, где я ошибся? цифры меняются как попало... :
Конкретно после "Сдвига" не могу отловить позицию текущей строки и заменить порядок позиции сдвигаемой строки

```1c
    &НаКлиенте
    Процедура Добавить(Команда)

    ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

    Если ДиалогВыбораФайла.Выбрать() Тогда

    ИмяФайла = СтрЗаменить(ДиалогВыбораФайла.ПолноеИмяФайла, ДиалогВыбораФайла.Каталог, ");
    НоваяСтрока = ФотоНоменклатуры.Добавить();

    Элементы.ФотоНоменклатуры.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();

    ИдСтроки = Элементы.ФотоНоменклатуры.ТекущаяСтрока;
    ТекСтрока = ФотоНоменклатуры.найтиПоИдентификатору(ИдСтроки);

    ТекСтрока.ИмяФайла = ДиалогВыбораФайла.ПолноеИмяФайла ;

    ТекСтрока.Порядок= ФотоНоменклатуры.Количество();

    КонецЕсли;

    КонецПроцедуры

    &НаКлиенте
    Процедура Вверх(Команда)

    Смещение = -1;

    //Сначала получаем выделенную строку:

    ИдСтроки= Элементы.ФотоНоменклатуры.ТекущаяСтрока;

    ТекСтрока = ФотоНоменклатуры.НайтиПоИдентификатору(ИдСтроки);

    Если ТекСтрока.Порядок= 1 И Смещение = -1 Тогда
    // Первую строку не двигаем вверх
    Возврат;

    КонецЕсли;

    Если ТекСтрока.Порядок= ФотоНоменклатуры.Количество() И Смещение = 1 Тогда
    // Последнюю строку не двигаем вниз
    Возврат;
    КонецЕсли;
    //Далее двигаем вверх/вниз

    // Смещение - минус 1 - двигаем вверх, 1 - двигаем вниз

    ФотоНоменклатуры.Сдвинуть(ИдСтроки, Смещение);

    // ну и дальше изменяем порядковый номер

    ТекСтрока.Порядок= ТекСтрока.Порядок+Смещение;

    СтрокаИзменить = ФотоНоменклатуры[ИдСтроки ];

    СтрокаИзменить.Порядок= СтрокаИзменить.Порядок- Смещение;

    КонецПроцедуры

    &НаКлиенте
    Процедура Вниз(Команда)
    Смещение = 1;

    //Сначала получаем выделенную строку:

    ИдСтроки= Элементы.ФотоНоменклатуры.ТекущаяСтрока;

    ТекСтрока = ФотоНоменклатуры.НайтиПоИдентификатору(ИдСтроки);

    Если ТекСтрока.Порядок= 1 И Смещение = -1 Тогда

    // Первую строку не двигаем вверх

    Возврат;

    КонецЕсли;

    Если ТекСтрока.Порядок= ФотоНоменклатуры.Количество() И Смещение = 1 Тогда

    // Последнюю строку не двигаем вниз

    Возврат;

    КонецЕсли;

    //Далее двигаем вверх/вниз

    // Смещение - минус 1 - двигаем вверх, 1 - двигаем вниз

    ФотоНоменклатуры.Сдвинуть(ИдСтроки, Смещение);

    // ну и дальше изменяем порядковый номер

    ТекСтрока.Порядок= ТекСтрока.Порядок+Смещение;

    СтрокаИзменить = ФотоНоменклатуры[ИдСтроки];

    СтрокаИзменить.Порядок= СтрокаИзменить.Порядок- Смещение;

    КонецПроцедуры
```
---
Процедура для смещения указанной строки на произвольное число позиций:

```1c
    &НаКлиенте
    Процедура СдвинутьСтроку(ТекущаяСтрока, Смещение)

    ИндексТекущей = ФотоНоменклатуры.Индекс(ТекущаяСтрока);
    НовыйИндекс = ИндексТекущей + Смещение;

    Если НовыйИндекс < 0 Тогда
    НовыйИндекс = 0;
    ИначеЕсли НовыйИндекс > ФотоНоменклатуры.Количество() - 1 Тогда
    НовыйИндекс = ФотоНоменклатуры.Количество() - 1;
    КонецЕсли;

    Если ИндексТекущей = НовыйИндекс Тогда
    Возврат;
    КонецЕсли;

    НовыйПорядок = ФотоНоменклатуры[НовыйИндекс].Порядок;

    Индекс = НовыйИндекс;
    Шаг = ?(Смещение > 0, -1, 1);

    Пока Индекс <> ИндексТекущей Цикл

    ФотоНоменклатуры[Индекс].Порядок = ФотоНоменклатуры[Индекс + Шаг].Порядок;
    Индекс = Индекс + Шаг;

    КонецЦикла;

    ТекущаяСтрока.Порядок = НовыйПорядок;

    ФотоНоменклатуры.Сдвинуть(ИндексТекущей, НовыйИндекс - ИндексТекущей);

    Элементы.ФотоНоменклатуры.ТекущаяСтрока = ФотоНоменклатуры[НовыйИндекс].ПолучитьИдентификатор();

    КонецПроцедуры

    &НаКлиенте
    Процедура СдвинутьВверх(Команда)

    СдвинутьСтроку(Элементы.ФотоНоменклатуры.ТекущиеДанные, -1);

    КонецПроцедуры

    &НаКлиенте
    Процедура СдвинутьВниз(Команда)

    СдвинутьСтроку(Элементы.ФотоНоменклатуры.ТекущиеДанные, 1);

    КонецПроцедуры
```
---
Самая первая Ваша ошибка - использование идентификатора строки как индекса. Это в общем случае неверно, хоть идентификатор и имеет числовой тип.
---
Не моё решение, подсказали. Интересно стало, почему не верно ? По факту это близко не индекс даже?
---
Даже близко не индекс. Единственное, что их роднит - это тип. Попробуйте провести эксперимент: заполните таблицу, выведите на экран идентификаторы строк по порядку, сдвиньте пару строк и вновь выведите идентификаторы.
---
Процедура для смещения указанной строки на произвольное число позиций:

```1c
    &НаКлиенте
    Процедура СдвинутьСтроку(ТекущаяСтрока, Смещение)

    ИндексТекущей = ФотоНоменклатуры.Индекс(ТекущаяСтрока);
    НовыйИндекс = ИндексТекущей + Смещение;

    Если НовыйИндекс < 0 Тогда
    НовыйИндекс = 0;
    ИначеЕсли НовыйИндекс > ФотоНоменклатуры.Количество() - 1 Тогда
    НовыйИндекс = ФотоНоменклатуры.Количество() - 1;
    КонецЕсли;

    Если ИндексТекущей = НовыйИндекс Тогда
    Возврат;
    КонецЕсли;

    НовыйПорядок = ФотоНоменклатуры[НовыйИндекс].Порядок;

    Индекс = НовыйИндекс;
    Шаг = ?(Смещение > 0, -1, 1);

    Пока Индекс <> ИндексТекущей Цикл

    ФотоНоменклатуры[Индекс].Порядок = ФотоНоменклатуры[Индекс + Шаг].Порядок;
    Индекс = Индекс + Шаг;

    КонецЦикла;

    ТекущаяСтрока.Порядок = НовыйПорядок;

    ФотоНоменклатуры.Сдвинуть(ИндексТекущей, НовыйИндекс - ИндексТекущей);

    Элементы.ФотоНоменклатуры.ТекущаяСтрока = ФотоНоменклатуры[НовыйИндекс].ПолучитьИдентификатор();

    КонецПроцедуры

    &НаКлиенте
    Процедура СдвинутьВверх(Команда)

    СдвинутьСтроку(Элементы.ФотоНоменклатуры.ТекущиеДанные, -1);

    КонецПроцедуры

    &НаКлиенте
    Процедура СдвинутьВниз(Команда)

    СдвинутьСтроку(Элементы.ФотоНоменклатуры.ТекущиеДанные, 1);

    КонецПроцедуры
```
---
А при "добавлении" моим способом не будет сбиваться это дело всё и в процедедуре добавления так же надо убрать поиск по идентификатору ?
И ещё надо получается добавить кнопку "удалить" ?
---
Ничего не могу сказать про добавление и удаление, т.к. в исходной постановке задачи вижу только описание проблемы со сдвигом и соответствующий ей код.
---
Вопрос остался. Как добавить программное удаление со сдвигом "Порядка"?
---
В чем же сложность?

```1c
    &НаКлиенте
    Процедура УдалитьСтроку(ТекущаяСтрока)

    ИндексТекущей = ФотоНоменклатуры.Индекс(ТекущаяСтрока);

    Индекс = ФотоНоменклатуры.Количество() - 1;
    Пока Индекс > ИндексТекущей Цикл

    ФотоНоменклатуры[Индекс].Порядок = ФотоНоменклатуры[Индекс - 1].Порядок;
    Индекс = Индекс - 1;

    КонецЦикла;

    ФотоНоменклатуры.Удалить(ТекущаяСтрока);

    КонецПроцедуры
```
---
Если у вас в качестве источника данных таблицы используется табличная часть, то можно использовать системное поле "НомерСтроки". Там ничего пересчитывать при смещении не надо. Могу ошибаться, но у таблицы значений в качестве источника данных тоже есть поле НомерСтроки Нету такого. проверил
---
Нашел ошибку:

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

ЛУчший вариант в вашем случае - перенумерация всех строк после смещения. Либо еще лучший вариант, если вы используете обработку - создать в метаданных обработки табличную часть и выводить ее на форму и, соответственно, заполнять эту табличную часть данными регистра сведений. У табличной части есть предопределенное поле НомерСтроки.