Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
06 окт 2025, 04:01

Сортировка по определенному реквизиту справочника в динамическом списке, но внутри отбора ЭлементОтб

Автор oooo800, 20 сен 2025, 22:40

0 Пользователей и 1 гость просматривают эту тему.

oooo800

sali, ну не сто.

Но из, например 15, 8 - да.
Должны открывать одну и ту же форму, но только в сли пользователь нажмите т на кнопку открыть.
Если нет, он сам "пишет" в поле ввода, что ему надо.
Без подстановки значения из справочника.

oooo800

antoneus, спасибо.
Доемюду до компьютера, гляну.
Пока условным сам сделал.
Но элементы с нужным значением нужного реквизита все равно не встают перед элементами с ненужным значением нужного реквизита

antoneus


oooo800

antoneus, посмотрел.
Кое что уз того, что тут реализовано, у меня практически также сделано.
Это определение и позиционирование на текущем элементе в списке.
Кое что тут изящнее.
Это оформление.
У меня через Список.УсловноеОформление и ЭлементОтбораКомпоновкиДанных в коде.

Но есть один нюанс.
Открываем обработку.
Выбираем любую деталь, все работает: элементы изделий с выбранной деталью вверху списка.
Выбираем другую деталь - на верх перемещаются изделия, содержащие другую деталь.
И в том и в другом случае, эти элементы вместе, друг за другом.
То есть все, как надо.

Если выбрав деталь1, затем руками отсортировать список по полю "Дата изготовления" , не важно в каком направлении, по убыванию или по возрастанию и потом выбрать другую деталь, чтобы сработало событие, элементы уже НЕ будут не друг за другом.

Это возможно как-то "побороть" ?
То есть, чтобы при выборе другой детали, после сортировки "руками" по полю "Дата изготовления" сортировка была правильной.



Может возможно сделать новый столбец "Порядковый номер" , и для каждого элемента согласно правил сортировки присвоить номер от 1 до ...

И, потом, если надо получить первоначальную сортировку, после сортировки "руками" по наименованию или дате изготовления, просто нажать на этом поле.

sali

я вот сколько раз читаю и перечитываю, что ты пишешь, oooo800. и у меня, знаешь....., голова в атмосферу уходит, потом во вселенную
так запутанно всё

antoneus

Ну сбрасывай пользовательские сортировки. Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы - там ищешь элемент с типом ПорядокКомпоновкиДанных, в его элементах отключаешь всем использование.

oooo800

sali, это потому что "многа букАв".
Но по другому описать не получилось.

А antoneus меня понял.
Спасибо ему.
Взял кое что из его примера.
У меня почти не было опыта работы с произвольными запросами списков.
у меня получилось сделать главное - добавить столбец в список, не привязанный к реквизиту объекта метаданных.

А дальше буду пробовать "крутить" его.

Пока сделал столбец, что-то типа "Есть реквизит" , типа булево.
И по нему сортировку.
Работает почти ка надо.
Есть один нюанс по сортировке.
Но надеюсь, что и его решу.


oooo800

По аналогии с вариантом antoneus сделал так:
- в  форме выбора:
    Запрос.Текст =
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    ИзделияДетали.Ссылка КАК Ссылка
    |ИЗ
    |    Справочник.Изделия.Детали КАК ИзделияДетали
    |ГДЕ
    |    ИзделияДетали." + ИмяРеквизита + " = &" + ИмяРеквизита;
   
    Запрос.УстановитьПараметр(ИмяРеквизита, ЗначениеРеквизита);
   
    Ссылки = Новый Массив;
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл   
        Ссылки.Добавить(Выборка.Ссылка)
    КонецЦикла;
   
    Список.Параметры.УстановитьЗначениеПараметра("Ссылки", Ссылки);

- в произвольном запросе списка есть:
    ВЫБОР
        КОГДА Изделия.Ссылка В (&Ссылки)
            ТОГДА Истина
        ИНАЧЕ Ложь
    КОНЕЦ КАК ЕстьРеквизит

