Порядок групп для сайта в УТ 11.4

Клиент попросил сделать, чтобы можно было настраивать порядок групп для сайта.

Создал отдельную форму списка номенклатуры.

Добавил в нее кнопки смещения групп. Реализовал простой алгоритм смещения групп. Пришлось повозиться с порядком в списке и отбором.

Добавил кнопку «Элементы», которая показывает элементы.

Код получился такой:


&НаКлиенте
Процедура ГруппаВниз(Команда)
    ПереместитьГруппу(1);
КонецПроцедуры

&НаКлиенте
Процедура ГруппаВверх(Команда)
    ПереместитьГруппу(-1);
КонецПроцедуры

&НаКлиенте
Процедура ПереместитьГруппу(Смещение)
    
    ТекущиеДанные = Элементы.Список.ТекущиеДанные;
    Если ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    ОбновитьГруппы(ТекущиеДанные.Ссылка, Смещение);
    Элементы.Список.Обновить();
    //ЭтаФорма.ОбновитьОтображениеДанных(Элементы.Список);
    
КонецПроцедуры

Процедура ОбновитьГруппы(Ссылка, Смещение)
    
    Если НЕ Ссылка.ЭтоГруппа Тогда
        Возврат;
    КонецЕсли;
    З = Новый Запрос(
    "ВЫБРАТЬ
    |    Т.Ссылка КАК Ссылка,
    |    Т.дор_ПорядокГрупп КАК дор_ПорядокГрупп
    |ИЗ
    |    Справочник.Номенклатура КАК Т
    |ГДЕ
    |    Т.Родитель = &Родитель
    |    И Т.ЭтоГруппа
    |
    |УПОРЯДОЧИТЬ ПО
    |    дор_ПорядокГрупп,
    |    Т.Наименование");
    
    З.УстановитьПараметр("Родитель", Ссылка.Родитель);
    
    ТЗ = З.Выполнить().Выгрузить();
    
    ИскСтрока = ТЗ.Найти(Ссылка, "Ссылка");
    Попытка
    ТЗ.Сдвинуть(ИскСтрока, Смещение);
    Исключение
        ВОзврат;
    КонецПопытки;
    
    Порядок = 0;
    Для Каждого Строка ИЗ ТЗ Цикл
        Порядок = Порядок + 1;
        Если Строка.дор_ПорядокГрупп <> Порядок Тогда
            О = Строка.Ссылка.ПолучитьОбъект();
            О.дор_ПорядокГрупп = Порядок;
            О.Записать();
        КонецЕсли;
    КонецЦикла;
    
    
КонецПроцедуры


&НаКлиенте
Процедура ВыводитьЭлементы(Команда)
    Элементы.дор_ФормаВыводитьЭлементы.Пометка = Не Элементы.дор_ФормаВыводитьЭлементы.Пометка;
    ОбновитьФильтрыЭлемент();
КонецПроцедуры
    
Процедура ОбновитьФильтрыЭлемент() Экспорт
    //Осипов 2020-03-13 добавил отбор
    
    ЭлементОтбора = ПолучитьОтборДинамическогоСписка(Список.Отбор, "ЭтоГруппа");
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ЭтоГруппа");
    ЭлементОтбора.ПравоеЗначение = Истина;
    ЭлементОтбора.Использование = НЕ Элементы.дор_ФормаВыводитьЭлементы.Пометка;
    
КонецПроцедуры

Функция ПолучитьОтборДинамическогоСписка(Отбор, Представление) Экспорт
    
    Для Каждого ЭлементОтбора ИЗ Отбор.Элементы Цикл
        Если ЭлементОтбора.Представление = Представление Тогда
            Возврат ЭлементОтбора;
        КонецЕсли;
    КонецЦикла;
    
    ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.Представление = Представление;
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.Использование = ложь;
    
    Возврат ЭлементОтбора;

КонецФункции

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    ОбновитьФильтрыЭлемент();

КонецПроцедуры

&НаСервере
Процедура НастроитьПорядок()
    Порядок = Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Список.Порядок.ИдентификаторПользовательскойНастройки);
    Порядок.Элементы.Очистить();
    
    НовыйПорядок = Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
    НовыйПорядок.РежимОтображения    = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Авто;
    НовыйПорядок.Поле                = Новый ПолеКомпоновкиДанных("дор_ПорядокГрупп");
    НовыйПорядок.ТипУпорядочивания    = НаправлениеСортировкиКомпоновкиДанных.Возр;
    НовыйПорядок.Использование        = Истина;
    
    НовыйПорядок = Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
    НовыйПорядок.РежимОтображения    = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Авто;
    НовыйПорядок.Поле                = Новый ПолеКомпоновкиДанных("Наименование");
    НовыйПорядок.ТипУпорядочивания    = НаправлениеСортировкиКомпоновкиДанных.Возр;
    НовыйПорядок.Использование        = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    НастроитьПорядок();
КонецПроцедуры

Код настройки порядка перенес в ПриОткрытии, чтобы он замещал настройки пользователя.

Можно было бы использовать порядок с шагом 100 и как-то размещать посередине новую позицию, но это вышло бы за рамки бюджета, так что нумерую группы последовательно, перезаписывая порядок, если он не соответствует заданному.

Теперь этот реквизит можно передать на сайт и по нему программист сайта сделает упорядочивание.

Среда: УТ 11.4.13.46. Объем 2 час.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

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