IE2017

Перемещение на определенную позицию (в табличной части документа)

Программирование - Практика программирования

Иногда необходимо перемещать элемент табличной части документа в КОНКРЕТНУЮ позицию чтобы не кликать по 100 раз на кнопку "Переместить вниз (Ctrl+Shift+Down)" или "Переместить вверх (Ctrl+Shift+Up)". Для этого случая я и добавил в панель еще одну кнопку.

По просьбам трудящихся создал кнопку в панели табличной части документа, которая перемещает выделенную строку на определенную позицию. В скриншотах, для наглядности, приведены картинки. А ниже описание, как это сделать, с картинками.

1) Добавляем кнопку на панель и прописываем ей процедуру.


 

 

2) Вставляем в процедуру текст.

Процедура с_КоманднаяПанельТоварыДействиеПереместитьНаПозицию(Кнопка)
    //Проверим чтоб выбрали строку для перемещения
    Если ТипЗнч(ЭтаФорма.ТекущийЭлемент) <> Тип("ТабличноеПоле") Тогда
        Предупреждение("Вы не выбрали строку которую необходимо переместить.");
        Возврат;
    КонецЕсли;
    
    Рез = ОткрытьФормуМодально("ОбщаяФорма.с_ФормаДляПеремещения");
    //Сначала проверим адекватность требуемого номера строки
    Если Рез>=1 И Рез<=Товары.Количество() Тогда
        
        Табл = новый ТаблицаЗначений;
        Если Табл.Колонки.Количество()>0 Тогда
            Табл.Очистить();                
        Иначе   
            Табл = Товары.Выгрузить();
            Табл.Очистить();
        КонецЕсли;         
        
        ТекНом = ЭтаФорма.ТекущийЭлемент.ТекущаяСтрока.НомерСтроки;
        ТекСтрок = ЭтаФорма.ТекущийЭлемент.ТекущаяСтрока;
        Если Рез>ТекНом Тогда //Перемещаем вниз    
            ПеремСтр = ТекНом-1;
            Для й=0 по ТекНом-2 Цикл
                НовСтрТабл = Табл.Добавить();
                Для й1=0 По Табл.Колонки.Количество()-1 Цикл
                    Если (СокрЛП(Табл.Колонки[й1].имя) <> "НомерСтроки") Тогда
                        НовСтрТабл[Табл.Колонки[й1].Имя] = Товары[й][Табл.Колонки[й1].Имя];
                    КонецЕсли;                    
                КонецЦикла;
            КонецЦикла;
            Для й=ТекНом по Рез-1 Цикл
                НовСтрТабл = Табл.Добавить();
                Для й1=0 По Табл.Колонки.Количество()-1 Цикл
                    Если (СокрЛП(Табл.Колонки[й1].имя) <> "НомерСтроки") Тогда
                        НовСтрТабл[Табл.Колонки[й1].Имя] = Товары[й][Табл.Колонки[й1].Имя];                        
                    КонецЕсли;                    
                КонецЦикла;
            КонецЦикла;
            
            НовСтрТабл = Табл.Добавить();
            Для й1=0 По Табл.Колонки.Количество()-1 Цикл
                Если (СокрЛП(Табл.Колонки[й1].имя) <> "НомерСтроки") Тогда
                    НовСтрТабл[Табл.Колонки[й1].Имя] = Товары[ПеремСтр][Табл.Колонки[й1].Имя];                        
                КонецЕсли;                    
            КонецЦикла;                 
            
            Для й=Рез по Товары.Количество()-1 Цикл
                НовСтрТабл = Табл.Добавить();
                Для й1=0 По Табл.Колонки.Количество()-1 Цикл
                    Если (СокрЛП(Табл.Колонки[й1].имя) <> "НомерСтроки") Тогда
                        НовСтрТабл[Табл.Колонки[й1].Имя] = Товары[й][Табл.Колонки[й1].Имя];                    
                    КонецЕсли;                    
                КонецЦикла;
            КонецЦикла;
            
            Товары.Очистить();
            //Теперь перекинем из Табл в табличную часть
            Для каждого стрТабл Из Табл Цикл
                НовСтрТов = Товары.Добавить();
                Для й2=0 По Табл.Колонки.Количество()-1 Цикл
                    Если (СокрЛП(Табл.Колонки[й2].имя) <> "НомерСтроки") Тогда
                        НовСтрТов[Табл.Колонки[й2].имя] = СтрТабл[й2];                        
                    КонецЕсли;
                КонецЦикла;            
            КонецЦикла;
            
            
        ИначеЕсли Рез<ТекНом Тогда  //Перемещаем вверх
            ПеремСтр = ТекНом-1;
            Для й=0 по Рез-2 Цикл
                НовСтрТабл = Табл.Добавить();
                Для й1=0 По Табл.Колонки.Количество()-1 Цикл
                    Если (СокрЛП(Табл.Колонки[й1].имя) <> "НомерСтроки") Тогда
                        НовСтрТабл[Табл.Колонки[й1].Имя] = Товары[й][Табл.Колонки[й1].Имя];                        
                    КонецЕсли;                    
                КонецЦикла;
            КонецЦикла;
            
            НовСтрТабл = Табл.Добавить();
            Для й1=0 По Табл.Колонки.Количество()-1 Цикл
                Если (СокрЛП(Табл.Колонки[й1].имя) <> "НомерСтроки") Тогда
                    НовСтрТабл[Табл.Колонки[й1].Имя] = Товары[ПеремСтр][Табл.Колонки[й1].Имя];                        
                КонецЕсли;                    
            КонецЦикла;
            
            Для й=Рез-1 по ТекНом-2 Цикл
                НовСтрТабл = Табл.Добавить();
                Для й1=0 По Табл.Колонки.Количество()-1 Цикл
                    Если (СокрЛП(Табл.Колонки[й1].имя) <> "НомерСтроки") Тогда
                        НовСтрТабл[Табл.Колонки[й1].Имя] = Товары[й][Табл.Колонки[й1].Имя];                        
                    КонецЕсли;                    
                КонецЦикла;
            КонецЦикла;
            
            Для й=ТекНом по Товары.Количество()-1 Цикл
                НовСтрТабл = Табл.Добавить();
                Для й1=0 По Табл.Колонки.Количество()-1 Цикл
                    Если (СокрЛП(Табл.Колонки[й1].имя) <> "НомерСтроки") Тогда
                        НовСтрТабл[Табл.Колонки[й1].Имя] = Товары[й][Табл.Колонки[й1].Имя];                    
                    КонецЕсли;                    
                КонецЦикла;
            КонецЦикла;
            
            
            
            Товары.Очистить();
            //Теперь перекинем из Табл в табличную часть
            Для каждого стрТабл Из Табл Цикл
                НовСтрТов = Товары.Добавить();
                Для й2=0 По Табл.Колонки.Количество()-1 Цикл
                    Если (СокрЛП(Табл.Колонки[й2].имя) <> "НомерСтроки") Тогда
                        НовСтрТов[Табл.Колонки[й2].имя] = СтрТабл[й2];                        
                    КонецЕсли;
                КонецЦикла;            
            КонецЦикла;
        Иначе //Ничего не делаем        
        КонецЕсли;
    Иначе
        Предупреждение("Нет такого числа, попробуйте еще раз.");
    КонецЕсли;    
    
КонецПроцедуры

 

3) В общих формах рисуем форму.

 

Кнопке "Ок" прописываем процедуру с текстом:

Процедура ОсновныеДействияФормыОк(Кнопка)
    ЭтаФорма.Закрыть(ПолеВвода1);
КонецПроцедуры

 

Вот и все.

Запускаете и работаете.

См. также

Комментарии
1. Денис Новосёлов (binex) 210 23.05.15 12:28 Сейчас в теме
Я может что-то недопонял, но не проще ли было использовать метод табличной части Сдвинуть(<Строка>, <Смещение>) ?!

PS и ВвестиЗначение, до кучи...
корум; TMV; +2 Ответить
2. Павел Никифоров (Lyns_owner) 268 23.05.15 16:14 Сейчас в теме
Зачем рисовать отдельную форму, когда есть стандартная процедура "ВвестиЧисло"? Публикация не о чем. Минус ставить не буду, автор старался))
3. Ярослав Радкевич (WKBAPKA) 202 24.05.15 08:40 Сейчас в теме
4. Геннадий Николаев (genayo) 24.05.15 09:05 Сейчас в теме
Ни разу никто не просил сделать перемещение элемента в определенную позицию, приведите пример, зачем это может понадобиться?
5. TMV 14 24.05.15 10:52 Сейчас в теме
(4) genayo, вот уж точно, а тут прям "зачастую", серьезно?!
6. Сергей Сурков (Serg23ru) 40 27.05.15 23:42 Сейчас в теме
Не буду спорить, "зачастую" - громко сказано, (исправлю чтоб не резало слух), но я это внедрил уже в 3-х фирмах. Для одной из них писал по заказу, двум другим предложил это внедрить, когда увидел как они мучаются и мое предложение встретили на УРА.

Для чего на фирме работники в табличной части документа гоняют позиции то вверх, то вниз - не знаю, но могу узнать (как узнаю - напишу).

7. Кирилл Бондаренко (karapuzzzz) 59 29.05.15 12:47 Сейчас в теме
А все потому что не умеете пользоваться синтакс-помощником. Дохрена кода можно вместить в 2 строчки без необходимости рисования отдельной формы:
8. Владислав Охотников (OVladius) 32 15.03.17 23:53 Сейчас в теме
Понимаю что данной теме уже 2 года, но все же, может кому то пригодится более разумный вариант перемещения строки :)


	Значение = 0;
	
	Если ВвестиЧисло(Значение, "Введите номер строки...") Тогда
		ТекущаяСтрока 		= ЭлементыФормы.Товары.ТекущаяСтрока;
		
		Если Значение > ТекущаяСтрока.НомерСтроки Тогда
			// Перемещаем вверх
			Товары.Сдвинуть(ТекущаяСтрока, Число(Значение - ТекущаяСтрока.НомерСтроки) );
		Иначе	
			// Перемещаем вниз
			Товары.Сдвинуть(ТекущаяСтрока, Число(Число(Значение * -1) - Число(ТекущаяСтрока.НомерСтроки * -1)) * -1);
		КонецЕсли; 
	КонецЕсли;
...Показать Скрыть
9. Reset Atreides (ResetAtreides) 16.03.17 09:15 Сейчас в теме
(8) Чет вы с функцией "Число()" увлеклись и забыли правила раскрытия скобок со знаком. Если бы скобки раскрыли, или просто минус за скобки вынесли, то увидели бы что условия никакого не надо и обе функции "Сдвинуть" выполняются с одинаковыми параметрами.
10. Владислав Охотников (OVladius) 32 16.03.17 23:28 Сейчас в теме
(9)А ну ка объясните, про какие правила раскрытия скобок я забыл)))) интересно)

Я умножаю на минус что бы число отрицательно получить что бы сдвинуть строку назад.
11. Reset Atreides (ResetAtreides) 17.03.17 08:46 Сейчас в теме
Число(Число(Значение * -1) - Число(ТекущаяСтрока.НомерСтроки * -1)) * -1) =
(Значение*(-1) - ТекущаяСтрока.НомерСтроки(*-1)) * (-1) =
(-1)*Значение*(-1) - (-1)*ТекущаяСтрока.НомерСтроки*(-1) =
(-1)*(-1)*Значение - (-1)*(-1)*ТекущаяСтрока.НомерСтроки =
Значение - ТекущаяСтрока.НомерСтроки

Меньше ненужных функций используйте, тогда это сразу бы видно было. Уже во втором упрощении видно, что вынесенный (-1) за скобки домножается на ещё один (-1). А эти все "Число" и "-1" вместо простого минуса только мешают увидеть что за выражение получается
12. Максим Лукин (pafftis) 9 03.05.17 10:29 Сейчас в теме
Подскажите как мне вставить перемещение по товарам вверх вниз:
13. Максим Лукин (pafftis) 9 03.05.17 10:29 Сейчас в теме
Маленькое изображение сменил на большое
Прикрепленные файлы:
14. rjhev korum (корум) 311 03.05.17 11:05 Сейчас в теме
(4) например, в случае, когда заявка привязана к плану помещения в проекте, и каждое оборудование обязано иметь свой неизменный номер.
Оставьте свое сообщение