- в форме выбора:
    ЭлементыПользовательскихНастроек = Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;
    Для Каждого НастройкаСписка Из ЭлементыПользовательскихНастроек Цикл

        Если ТипЗнч(НастройкаСписка) = ТипЗнч(Список.КомпоновщикНастроек.Настройки.Порядок) Тогда

            НастройкаСписка.Элементы.Очистить();
            // Первая сортировка - по ЕстьРеквизит
            УсловиеСортировкиДС = НастройкаСписка.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
            УсловиеСортировкиДС.Поле = Новый ПолеКомпоновкиДанных("ЕстьРеквизит");
            УсловиеСортировкиДС.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Убыв;
            УсловиеСортировкиДС.Использование = Истина;
            // Вторая сортировка - ДатаВремяСоздания
            УсловиеСортировкиДС = НастройкаСписка.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
            УсловиеСортировкиДС.Поле = Новый ПолеКомпоновкиДанных("ДатаВремяСоздания");
            УсловиеСортировкиДС.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр;
            УсловиеСортировкиДС.Использование = Истина;
        КонецЕсли;
    КонецЦикла;

- в таблицу формы "Список" добавил поле формы - колонку "Список".

При открытии формы выбора почти все "показывается" почти как надо:
- сначала элементы с наличием значения переданного реквизита - ЕстьРеквизит = Истина;
Для таких элементов сортировка по ДатаСоздания по возрастанию отрабатывается.
- потом элементы без него - ЕстьРеквизит = Ложь;
Для таких элементов, правда тоже отрабатывается сортировка по возрастанию "ДатаСоздания", а хотелось бы по Наименование.

Но при "ручной" сортировке по другим колонкам после открытия формы, а потом по колонке "ЕстьРеквизит" или даже по ней, но по возрастанию, то есть при нажатии на заголовок соответствующего поля таблицы,
элементы сортируются по колонке "ЕстьРеквизит" , но вторичная сортировка по "ДатаСоздания" не происходит.
Вообще не понятно по какой колонке происходит вторичная сортировка.

Возможно:
1. сделать вторичную сортировку - сортировку по 2-му столбцу "Наименование" для элементов с "ЕстьРеквизит" = Ложь и при открытии формы и при ручной сортировке ?
2. сделать вторичную сортировку - сортировку по 2-му столбцу "ДатаСоздания" для элементов с "ЕстьРеквизит" = Истинаи при ручной сортировке ?
3. все таки сделать автоинкремент элементов от 1 до ... и выводить эти значения в столбце, например "ПорядковыйНомер" вместо "ЕстьРеквизит" или даже с ним, по алгоритму:  сначала все элементы с "ЕстьРеквизит = Истина", отсортированных по убыванию по ДатаСоздания, и затем далее элементы с ЕстьРеквизит = Ложь, отсортированные по возрастанию "Наименование" ?

По пп. 1, 2 пробовал добавить в запрос:
"ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    ИзделияДетали.Ссылка КАК Ссылка
    |ИЗ
    |    Справочник.Изделия.Детали КАК ИзделияДетали
    |ГДЕ
    |    ИзделияДетали." + ИмяРеквизита + " = &" + ИмяРеквизита;

УПОРЯДОЧИТЬ ПО ДатаСоздания ВОЗР

Но не взлетело.

Попробовал, в произвольном списке, как первоначально писал antoneus:
ВЫБОР
КОГДА Изделия.Ссылка В (&Ссылки)
ТОГДА Изделия.ДатаИзготовления
ИНАЧЕ Изделия.Наименование
КОНЕЦ КАК ЕстьРеквизит

Если сортировка по "ЕстьРеквизит" по возрастанию, все отрабатывается корректно, и при открытии формы и ручной сортировке.
Если по "ЕстьРеквизит" по убыванию, сначала располагаются элементы без "нужного реквизита".
И, в колонке ЕстьРеквизит хотелось бы отображения не даты создания или наименования, а также, например истина/ложь и полем таблицы "Флажок".

sali


antoneus

Да у меня не так ведь. Ты свалил в кучу поле отбора (для условного оформления) и поле сортировки, которое у меня вообще не выводится.

Изделия.Ссылка В (&Ссылки) КАК ЕстьРеквизит,//Выбор когда... - не нужно, и так отрабатывает
ВЫБОР
        КОГДА Изделия.Ссылка В (&Ссылки)
            ТОГДА Изделия.ДатаИзготовления
        ИНАЧЕ Изделия.Наименование
    КОНЕЦ КАК ПолеСортировки

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

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск