Переместить элемент.
Функция ПереместитьЭлемент(ЭлементСписок, ТекущийЭлементСсылка, Направление) Экспорт
ПараметрыДоступа = ПараметрыДоступа("Изменение", ТекущийЭлементСсылка.Метаданные(), "Ссылка");
Если Не ПараметрыДоступа.Доступность Тогда
Возврат НСтр("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
///////////////////////////////////////////////////////////////////////////////////////////////////////
Подключаемый_ПереместитьЭлемент (БСП)
ДобавитьЭлементКомпоновки (БСП)
ВставитьЭлементHTMLПервымДочернимЭлементом (БСП)
КоличествоЭлементовВВыборке (БСП)
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)