gifts2017

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

Опубликовал Сергей Сурков (Serg23ru) в раздел Программирование - Практика программирования

Иногда необходимо перемещать элемент табличной части документа в КОНКРЕТНУЮ позицию чтобы не кликать по 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) 23.05.15 12:28
Я может что-то недопонял, но не проще ли было использовать метод табличной части Сдвинуть(<Строка>, <Смещение>) ?!

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

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

7. Кирилл Бондаренко (karapuzzzz) 29.05.15 12:47
А все потому что не умеете пользоваться синтакс-помощником. Дохрена кода можно вместить в 2 строчки без необходимости рисования отдельной формы:
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа