Перейти к содержимому

1.11 Отборы в динамическом списке по табличным частям

Telegram → Просто о платформе 1С

❓ 1.11 Как в динамическом списке работают отборы по табличным частям и невидимым полям?

ИТС: Платформа — Настройки списка. Отбор
https://its.1c.ru/db/v8327doc#bookmark:utx:TI000000212

ИТС: Платформа — Динамический список
https://its.1c.ru/db/v8327doc#bookmark:dev:TI000000395

ИТС: Платформа — Работа с динамическим списком
https://its.1c.ru/db/v8327doc#bookmark:dev:TI000000447

ИТС: Стандарты разработки — Ограничения при использовании динамических списков
https://its.1c.ru/db/v8std#content:489:hdoc

ИТС: Стандарты разработки — Особенности реализации команд для форм списков
https://its.1c.ru/db/v8std#content:495:hdoc


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

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

В зависимости от настроек динамический список может получать данные тремя способами:

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

Кеширование данных на сервере не выполняется.

Выборка данных по 1000 элементов из базы данных.
Данные кешируются на сервере.

Сначала 1000 строк, затем 2000, 3000 и так далее.
Данные кешируются на сервере до 1 000 000 строк.
Это наименее оптимальный способ с точки зрения памяти и производительности.

Способ считывания данных определяется настройками динамического списка:

  • Основная таблица
  • Свойство «Динамическое считывание данных»
  • Вид ключа

Настройки получения данных

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

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

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

Виды ключей:

  • Авто — вид ключа платформа пытается определить автоматически, исходя из свойства «Поля ключа» и заполненности свойства «Основная таблица»
  • Значение поля — уникальная строка определяется по значению одного поля
  • Ключ строки — уникальная строка определяется по набору полей
  • Номер строки — строку невозможно однозначно идентифицировать

Если основная таблица не указана, платформа определяет вид ключа по свойству «Поля ключа»:

  • если поля ключа не заданы — используется вид ключа «Номер строки»
  • если в полях ключа указано одно значение — используется вид ключа «Значение поля»
  • если в полях ключа указано несколько значений — используется вид ключа «Ключ строки»

Если основная таблица указана, используемый вид ключа зависит от используемой таблицы.

В упрощённом виде:

  • Если указана основная таблица и включено «Динамическое считывание данных»Способ 1
  • Если указана основная таблица и «Динамическое считывание данных» выключеноСпособ 2
  • Если используется виртуальная таблица регистров (кроме СрезПервых/СрезПоследних) → Способ 3
  • Если используется произвольный запрос → способ определяется видом ключа
Вид ключаДинамическое считывание включеноДинамическое считывание выключено
Значение поляСпособ 1Способ 2
Ключ строкиСпособ 1Способ 2
Номер строкиНе применимоСпособ 3

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

Команда «Настроить список» открывает пользовательские настройки списка, где можно задать:

  • отбор
  • сортировку
  • группировку
  • условное оформление

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

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

Поле может не отображаться в таблице формы, но при этом всё равно участвовать в отборе.

Поэтому для отбора:

  • по данным табличных частей
  • по связанным данным
  • по реквизитам, которые не показываются в таблице формы

нужно, чтобы эти поля участвовали в данных динамического списка.

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

Чтобы в динамическом списке работали отборы по табличным частям и по реквизитам, которые не отображаются в форме:

  • список должен быть построен на динамическом списке
  • нужные поля должны участвовать в источнике данных списка
  • при использовании произвольного запроса эти поля нужно явно включить в запрос
  • отборы настраиваются через команду «Настроить список»
  • если строка списка не может быть корректно идентифицирована, динамический список будет работать менее эффективно