ПереместитьЭлемент (БСП)

Автор: 1С
ОбщийМодуль.НастройкаПорядкаЭлементовСлужебный
1С БСП

Переместить элемент.

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

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации

Похожие публикации

Подключаемый_ПереместитьЭлемент (БСП)

ОбновлениеИнформационнойБазы_ПереместитьПараметрыИнтернетПоддержкиВБезопасноеХранилищеДанных_2_1_7_1 (БСП)

ПредопределенныйЭлемент (БСП)

Удалить элемент массива

ДобавитьЭлементКомпоновки (БСП)

ВставитьЭлементHTMLПервымДочернимЭлементом (БСП)

КоличествоЭлементовВВыборке (БСП)

СведенияОЭлементеНастройки (БСП)

УсловиеЭлементаНастройки (БСП)

TurboConf ИР адаптер 2.64