Сортировка динамического списка 1с

Сортировка динамического списка 1с

Данный раздел содержит ответ на вопрос "По каким полям данных пользователь сможет выполнять отбор и сортировку в табличных полях, предназначенных для динамического просмотра данных". Эта информация позволит принимать решение о необходимости переопределить при помощи встроенного языка отборы и сортировки, доступные пользователю по умолчанию.

Предмет рассмотрения данного раздела — только табличные поля "динамического просмотра данных", т.е. табличные поля, связанные с объектами типа СправочникСписок. РегистрСведенийСписок. и т.д. Прочие табличные поля в разделе не рассматриваются.

Общие вопросы

Прежде всего хочется подчеркнуть, что предоставленные пользователю возможности управления отбором и порядком в общем случае меньше, чем возможности управления отбором и порядком из встроенного языка. Интерактивное управление ограничивается при помощи свойств НастройкаОтбора и НастройкаПорядка табличного поля, связанного со списком динамического просмотра (см. Расширение табличного поля списка справочника и т.п.). Управление из встроенного языка ограничивается составом полей свойств Отбор и Порядок списков динамического просмотра.

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

Сортировка

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

Кроме того, по умолчанию упорядочивание возможно только по тем полям источника данных, которые связаны с колонками табличного поля (свойства Данные и ДанныеФлажка).

Поля данных, по которым можно осуществлять сортировку, т.е. поля, которым соответствуют элементы порядка объекта Порядок, это все поля источника данных, кроме:

  • полей типа ХранилищеЗначения;
  • полей типа Строка неограниченной длины;
  • полей, имеющих "составной тип данных".

При этом следует помнить, что "составной тип данных" — это не только тип, в котором явным образом определено несколько типов данных (при конфигурировании это можно задать установив флажок "Составной тип данных" в диалоге редактирования типа), но еще и:

  • типы, задающие ссылку на любой справочник, документ и т.д.;
  • тип ЛюбаяСсылка;
  • типы Характеристика. Имя плана видов характеристик > .

Отбор

По умолчанию, для интерактивного отбора доступны такие поля источника данных, которые:

  • связаны с данными колонки или данными флажка колонки табличного поля;
  • соответствуют элементу отбора объекта Отбор источника данных.

Видимость колонок табличного поля не влияет на состав доступных полей, как для отбора так и для сортировки. Это значит, что пользователь, управляя составом видимых полей табличного поля (команда "Настройка списка"), не влияет на состав полей, доступных для интерактивного управления отбором и сортировкой.

Читайте также:  Чем смыть транспортировочный грунт с нового крыла

Поля данных, по которым можно осуществлять отбор, т.е. поля, которым соответствуют элементы отбора объекта Отбор, это все поля источника данных, кроме полей типа ХранилищеЗначения.

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

В процедуру ПриОткрытии или в конец модуля добавить:
Код 1C v 8.х
Где НомерСоглашения — Колонка в списке регистра сведений по которой нужно сортировать!
Далее щелкнув правой клавишей мыши на списке и зайдя в пункт Сортировка — увидим что стала доступна возможность сортировки по НомерСоглашения.

Как отсортировать список документов по признаку ПРОВЕДЕН?
Код 1C v 8.х

Сортировка динамических списков (ЖурналДокументовСписок)
Добавлять элементы настройки порядка в динамические списки нельзя.
Если индексирование для графы установлено, то соответсвующий элемент настройки порядка уже есть, надо его просто включить:
Код 1C v 8.х
При открытии, журнал будет упорядочен!

Похожие FAQ

Еще в этой же категории

Как получить строки табличного поля, отобранные отбором? 3
ОтборСтрок = ТабличнаяЧастьИсточник.ОтборСтрок ; ПостроительЗапроса = Новый ПостроительЗапроса; ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличнаяЧастьИсточник); // Добавляются необходимые отборы, такие же как в отбор Как пользователям запретить удаление условия отбора в форме списка? 2
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; Полный код: ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип(" ЭлементОтбораКомпоновкиДанных" )); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпонов Посмотреть все в категории Список Справочника, Документов, Регистров

База для оптимизации

Для тестовых данных использовалась самописная база с реальными данными большого справочника клиентов, строк – около миллиона, колонок – 26. В динамическом списке к справочнику присоединен регистр состояний клиентов (срез последних). Размер справочника такой, что не разворачивается в файловом варианте.

Для замера производительности использовался SQL Server Profiler, который показывает время выполнения запроса без дополнительных затрат на интерфейс. Конкретные цифры в статье приводить не буду, так как они индивидуальны для каждой базы.

Первым по важности для обеспечения быстродействия динамического списка является оптимизация запроса. По оптимизации запросов написано много статей, но основные принципы перечислены ниже:

  • При соединении таблиц использовать индексы
  • Не использовать вложенные запросы
  • Избегать в запросе большого количества таблиц
  • По возможности избегать условий «ИЛИ», «НЕ», «ПОДСТРОКА», «МЕСЯЦ» «ВЫБОР КОГДА» и т.д
  • Стараться не использовать динамические(вычисляемые) поля

2. Флаг "Динамическое считывание данных"

В свойствах запроса динамического списка (если он «Произвольный» и установлена основная таблица) доступен флаг «Динамическое считывание данных».

Если флаг установлен, то запрос забирает из БД маленькие порции данных (на текущей версии 1С – по 45). Прокрутка списка в этом случае может подвисать.

Если флаг не установлен, то порции больше (на текущей версии 1С – по 1000). Прокрутка в этом случае комфортнее, но на выполнение запроса требуется больше времени.

Читайте также:  Не работает потому что

Общие рекомендации по установке флага «Динамическое считывание данных»:

  • Если запрос выполняется быстро, и в выборке с учетом отборов обычно большое количество строк, то флаг лучше не устанавливать
  • Если запрос тяжелый, а в выборке с учетом отборов обычно записей не много или не часто используется прокрутка списка, то лучше флаг установить.

3. Группировки в динамическом списке.

Здесь все просто – использование группировок может очень значительно замедлять список. Рекомендую просто отказаться от них и не включать их в пользовательские настройки.

4. Сортировка.

От сортировки тоже бы хотелось отказаться, но это очень важная пользовательская функция. Общие рекомендации по использованию сортировки:

  • Сортировать список желательно по проиндексированным реквизитам
  • Не сортировать список по вычисляемым полям

5. Отборы, поиск

  • Поля, по которым чаще всего устанавливаются отборы должны быть проиндексированы.
  • Если при этом сортировка списка отключена (т.е. сортировка производится по основному представлению — код или наименование основной таблицы динамического списка), а это почти всегда, то индексировать нужно «с доп. упорядочиванием».
  • Если на список накладывается несколько отборов, очень важен их порядок (на текущей версии платформы 1С). Правильный порядок отборов:
    1. Проиндексированные поля
    2. Неиндексированные поля
    3. Вычисляемые поля
    • Нарушение порядка может значительно замедлять список.
    • Контролировать порядок пользовательских отборов сложно, но можно, например, проиндексированные поля «вытащить» в отборы в конфигураторе, и они будут накладываться первыми.
    • Часто используемые сложные отборы (например, по вычисляемым полям или со сложными условиями) можно устанавливать в тексте запроса и оптимизировать. Для этого, например, можно использовать несколько форм динамического списка или несколько «вариантов» на одной форме.

    6. В пользовательском режиме

    • Лучше убирать ненужные к отображению колонки – это позволит облегчить запрос. Прирост к производительности правда очень незначительный.
    • Не использовать вывод дополнительных полей/характеристик через точку. Снижение производительности может быть очень высоким.

    7. Регламентные операции на MS SQL Server:

    Обновление статистик, обслуживание индексов.

    8. Используйте SQL Server Profiler

    Для отлавливания долгих запросов, анализа плана запроса и принятия дополнительных решений по оптимизации списка.

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

    При таком подходе удалось оптимизировать динамический список тестовой базы с миллионным справочником, обновление списка с различными отборами не превышает 2-3 секунд.

    Специальные предложения

    (1) MoGar,
    Проверял, сейчас повторно запустил проверку с 2 отборами двумя вариантами:
    1) Отбор по пустому менеджеру; отбор по вычисляемому полю — 458мс
    2) Отбор по вычисляемому полю; отбор по пустому менеджеру — 2278мс

    В тексте выполненных sql запросов различия в порядке условий сохранились, планы запросов разные.

    К сожалению, во втором случае ms sql не поменял порядок условий, а также выбрал неоптимальный план запроса. Повлиять на это со стороны 1С пока не представляется возможным, кроме как накладывать отборы в "правильном" порядке.

    Проверено также на типовой БП3.0, в запрос полного списка проводок добавлено "тяжелое" вычисляемое поле:
    (ВЫРАЗИТЬ(ХозрасчетныйДвиженияССубконто.Регистратор.Номер КАК СТРОКА(10))) + "_ЛЯЛЯ" КАК ЛЯЛЯ

    Читайте также:  Где должны быть запятые в предложении

    На список накладывал 2 вида отборов:
    1) СчетДт = 60.01; ЛЯЛЯ содержит "ЛЯ",
    2) ЛЯЛЯ содержит "ЛЯ"; СчетДт = 60.01,

    По сумме времени запросов ( по данным profiler’а), первый вариант отработал в 3,6 раза быстрее, чем второй.
    Если есть возможность, проверьте у себя, было бы интересно увидеть результаты на другой машине.

    (3) herfis,
    Видимо типовые решения нацелены на большой объем документов, когда небольшие подвисание прокрутки предпочтительней зависания списка при обновлении или наложении отбора/поиска.

    (4) herfis,
    Тут ситуация чуть более сложная. При снятом флаге выборка из SQL Server’a идет по 1000 шт. Но на клиент сервером 1С они все равно передаются частями. То есть:
    1) Флаг "Динамическое считывание данных" снят.
    При первом открытии: запрос к СУБД на 1000 строк (подвисание)
    При прокрутке списка : запроса к СУБД нет, но запрос, видимо, к серверу 1С (небольшое подвисание, что очень огорчает)
    При долгой прокрутке: повторный запрос к СУБД на 1000 строк (подвисание)
    2)Флаг "Динамическое считывание данных" установлен.
    При первом открытии: запрос к СУБД на 45 строк (небольшое подвисание)
    При прокрутке списка : повторный запрос к СУБД на 45 строк (небольшое подвисание)
    При долгой прокрутке: повторный запрос к СУБД на 45 строк (небольшое подвисание)

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

    Поясню что я имел в виду под процентом записей. Если из миллиона в список попадает 900 строк, то при динамическом считывании запрос быстро получит первые 45 подходящих строк и прервет запрос. Если динамическое считывание отключено, то запрос обработает все 900 строк (вероятно, в 20 раз дольше). А при обновлении эту долгую операцию повторит.
    Если из миллиона строк в список попадает 100000, то выборка 45 строк и 1000 строк не будет сильно отличаться по скорости. Но прокрутка удобнее будет при выборке большой порции.

    Например, на моих данных есть 2 вида списка.
    Один показывает полный список и отборы там ставятся, в основном, по индексированным полям. Запрос выполняется быстро, а в списке обычно большое количество записей, часто используется прокрутка. Здесь у меня снят флаг "Динамическое считывание данных", так как в моем случае это облегчает прокрутку.
    Второй показывает список со сложным отбором. Показывает около 100-500 строк из миллиона. Здесь у меня установлен флаг "Динамическое считывание данных", потому что это ускоряет открытие формы, обновление списка и наложение отборов. Но прокрутка в этой форме с подвисаниями.

    По моему мнению, в общем случае лучше на больших таблицах флаг устанавливать.

    Ссылка на основную публикацию
    Сообщение на тему жесткий диск по информатике
    Информатика Основным устройством хранения информации в компьютерной системе является жесткий диск. Большой объем и энергонезависимость сделали его наиболее пригодным для...
    Слова содержащие приставку корень суффикс и окончание
    Примеры разборов слов, у которых есть все основные морфемы: приставка, корень, суффикс, окончание. у бор к а у дивл ени...
    Словарь для it специалистов
    ykaneva 2018-04-09T16:54:33+00:00 September 13th, 2017 | Практика английского | 7 Comments 7 142,973 Сегодня день программиста. По этому поводу в...
    Сообщение о выигрыше айфона
    Да, почти всегда это обман и развод на деньги. Те, кто проводит ВКонтакте, Инстаграме и других соцсетях «конкурсы», «розыгрыши айфонов»,...
    Adblock detector