Двиг вниз вверх + добавление с учетом порядка
Всем добрый день. УФ
Есть таблица на форме(ФотоНоменклатуры - Порядок,ИмяФайла), при выборе номенклатуры она заполняется данными из регистра, если таковы имеются. При заполнение Порядок всегда встает по порядку 1,2,3.
У меня следующая задача:
1) Добавить кнопки движения строк вверх/вниз. С учетом изменения реквизита "Порядок". То есть сдвинули строку 1 вниз, порядок стал =2. У сдвинутой строки был порядок 2, должен стать 1. И так всегда.
2) Добавлять новую строку. Добавление последнего порядка учитывается. - вроде ок.
Собственно проблема со сдвигами, где я ошибся? цифры меняются как попало... :
Конкретно после "Сдвига" не могу отловить позицию текущей строки и заменить порядок позиции сдвигаемой строки
Есть таблица на форме(ФотоНоменклатуры - Порядок,ИмяФайла), при выборе номенклатуры она заполняется данными из регистра, если таковы имеются. При заполнение Порядок всегда встает по порядку 1,2,3.
У меня следующая задача:
1) Добавить кнопки движения строк вверх/вниз. С учетом изменения реквизита "Порядок". То есть сдвинули строку 1 вниз, порядок стал =2. У сдвинутой строки был порядок 2, должен стать 1. И так всегда.
2) Добавлять новую строку. Добавление последнего порядка учитывается. - вроде ок.
Собственно проблема со сдвигами, где я ошибся? цифры меняются как попало... :
Конкретно после "Сдвига" не могу отловить позицию текущей строки и заменить порядок позиции сдвигаемой строки
&НаКлиенте
Процедура Добавить(Команда)
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Если ДиалогВыбораФайла.Выбрать() Тогда
ИмяФайла = СтрЗаменить(ДиалогВыбораФайла.ПолноеИмяФайла, ДиалогВыбораФайла.Каталог, "");
НоваяСтрока = ФотоНоменклатуры.Добавить();
Элементы.ФотоНоменклатуры.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();
ИдСтроки = Элементы.ФотоНоменклатуры.ТекущаяСтрока;
ТекСтрока = ФотоНоменклатуры.найтиПоИдентификатору(ИдСтроки);
ТекСтрока.ИмяФайла = ДиалогВыбораФайла.ПолноеИмяФайла ;
ТекСтрока.Порядок= ФотоНоменклатуры.Количество();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Вверх(Команда)
Смещение = -1;
//Сначала получаем выделенную строку:
ИдСтроки= Элементы.ФотоНоменклатуры.ТекущаяСтрока;
ТекСтрока = ФотоНоменклатуры.НайтиПоИдентификатору(ИдСтроки);
Если ТекСтрока.Порядок= 1 И Смещение = -1 Тогда
// Первую строку не двигаем вверх
Возврат;
КонецЕсли;
Если ТекСтрока.Порядок= ФотоНоменклатуры.Количество() И Смещение = 1 Тогда
// Последнюю строку не двигаем вниз
Возврат;
КонецЕсли;
//Далее двигаем вверх/вниз
// Смещение - минус 1 - двигаем вверх, 1 - двигаем вниз
ФотоНоменклатуры.Сдвинуть(ИдСтроки, Смещение);
// ну и дальше изменяем порядковый номер
ТекСтрока.Порядок= ТекСтрока.Порядок+Смещение;
СтрокаИзменить = ФотоНоменклатуры[ИдСтроки ];
СтрокаИзменить.Порядок= СтрокаИзменить.Порядок- Смещение;
КонецПроцедуры
&НаКлиенте
Процедура Вниз(Команда)
Смещение = 1;
//Сначала получаем выделенную строку:
ИдСтроки= Элементы.ФотоНоменклатуры.ТекущаяСтрока;
ТекСтрока = ФотоНоменклатуры.НайтиПоИдентификатору(ИдСтроки);
Если ТекСтрока.Порядок= 1 И Смещение = -1 Тогда
// Первую строку не двигаем вверх
Возврат;
КонецЕсли;
Если ТекСтрока.Порядок= ФотоНоменклатуры.Количество() И Смещение = 1 Тогда
// Последнюю строку не двигаем вниз
Возврат;
КонецЕсли;
//Далее двигаем вверх/вниз
// Смещение - минус 1 - двигаем вверх, 1 - двигаем вниз
ФотоНоменклатуры.Сдвинуть(ИдСтроки, Смещение);
// ну и дальше изменяем порядковый номер
ТекСтрока.Порядок= ТекСтрока.Порядок+Смещение;
СтрокаИзменить = ФотоНоменклатуры[ИдСтроки];
СтрокаИзменить.Порядок= СтрокаИзменить.Порядок- Смещение;
КонецПроцедуры
ПоказатьПо теме из базы знаний
- 50+ советов для успешной сдачи 1С: Специалист по платформе
- Концепция автоматизации многопрофильного Холдинга в системе АУБ на платформе 1С
- Flowcon: Рабочий стол
- Конфигурация Flowcon: Набор инструментов для управления задачами, проектами и бизнесом в 1С
- 5 способов 1С-аналитику побороть выгорание и при чем тут "Игра в кальмара"
Найденные решения
(1) Процедура для смещения указанной строки на произвольное число позиций:
&НаКлиенте
Процедура СдвинутьСтроку(ТекущаяСтрока, Смещение)
ИндексТекущей = ФотоНоменклатуры.Индекс(ТекущаяСтрока);
НовыйИндекс = ИндексТекущей + Смещение;
Если НовыйИндекс < 0 Тогда
НовыйИндекс = 0;
ИначеЕсли НовыйИндекс > ФотоНоменклатуры.Количество() - 1 Тогда
НовыйИндекс = ФотоНоменклатуры.Количество() - 1;
КонецЕсли;
Если ИндексТекущей = НовыйИндекс Тогда
Возврат;
КонецЕсли;
НовыйПорядок = ФотоНоменклатуры[НовыйИндекс].Порядок;
Индекс = НовыйИндекс;
Шаг = ?(Смещение > 0, -1, 1);
Пока Индекс <> ИндексТекущей Цикл
ФотоНоменклатуры[Индекс].Порядок = ФотоНоменклатуры[Индекс + Шаг].Порядок;
Индекс = Индекс + Шаг;
КонецЦикла;
ТекущаяСтрока.Порядок = НовыйПорядок;
ФотоНоменклатуры.Сдвинуть(ИндексТекущей, НовыйИндекс - ИндексТекущей);
Элементы.ФотоНоменклатуры.ТекущаяСтрока = ФотоНоменклатуры[НовыйИндекс].ПолучитьИдентификатор();
КонецПроцедуры
&НаКлиенте
Процедура СдвинутьВверх(Команда)
СдвинутьСтроку(Элементы.ФотоНоменклатуры.ТекущиеДанные, -1);
КонецПроцедуры
&НаКлиенте
Процедура СдвинутьВниз(Команда)
СдвинутьСтроку(Элементы.ФотоНоменклатуры.ТекущиеДанные, 1);
КонецПроцедуры
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Процедура для смещения указанной строки на произвольное число позиций:
&НаКлиенте
Процедура СдвинутьСтроку(ТекущаяСтрока, Смещение)
ИндексТекущей = ФотоНоменклатуры.Индекс(ТекущаяСтрока);
НовыйИндекс = ИндексТекущей + Смещение;
Если НовыйИндекс < 0 Тогда
НовыйИндекс = 0;
ИначеЕсли НовыйИндекс > ФотоНоменклатуры.Количество() - 1 Тогда
НовыйИндекс = ФотоНоменклатуры.Количество() - 1;
КонецЕсли;
Если ИндексТекущей = НовыйИндекс Тогда
Возврат;
КонецЕсли;
НовыйПорядок = ФотоНоменклатуры[НовыйИндекс].Порядок;
Индекс = НовыйИндекс;
Шаг = ?(Смещение > 0, -1, 1);
Пока Индекс <> ИндексТекущей Цикл
ФотоНоменклатуры[Индекс].Порядок = ФотоНоменклатуры[Индекс + Шаг].Порядок;
Индекс = Индекс + Шаг;
КонецЦикла;
ТекущаяСтрока.Порядок = НовыйПорядок;
ФотоНоменклатуры.Сдвинуть(ИндексТекущей, НовыйИндекс - ИндексТекущей);
Элементы.ФотоНоменклатуры.ТекущаяСтрока = ФотоНоменклатуры[НовыйИндекс].ПолучитьИдентификатор();
КонецПроцедуры
&НаКлиенте
Процедура СдвинутьВверх(Команда)
СдвинутьСтроку(Элементы.ФотоНоменклатуры.ТекущиеДанные, -1);
КонецПроцедуры
&НаКлиенте
Процедура СдвинутьВниз(Команда)
СдвинутьСтроку(Элементы.ФотоНоменклатуры.ТекущиеДанные, 1);
КонецПроцедуры
Показать
(10) В чем же сложность?
&НаКлиенте
Процедура УдалитьСтроку(ТекущаяСтрока)
ИндексТекущей = ФотоНоменклатуры.Индекс(ТекущаяСтрока);
Индекс = ФотоНоменклатуры.Количество() - 1;
Пока Индекс > ИндексТекущей Цикл
ФотоНоменклатуры[Индекс].Порядок = ФотоНоменклатуры[Индекс - 1].Порядок;
Индекс = Индекс - 1;
КонецЦикла;
ФотоНоменклатуры.Удалить(ТекущаяСтрока);
КонецПроцедуры
Показать
(1) Если у вас в качестве источника данных таблицы используется табличная часть, то можно использовать системное поле "НомерСтроки". Там ничего пересчитывать при смещении не надо. Могу ошибаться, но у таблицы значений в качестве источника данных тоже есть поле НомерСтроки Нету такого. проверил
(1) Нашел ошибку:
при сдвиге вы изменяете порядок сдвигаемой строки, но при этом порядок остальных строк у вас остается без изменения. Т. к. реквизит "порядок" - созданный вами, то и отвечать за его заполнение вам.
ЛУчший вариант в вашем случае - перенумерация всех строк после смещения. Либо еще лучший вариант, если вы используете обработку - создать в метаданных обработки табличную часть и выводить ее на форму и, соответственно, заполнять эту табличную часть данными регистра сведений. У табличной части есть предопределенное поле НомерСтроки.
при сдвиге вы изменяете порядок сдвигаемой строки, но при этом порядок остальных строк у вас остается без изменения. Т. к. реквизит "порядок" - созданный вами, то и отвечать за его заполнение вам.
ЛУчший вариант в вашем случае - перенумерация всех строк после смещения. Либо еще лучший вариант, если вы используете обработку - создать в метаданных обработки табличную часть и выводить ее на форму и, соответственно, заполнять эту табличную часть данными регистра сведений. У табличной части есть предопределенное поле НомерСтроки.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот