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

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) Нашел ошибку:

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

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

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)

Программист 1С
Москва
зарплата от 250 000 руб.
Полный день

Программист 1C
Волгоград
зарплата от 200 000 руб.
Полный день

Аналитик
Санкт-Петербург
зарплата от 200 000 руб. до 250 000 руб.
Полный день