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

23.05.15

Разработка - Работа с интерфейсом

Иногда необходимо перемещать элемент табличной части документа в КОНКРЕТНУЮ позицию чтобы не кликать по 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С v8.3 Управляемые формы 1C:Бухгалтерия Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    55634    17    23    

43

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Платные (руб)

Универсальный редактор картинок 1С предназначен для обработки изображений в режиме «Предприятие», с возможностью рисовать на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    63947    45    60    

83

Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    19938    28    6    

44

Работа с интерфейсом Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Это инструкция по дизайну форм в среде 1С. Гайд охватывает рекомендации и стандарты для оптимизации пользовательского интерфейса. В гайде содержатся указания по использованию элементов интерфейса, включая как основные, так и продвинутые аспекты. Предоставляются также примеры и антипримеры для наглядного понимания принципов дизайна

20.08.2024    23486    mrXoxot    44    

130

Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

Пример простого и симпатичного прогресс-бара в динамическом списке, без картинок, используя редактирование запроса.

27.05.2024    12037    smielka    37    

105

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    18363    1228    elcoan    53    

125

Инструментарий разработчика Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.

3 стартмани

10.04.2023    12890    167    acces969    31    

126

Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    7995    kalyaka    6    

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

PS и ВвестиЗначение, до кучи...
Karlosss; zastep; user591389_aska_rabota; Lok`Tar; Isonic; jane_de_rio; RomanKod; Sintson; корум; TMV; +10 Ответить
2. Lyns_owner 356 23.05.15 16:14 Сейчас в теме
Зачем рисовать отдельную форму, когда есть стандартная процедура "ВвестиЧисло"? Публикация не о чем. Минус ставить не буду, автор старался))
3. WKBAPKA 215 24.05.15 08:40 Сейчас в теме
4. genayo 24.05.15 09:05 Сейчас в теме
Ни разу никто не просил сделать перемещение элемента в определенную позицию, приведите пример, зачем это может понадобиться?
5. TMV 14 24.05.15 10:52 Сейчас в теме
(4) genayo, вот уж точно, а тут прям "зачастую", серьезно?!
14. корум 288 03.05.17 11:05 Сейчас в теме
(4) например, в случае, когда заявка привязана к плану помещения в проекте, и каждое оборудование обязано иметь свой неизменный номер.
6. Serg23ru 37 27.05.15 23:42 Сейчас в теме
Не буду спорить, "зачастую" - громко сказано, (исправлю чтоб не резало слух), но я это внедрил уже в 3-х фирмах. Для одной из них писал по заказу, двум другим предложил это внедрить, когда увидел как они мучаются и мое предложение встретили на УРА.

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

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


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

Я умножаю на минус что бы число отрицательно получить что бы сдвинуть строку назад.
16. wau8824ru 24 23.04.18 11:31 Сейчас в теме
(8)
кобки домножается на ещё один (-1). А эти все "Число" и "-1" вместо простого минуса только мешают увидеть что за выражение получается

Спасибо! дополню
	ТекДан = ЭлементыФормы.Товары.ТекущиеДанные;
		Если ТекДан = Неопределено Тогда
			Сообщить("Не выбрана номенклатура");
			Возврат;
		КонецЕсли;
		
	Значение = ТекДан.НомерСтроки;
    
    Если ВвестиЧисло(Значение
Показать
17. wau8824ru 24 23.04.18 15:56 Сейчас в теме
(8)
Работает без вызовов исключений.
	ТекДан = ЭлементыФормы.Товары.ТекущиеДанные;
	Если ТекДан = Неопределено Тогда Сообщить("Не выбрана номенклатура"); Возврат; КонецЕсли;
	
	НаСтр = ТекДан.НомерСтроки;
	
	Если ВвестиЧисло(НаСтр, "Перенести на строку ...") Тогда НаСтр = ?(НаСтр>ЭтотОбъект.Товары.Количество(), ЭтотОбъект.Товары.Количество(), ?(НаСтр=0, 1, Макс(НаСтр, -НаСтр))); ЭтотОбъект.Товары.Сдвинуть(ТекДан, НаСтр-ТекДан.НомерСтроки); КонецЕсли;
18. wau8824ru 24 16.05.18 17:25 Сейчас в теме
(17)
Работает без вызовов исключений.

Процедура КоманднаяПанельТоварыПеренестиНаEpartner(Кнопка)
	
	КоличСтр = ЭтотОбъект.Товары.Количество();
	Если Не КоличСтр>1 Тогда Возврат; КонецЕсли;
	
	ТекДан = ЭлементыФормы.Товары.ТекущиеДанные;
	Если ТекДан = Неопределено Тогда Сообщить("Не выбрана номенклатура"); Возврат; КонецЕсли;
	НаСтр = ТекДан.НомерСтроки;
	
	Если ВвестиЧисло(НаСтр, "Перенести на строку №...") Тогда НаСтр = ?(НаСтр>КоличСтр, КоличСтр, ?(НаСтр<1, 1, НаСтр)); ЭтотОбъект.Товары.Сдвинуть(ТекДан, НаСтр-ТекДан.НомерСтроки); КонецЕсли;
	
КонецПроцедуры
Показать
11. 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 14 03.05.17 10:29 Сейчас в теме
Подскажите как мне вставить перемещение по товарам вверх вниз:
13. pafftis 14 03.05.17 10:29 Сейчас в теме
Маленькое изображение сменил на большое
Прикрепленные файлы:
15. Mogilnikova 103 06.02.18 16:04 Сейчас в теме
УФ 8.3.10

Столкнулась с этой функцией и была неприятно удивлена качеством описания:

ДанныеФормыКоллекция (FormDataCollection)
Сдвинуть(<Индекс>, <Количество>)
Параметры:
<Индекс> (необязательный)
Тип: Число.
Расположение элемента в коллекции.
<Количество> (необязательный)
Тип: Число.
Количество элементов, на которое нужно сдвинуть указанный элемент. Положительное смещение обозначает сдвиг в конец, отрицательное - в начало коллекции.


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