Двиг вниз вверх + добавление с учетом порядка

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

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

&НаКлиенте
Процедура Добавить(Команда)
	
	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

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

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

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

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

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

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

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

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

СтрокаИзменить.Порядок= СтрокаИзменить.Порядок- Смещение;
					
КонецПроцедуры
	
	
	
&НаКлиенте
Процедура Вниз(Команда)
Смещение  = 1;
		
//Сначала получаем выделенную строку:

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

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



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

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

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

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

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

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

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

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

СтрокаИзменить.Порядок= СтрокаИзменить.Порядок- Смещение;
		
КонецПроцедуры
Показать
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
4. dhurricane 25.01.21 14:01 Сейчас в теме +0.42 $m
(1) Процедура для смещения указанной строки на произвольное число позиций:
&НаКлиенте
Процедура СдвинутьСтроку(ТекущаяСтрока, Смещение)
	
	ИндексТекущей = ФотоНоменклатуры.Индекс(ТекущаяСтрока);
	НовыйИндекс = ИндексТекущей + Смещение;
	
	Если НовыйИндекс < 0 Тогда
		НовыйИндекс = 0;
	ИначеЕсли НовыйИндекс > ФотоНоменклатуры.Количество() - 1 Тогда
		НовыйИндекс = ФотоНоменклатуры.Количество() - 1;
	КонецЕсли;
	
	Если ИндексТекущей = НовыйИндекс Тогда
		Возврат;
	КонецЕсли;
	
	НовыйПорядок = ФотоНоменклатуры[НовыйИндекс].Порядок;
	
	Индекс = НовыйИндекс;
	Шаг = ?(Смещение > 0, -1, 1);
	
	Пока Индекс <> ИндексТекущей Цикл
		
		ФотоНоменклатуры[Индекс].Порядок = ФотоНоменклатуры[Индекс + Шаг].Порядок;		
		Индекс = Индекс + Шаг;
		
	КонецЦикла;
	
	ТекущаяСтрока.Порядок = НовыйПорядок;
	
	ФотоНоменклатуры.Сдвинуть(ИндексТекущей, НовыйИндекс - ИндексТекущей);
	
	Элементы.ФотоНоменклатуры.ТекущаяСтрока = ФотоНоменклатуры[НовыйИндекс].ПолучитьИдентификатор();
	
КонецПроцедуры

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

&НаКлиенте
Процедура СдвинутьВниз(Команда)
	
	СдвинутьСтроку(Элементы.ФотоНоменклатуры.ТекущиеДанные, 1);
	
КонецПроцедуры
Показать
Intercititude; na688; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. dhurricane 25.01.21 13:33 Сейчас в теме
(1) Самая первая Ваша ошибка - использование идентификатора строки как индекса. Это в общем случае неверно, хоть идентификатор и имеет числовой тип.
7. Intercititude 25.01.21 17:06 Сейчас в теме
(2) Не моё решение, подсказали. Интересно стало, почему не верно ? По факту это близко не индекс даже?
8. dhurricane 26.01.21 04:52 Сейчас в теме
(7) Даже близко не индекс. Единственное, что их роднит - это тип. Попробуйте провести эксперимент: заполните таблицу, выведите на экран идентификаторы строк по порядку, сдвиньте пару строк и вновь выведите идентификаторы.
4. dhurricane 25.01.21 14:01 Сейчас в теме +0.42 $m
(1) Процедура для смещения указанной строки на произвольное число позиций:
&НаКлиенте
Процедура СдвинутьСтроку(ТекущаяСтрока, Смещение)
	
	ИндексТекущей = ФотоНоменклатуры.Индекс(ТекущаяСтрока);
	НовыйИндекс = ИндексТекущей + Смещение;
	
	Если НовыйИндекс < 0 Тогда
		НовыйИндекс = 0;
	ИначеЕсли НовыйИндекс > ФотоНоменклатуры.Количество() - 1 Тогда
		НовыйИндекс = ФотоНоменклатуры.Количество() - 1;
	КонецЕсли;
	
	Если ИндексТекущей = НовыйИндекс Тогда
		Возврат;
	КонецЕсли;
	
	НовыйПорядок = ФотоНоменклатуры[НовыйИндекс].Порядок;
	
	Индекс = НовыйИндекс;
	Шаг = ?(Смещение > 0, -1, 1);
	
	Пока Индекс <> ИндексТекущей Цикл
		
		ФотоНоменклатуры[Индекс].Порядок = ФотоНоменклатуры[Индекс + Шаг].Порядок;		
		Индекс = Индекс + Шаг;
		
	КонецЦикла;
	
	ТекущаяСтрока.Порядок = НовыйПорядок;
	
	ФотоНоменклатуры.Сдвинуть(ИндексТекущей, НовыйИндекс - ИндексТекущей);
	
	Элементы.ФотоНоменклатуры.ТекущаяСтрока = ФотоНоменклатуры[НовыйИндекс].ПолучитьИдентификатор();
	
КонецПроцедуры

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

&НаКлиенте
Процедура СдвинутьВниз(Команда)
	
	СдвинутьСтроку(Элементы.ФотоНоменклатуры.ТекущиеДанные, 1);
	
КонецПроцедуры
Показать
Intercititude; na688; +2 Ответить
6. Intercititude 25.01.21 16:56 Сейчас в теме
(4) А при "добавлении" моим способом не будет сбиваться это дело всё и в процедедуре добавления так же надо убрать поиск по идентификатору ?
И ещё надо получается добавить кнопку "удалить" ?
9. dhurricane 26.01.21 04:53 Сейчас в теме
(6) Ничего не могу сказать про добавление и удаление, т.к. в исходной постановке задачи вижу только описание проблемы со сдвигом и соответствующий ей код.
10. Intercititude 26.01.21 10:25 Сейчас в теме
(4) Вопрос остался. Как добавить программное удаление со сдвигом "Порядка"?
11. dhurricane 26.01.21 13:38 Сейчас в теме
(10) В чем же сложность?
&НаКлиенте
Процедура УдалитьСтроку(ТекущаяСтрока)
	
	ИндексТекущей = ФотоНоменклатуры.Индекс(ТекущаяСтрока);
    
	Индекс = ФотоНоменклатуры.Количество() - 1;
	Пока Индекс > ИндексТекущей Цикл
		
		ФотоНоменклатуры[Индекс].Порядок = ФотоНоменклатуры[Индекс - 1].Порядок;
		Индекс = Индекс - 1;
		
	КонецЦикла;
	
	ФотоНоменклатуры.Удалить(ТекущаяСтрока);
    
КонецПроцедуры
Показать
Intercititude; +1 Ответить
3. andy_zhav 197 25.01.21 13:37 Сейчас в теме
(1) Если у вас в качестве источника данных таблицы используется табличная часть, то можно использовать системное поле "НомерСтроки". Там ничего пересчитывать при смещении не надо. Могу ошибаться, но у таблицы значений в качестве источника данных тоже есть поле НомерСтроки Нету такого. проверил
5. andy_zhav 197 25.01.21 14:04 Сейчас в теме
(1) Нашел ошибку:

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

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

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот