1с 8 отбор родитель в динамическом списке. Способы получения и кеширования данных динамическим списком

Отбор на управляемых формах в 1С 8.3

В статье будут рассмотрены варианты установки отбора в управляемых формах 1С 8.3. Отбор для динамического списка может быть установлен статически или динамически, в пользовательском интерфейсе или конфигураторе. Все варианты отборов мы рассмотрим ниже.

  • Установка отбора в конфигураторе

Установка отбора в пользовательском режиме

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

Для установки отбора в режиме предприятия необходимо вызвать команду «Настроить список».

Откроется окно.


На вкладке «отбор» представлен список полей, который есть в текущем списке. Выбираем поля списка, по которым будем фильтровать. Сделать это можно двойным кликом или используя drag and drop.


Задаем вид сравнения и значение, жмем «Завершить редактирование», отбор установлен.


При установке отбора в режиме предприятия на форме списка автоматически создаются поля так называемых быстрых отборов.


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


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

Установка отбора в конфигураторе

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

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


Откроется окно.


Отбор задается так же, как в пользовательском режиме.

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


Динамический (программный) отбор

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

Методы

Если в разрабатываемой конфигурации присутствует подсистема БСП «БазоваяФункциональность», программный отбор в динамическом списке можно установить используя типовой метод:

ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка()

Сигнатура данного метода:

ДинамическийСписок Тип: ДинамическийСписок – Список, в котором требуется установить отбор.

ИмяПоля Тип: Строка – Поле, по которому необходимо установить отбор.

ПравоеЗначение Тип: Произвольный – Значение отбора (Необязательный. Значение по умолчанию: Неопределено. Внимание! Если передать Неопределено, то значение не будет изменено).

ВидСравнения Тип: ВидСравненияКомпоновкиДанных – Условие отбора.

Представление Тип: Строка – Представление элемента компоновки данных (Необязательный. Значение по умолчанию: Неопределено. Если указано, то выводится только флажок использования с указанным представлением (значение не выводится). Для очистки, чтобы значение снова выводилось, следует передать пустую строку).

Использование Тип: Булево – Флажок использования этого отбора (Необязательный. Значение по умолчанию: Неопределено).

РежимОтображения Тип: РежимОтображенияЭлементаНастройкиКомпоновкиДанных – Способ отображения этого отбора пользователю. Возможные значения:

  • РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ – В группе быстрых настроек над списком.
  • РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный – В настройка списка (в подменю Еще).
  • РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный – Запретить пользователю менять этот отбор.

ИдентификаторПользовательскойНастройки Тип: Строка – Уникальный идентификатор этого отбора (Используется для связи с пользовательскими настройками).

Для удаления какого-то значения отбора необходимо воспользоваться типовым методом:

ОбщегоНазначенияКлиентСервер. УдалитьЭлементыГруппыОтбораДинамическогоСписка ()

Сигнатура данного метода:

ДинамическийСписок Тип: ДинамическийСписок – реквизит формы, для которого требуется установить отбор.

ИмяПоля Тип: Строка – имя поля компоновки (не используется для групп).

Представление Тип: Строка – представление поля компоновки.

В случае отсутствие в системе БСП отбор можно установить самостоятельно, используя объект ПолеКомпоновкиДанных.

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

Данный отбор отберет строки, в которых значение «ФИО» = «Иванов».

Для использования логических «И», «ИЛИ», «НЕ» предназначен тип данных ГруппаЭлементовОтбораКомпоновкиДанных

ГруппаОтбора = Список.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИЛИ; ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ФИО"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбора.ПравоеЗначение = "Иванов"; ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ФИО"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбора.ПравоеЗначение = "Петров";

Данный отбор отберет строки, в которых значение «ФИО» = «Иванов» или «Петров».

Отбор в динамическом списке также можно производить через изменение текста запроса динамического списка. Этот вариант работает, когда динамический список сделан через «произвольный запрос».


Для этого к тексту запроса добавляем условие «ГДЕ Истина»…


Как видно, такой подход более компактный с точки зрения написания кода. Чем сложнее условия отбора в табличной части мы хотим установить, тем более громоздким будет вариант с использованием отбора через ЭлементОтбораКомпоновкиДанных. Однако у примера с изменением текста запроса есть свои недостатки – эта реализация не устойчива к изменениям кода. Например, вы сделали такую реализацию и забыли, но если в будущем вы захотите модифицировать текст запроса, добавив в него какой-либо оператор после ГДЕ (УПОРЯДОЧИТЬ, СГРУППИРОВАТЬ), вам нужно не забыть про то, что в программном коде есть:

Список.ТекстЗапроса = Список.ТекстЗапроса + " И СправочникПользователи.ФИО В(""Иванов"",""Петров"")";

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

ГДЕ (НЕ &ОтборУстановлен ИЛИ СправочникПользователи.ФИО В (&РазрешенныеФИО))

Список.Параметры.УстановитьЗначениеПараметра("ОтборУстановлен", ФИО.Количество() > 0); Список.Параметры.УстановитьЗначениеПараметра("РазрешенныеФИО", ФИО);

Тут ФИО – массив.

Ка видно, 2 строчки кода против 10. Какой из способов выбрать, зависит от конкретной прикладной задачи.

Печать (Ctrl+P)

Динамический список

1. Общая информация

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

Рис. 1. Варианты создания динамического списка

При создании реквизита формы типа ДинамическийСписок разработчик может выбрать два способа формирования запроса к данным:
● Заданием основной таблицы – в этом случае достаточно просто указать таблицу (свойство Основная таблица), из которой необходимо получать данные, и система будет автоматически формировать запрос к данным (см. правую часть на рис.1).
● Ручным формированием запроса – для этого нужно установить свойство Произвольный запрос (см. левую часть рис.1). После этого будет доступно ручное формирование запроса получения данных из информационной базы.
С помощью запроса можно выполнять выборку данных из нескольких таблиц, поэтому можно указать основную таблицу. Это нужно для того, чтобы динамический список мог определить, какие данные главные, а какие – второстепенные, и мог правильно выбирать и отображать информацию, а также предоставлять стандартные команды. Однако если в запросе невозможно определить основную таблицу, то ее можно не указывать, но тогда
динамический список не будет предоставлять команды, связанные с основной таблицей. Кроме того, в этом случае (без указания основной таблицы) будет существенно снижена эффективность получения данных динамическим списком.
В целях повышения производительности, рекомендуется все соединения, используемые в произвольном запросе только для получения дополнительных данных, делать необязательными с помощью расширения языка запросов системы компоновки данных.
Для динамического списка, являющегося основным реквизитом формы, имеется возможность устанавливать значения отбора с помощью параметра формы Отбор . Для этого необходимо, чтобы имя свойства структуры, находящееся в параметре Отбор ,
совпало с именем поля отбора динамического списка. В этом случае значение свойства структуры будет установлено в качестве правого значения элемента отбора. Если в качестве значения элемента параметра Отбор формы динамического списка передан массив, фиксированный массив или список значений, то в отбор добавляется условие с вариантом В Списке, в правое значение которого помещается список значений (в который преобразуются массив и фиксированный массив).
В качестве произвольного запроса в динамическом списке может выступать запрос, в котором для формирования значения какого-либо поля используется параметр, например:

ВЫБРАТЬ
ВЫБОР
КОГДА Доставка.Коэффициент = 1 ТОГДА &Представление
ИНАЧЕ Доставка. Коэффициент
КОНЕЦ КАК Коэффициент
ИЗ

При этом если тип значения параметра отличается от типа реквизита объекта (например, Реквизит1 имеет тип Число , а значение параметра – тип Строка ), то для корректного отображения поля следует выполнить явное приведение значения параметра к нужному типу:

ВЫБРАТЬ
ВЫБОР
КОГДА Доставка.Коэффициент = 1 ТОГДА ВЫРАЗИТЬ(&Представление КАК Строка(100)) ИНАЧЕ Доставка. Коэффициент
КОНЕЦ КАК Коэффициент
ИЗ
Документ.ДоставкаПродукции КАК Доставка

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

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

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

2. Ограничения и особенности

При установке отбора в динамическом списке следует помнить, что отбор не действует на группы, если для динамического списка выбран режим отображения Иерархический список или Дерево. Под «группами» понимается элемент справочника или плана видов характеристик, у которого свойство ЭтоГруппа установлено в значение Истина.
Отборы, автоматически накладываемые динамическим списком на стандартные реквизиты Владелец, Родитель, Дата, Период и ЭтоГруппа, применяются
стандартными средствами системы компоновки данных. Отборы, автоматически накладываемые динамическим списком на ключевые поля, могут применяться как стандартными средствами системы компоновки данных так и путем непосредственного добавления в текст запроса условия В на поля основной таблицы. В результате применения отборов средствами компоновки, они могут примениться как во вложенных запросах, так и в параметрах виртуальных таблиц.

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

  • По реквизитам табличных частей.
  • Поля представлений.
  • Поле ВерсияДанных.
  • Поле ИмяПредопределенныхДанных.
  • Поле Вид таблицы плана счетов.
  • Поле ВидДвижения таблицы регистра накопления.
  • Поле ТипЗначения таблицы плана видов характеристик.
  • Поле типа Тип;
  • Поле типа Строка (неограниченной длины).
  • Поле типа ДвоичныеДанные.

● Не поддерживается сортировка и группировка по полям Субконто<НомерСубконто> и ВидСубконто<НомерСубконто> таблицы ДвиженияССубконто регистра бухгалтерии.
● Не поддерживается группировка по полям, которые представляют собой выражения языка запросов, содержащие агрегатные функции.
● При выбранной основной таблице, запрос динамического списка имеет следующие ограничения:

  • Не поддерживаются объединения.
  • Не поддерживается использование секции УПОРЯДОЧИТЬ ПО. Следует использовать запрос без основной таблицы или задавать необходимое упорядочивание через настройки динамического списка.

● Если динамический список отображается в виде иерархического списка или дерева, то запись не будет отображена динамическим списком, если не отображается хотя-бы один родитель этой записи. Другими словами – для отображения элемента иерархического списка, динамический список должен отобразить также всех родителей этого элемента до вершины списка. При этом под вершиной списка подразумевается или собственно
корневой элемент иерархического объекта, отображаемого динамическим списком или элемент, установленный в качестве свойства РодительВерхнегоУровня расширения таблицы формы для динамического списка.

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

● Таблица, для которой отсутствует ключ, уникально идентифицирующий каждую запись таблицы (ссылка для объектных таблиц и ключ записи для таблиц регистров). Однако следующие таблицы могут быть установлены в качестве основной таблицы динамического списка (несмотря на отсутствие ключа):

● таблица Субконто регистра бухгалтерии;
● все виртуальные таблицы регистра бухгалтерии, кроме таблицы ДвиженияССубконто;
● таблицы значений констант (включая таблицу Константы);
● таблицы внешних источников данных без ключевых полей;
● таблицы кубов внешних источников данных;
● таблицы регистра накопления:

  • таблица оборотов;
  • таблица остатков;
  • таблица оборотов и остатков.

● таблицы регистра расчета:

  • таблица фактического периода действия;
  • данных графика;
  • базовых данных.

● Таблицы табличных частей объектов;
● Таблицы регистрации изменений (используемые в механизмах обмена данными);
● Таблицы последовательностей;
● Таблицы перерасчетов (используемые в механизмах периодических расчетов).
● Таблицы, которая используется в запросе только во внешнем соединении.

Другими словами, динамический список с указанной основной таблицей будет работать корректно в том случае, если в результате выполнения запроса,
указанного в качестве источника данных, не увеличивается количество строк, получаемых из основной таблицы (с учетом наложенного отбора). Если же в результате выполнения запроса количество строк, получаемых запросом из основной таблицы, увеличивается, это будет приводить к нарушению уникальности ключа записей таблицы, отображаемой списком. В этом случае необходимо отключить использование основной таблицы динамического списка.
При работе динамического списка необходимо учитывать права доступа на реквизиты, отображаемые списком:
● На сторону клиента не передаются данные колонок динамического списка, которые помечены свойством Использовать всегда, но для которых у текущего пользователя отсутствует право Просмотр. Доступ к данным таких колонок (с помощью свойства ТекущиеДанные и метода ДанныеСтроки())
на стороне клиента невозможен.
● Если у текущего пользователя отсутствует право Просмотр на ключевое поле динамического списка, получение данных этим динамическим список приводит к ошибке нарушения прав доступа.
Для динамического списка, который отображает список перечисления, отсутствует возможность интерактивной настройки списка.
Состав колонок и настройки динамического списка связаны с полями запроса по псевдонимам полей выборки. Если в запросе для поля выборки псевдоним не задан явно и поле является системным, то в качестве псевдонима используется имя поля для английского варианта встроенного языка.
Указанная связь означает, что при изменении (или явном указании псевдонима для поля, у которого использовался автоматический псевдоним)
псевдонима поля запроса, формирующего данные динамического список, будут утеряны настройки реквизита динамического списка, элементы формы «потеряют» отображаемые реквизиты, настройки динамического списка станут неверными и т. д.
В том случае, если источником данных динамического списка является таблица (обычная или виртуальная), которая позволяет устанавливать отбор по периоду, то в том случае, если пользователь устанавливает период отображения в таком динамическом списке (команда Установить интервал дат…),
заданные границы периода будут установлены в качестве значений отбора или параметров виртуальной таблицы. Если средствами расширения языка
запросов для системы компоновки данных были явно указаны имена параметров виртуальной таблицы – будут установлены параметры с заданными
именами. Таблицы, для которых возможно управлять периодом отображения или обработки данных:
● таблицы регистров (основные или виртуальные), для которых существует возможность отбора по периоду (для регистра расчета – по периоду регистрации);
● основные таблицы документов, бизнес-процессов и задач;
● основные таблицы журналов документов;
● основные таблицы последовательностей, таблицы границ последовательностей.
В качестве параметра запроса динамического списка может выступать массив или список значений. Однако если параметром является список значений, то в качестве значения отбора будет использовано только первое значение списка. В случае если динамический список использует запрос с параметрами, первоначальная установка значений параметров должна выполняться в обработчике ПриСозданииНаСервере.
При отображении данных динамического списка следует помнить о следующих особенностях:
● При программном изменении свойств динамического списка не происходит автоматического повторного заполнения командных панелей, связанных
с этим динамическим списком.
● Если несколько полей сгруппированы в группу с режимом группировки В ячейке и в сгруппированных полях есть поле, которое отображается флажком, то этот флажок всегда будет отображаться первым в получившейся ячейке (левее текста).
В динамическом списке, при определении типа данных для полей, в состав выражений которых входят параметры, поля или литералы, результирующий тип определяется по типам полей и литералов. Если тип значения параметра не входит в результирующий тип данных – его значение будет усечено.
Например, в следующем примере поле будет иметь тип Число.

ВЫБОР
КОГДА ЛОЖЬ
ТОГДА 5
ИНАЧЕ
&Параметр
КОНЕЦ

Если присвоить параметру Параметр значение другого типа, в динамический список для этого поля будет получать значение 0 (значение по умолчанию для типа Число).
Если в подобной ситуации требуется выбирать параметр другого типа – рекомендуется использовать конструкцию языка запросов ВЫРАЗИТЬ . Например,
если в приведенном выше примере требуется передавать в параметр строку не длиннее 100 символов, то следует заменить простое указание параметра, на выражение с явным приведением типа:

ВЫБОР
КОГДА ЛОЖЬ
ТОГДА 5
ИНАЧЕ
ВЫРАЗИТЬ(&Параметр КАК Строка(100))
КОНЕЦ

Если в произвольном тексте запроса динамического списка в выражениях полей выборки используются параметры – следует явно указать тип параметров при помощи конструкции ВЫРАЗИТЬ . Например, вместо &Номенклатура КАК Номеклатура использовать
ВЫРАЗИТЬ(&Номенклатура КАК Справочник.Номенклатура) КАК Номенклатура . В противном случае поиск через строку поиска может работать
некорректно или выдавать ошибки.

3. Способы получения и кеширования данных динамическим списком

При получении данных для отображения динамический список использует один из трех способов:
1. Считывание из базы данных выполняется порциями с количеством элементов данных, несколько превышающим количество строк, одновременно отображаемых списком (но не менее 20). Не выполняется кеширование данных на сервере.
2. Считывание из базы данных выполняется страницами по 1 000 элементов данных. Выполняется кеширование данных на сервере. Иерархические данные кешируются: для каждого родителя кешируется не более 2 страниц элементов. На один динамический список кешируется не более 20 страниц элементов. Кеширование будет включено динамическим списком для следующих таблиц:
● Критерий отбора;
● Все таблицы регистра бухгалтерии, кроме основной таблицы и таблицы ДвиженияССубконто;
● Все таблицы регистра накопления, кроме основной таблицы;
● Все таблицы регистра сведений, кроме основной таблицы;
● Все таблицы регистра расчета, кроме основной таблицы;
● Виртуальная таблица ЗадачиПоИсполнителю;
● Таблицы внешних источников без ключей;
● Кубы внешних источников.

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

● В качестве значения свойства Основная таблица указана одна из следующих таблиц: план обмена, справочник, список документов, журнал документов, план видов характеристик, план счетов, план видов расчета, бизнес-процесс, задача, таблица точек бизнес-процесса:



● В качестве значения свойства Основная таблица указана одна из следующих таблиц: основная таблица регистра сведений, регистра накопления, регистра бухгалтерии, регистра расчета, виртуальная таблица регистра бухгалтерии ДвиженияССубконто:

● Свойство Динамическое считывание:
● Установлено: используется способ 1 (описание способов приведено выше).
● Сброшено: используется способ 2 (описание способов приведено выше).

● В качестве свойства Основная таблица указана таблица критерия отбора или таблица задач по исполнителю (ЗадачиПоИсполнителю):
● Ключ, идентифицирующий строку таблицы: Ссылка.

● В качестве свойства Основная таблица указана виртуальная таблица регистра сведений СрезПервых или СрезПоследних:
● Ключ, идентифицирующий строку таблицы: КлючЗаписи.
● Свойство Динамическое считывание не применимо.
● Используется способ 2 (описание способов приведено выше).

● В качестве свойства Основная таблица указана одна из виртуальных таблицы регистров, кроме перечисленных выше:

● Свойство Динамическое считывание не применимо.

● Свойство Основная таблица не указано, используется произвольный запрос:
● Ключ, идентифицирующий строку таблицы: Число.
● Свойство Динамическое считывание не применимо.
● Используется способ 3 (описание способов приведено выше).

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

4. Настройки динамического списка

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


Рис. 2. Условное оформление динамического списка

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

СОВЕТ. Следует помнить о том, что неудачный выбор полей сортировки (равно как отбора и группировки данных) негативно влияет на эффективность динамической выборки.
С точки зрения прикладного разработчика, настройки динамического списка состоят из нескольких частей, которые связаны между собой. Основным свойством, через которое можно управлять настройками динамического списка является КомпоновщикНастроек . Это объект содержит три набора настроек, которые при работе системы определяют окончательные настройки, применяемые к динамическому списку:
● Настройки – настройки, созданные в режиме Конфигуратора. Свойство динамического списка Порядок предоставляет быстрый доступ к свойству Настройки.Порядок компоновщика настроек динамического списка, таким образом, следующие конструкции являются эквивалентными:
Список.Порядок и Список.КомпоновщикНастроек.Настройки.Порядок;
● ПользовательскиеНастройки – это настройки, которые изменяет пользователь в режиме «1С:Предприятие»;
● ФиксированныеНастройки – эти настройки задаются из встроенного языка. Также в этой свойство попадают значения отбора, которые передаются в форму с помощью ее параметров. Свойства динамического списка Отбор, Параметры, УсловноеОформление предоставляют быстрый доступ к фиксированным настройкам компоновщика настроек динамического списка. Другими словами, данные обращения являются эквивалентными:
Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор и Список.Отбор.
При формировании окончательной настройки динамического списка, различные варианты настроек комбинируются следующим образом:
● Если какой-либо вид настроек целиком отмечен как пользовательский, то в результирующие настройки попадают пользовательские настройки
(Список.КомпоновщикНастроек.ПользовательскиеНастройки). При этом если какие-либо элементы настроек отмечены как недоступные, то эти настройки будет помещены в результирующие настройки из свойства Список.КомпоновщикНастроек. Настройки.
● Если какой-либо вид настроек отмечен как пользовательский не целиком, а поэлементно, то:
● Элементы, отмеченные как пользовательские, попадут в результирующие настройки из свойства Список.КомпоновщикНастроек.ПользовательскиеНастройки.
● Элементы, отмеченные как недоступные, попадут в результирующие настройки из свойства Список.КомпоновщикНастроек.Настройки.
● Фиксированные настройки (Список.КомпоновщикНастроек.ФиксированныеНастройки) добавляются в результирующие настройки «как есть». При этом недопустима ситуация, когда в фиксированных и пользовательских настройках есть одноименные настройки, например отбор с одинаковым левым значением в условии.

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


Рис. 3. Управление включением в пользовательские настройки

Флажок в нижней части окна (см. рис. 3) отвечает за размещение в настройках (обычных или быстрых) всего вида настроек. Эта возможность доступна для отбора, порядка, группировки и условного оформления. Если настройки указаны с режимом редактирования Быстрый выбор, то в свойстве Группа пользовательских настроек таблицы формы, отображающей динамический список, необходимо указать пустую группу формы, в которой будут располагаться элементы, связанные с быстрыми пользовательскими настройками динамического списка. Если группа не указана – быстрые пользовательские настройки не будут отображены на форме. Также имеется возможность явно вызвать создание пользовательских настроек с помощью встроенного языка с помощью метода СоздатьЭлементыФормыПользовательскихНастроек() расширения динамического списка.
Также имеется возможность выбирать возможность размещения в пользовательских настройках конкретных элементов настроек. Эта возможность доступна для элементов отбора и условного оформления (см. рис. 3).

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

5. Поиск в динамическом списке

Динамический список, расположенный на форме, предоставляет возможность выполнять интерактивный поиск в отображаемых данных. Поиск может осуществляться с помощью следующих инструментов: строки поиска, диалога поиска, поиска текущего значения, с помощью истории поиска и установкой периода (для динамических списков, отображающих документы). Результатом поиска выступает ограниченный набор записей
динамического списка (из доступных данному пользователю), которые соответствуют критериям поиска.
Для управления возможностями поиска в динамическом списке предназначены три свойства таблицы управляемой формы, отображающей динамический список:
● Положение строки поиска – определяет положение строки поиска. Может принимать следующие значения: Авто, Командная панель, Нет, Верх, Низ.


Рис. 4. Строка поиска в динамическом списке

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


● Если свойство Режим совместимости установлено в значение Не использовать или старше значения Версия 8.3.4 – значение Командная панель.
Переход к строке поиска осуществляется следующим образом:
● Нажатием сочетания клавиш Ctrl+F;
● Мышью;
● При начале набора текста в динамическом списке (с учетом значения свойства динамического списка ПоискПриВводе).
● Положение состояния просмотра – описывает, где будет отображаться состояние просмотра: по каким полям выполнялся поиск и какие значения
искались в каждом поле. Может принимать следующие значения: Авто, Нет, Верх, Низ


Рис. 5. Состояние поиска в динамическом списке

Если свойство установлено в значение Нет, то состояние просмотра будет отсутствовать на форме. В результате определить, выполнен поиск или нет, можно будет только по доступности кнопки Отменить поиск.
Если свойство установлено в значение Верх, то состояние просмотра будет расположено между командной панелью списка и таблицей, отображающей динамический список. Если свойство установлено в значение Низ, то состояние просмотра будет размещено сразу после таблицы, отображающей динамический список.
Если форма создана в «1С:Предприятии» версии 8.3.4 и младше – свойство установлено в значение Нет. Если форма создана в «1С:Предприятии» версии 8.3.5 и старше – свойство установлено в значение Авто. Реальное значение свойства в этом случае будет определяться следующим образом:
● Если свойство Режим совместимости установлено в значение Версия 8.3.4 (и ниже) – значение Нет;
● Если свойство Режим совместимости установлено в значение Не использовать или старше значения Версия 8.3.4 – значение Верх;
● Положение управления поиском – определяет, где будет отображаться кнопка управления поиском. Кнопка открывает меню, которое содержит следующую информацию: команды Найти по текущему значению, Расширенный поиск, Отменить поиск, Установить период (для списков документов и журналов) и история поисковых запросов (последние 5 запросов). Свойство может принимать значения: Авто, Нет, Командная панель.


Рис. 6. Управление поиском в динамическом списке

Если свойство установлено в значение Нет, то кнопка управления поиском будет отсутствовать на форме (но команды будут доступны с помощью меню Еще). Значение свойства Командная панель размещает кнопку на командную панель, связанную с таблицей, отображающей динамической список.
Если форма создана в «1С:Предприятии» версии 8.3.4 и младше – свойство установлено в значение Нет. Если форма создана в «1С:Предприятии» версии 8.3.5 и старше – свойство установлено в значение Авто. Реальное значение свойства в этом случае будет определяться следующим образом:
● Если свойство Режим совместимости установлено в значение Версия 8.3.4 (и ниже) – значение Нет;
● Если свойство Режим совместимости установлено в значение Не использовать или старше значения Версия 8.3.4 – значение Командная панель;
Если на форме присутствуют несколько командных панелей, источником команд для которых является одна таблица управляемой формы (отображающая данные динамического списка), то строка поиска и кнопка управления поиском будет располагаться только в одной командной панели:
● Или в командной панели самого динамического списка (если для нее включено автоматическое заполнение)
● Или в любой из оставшихся командных панелей.

Рассмотрим особенности использования поиска в динамическом списке:
● Для того чтобы поиском было удобно пользоваться (в том числе и с точки зрения быстродействия) необходимо включить полнотекстовый поиск для всех объектов конфигурации, которые могут использоваться в качестве основной таблицы динамического списка. Также в полнотекстовом поиске должны участвовать все реквизиты объектов конфигурации, которые могут отображаться в динамическом списке и по которым может потребоваться поиск.
Если объект исключен из полнотекстового поиска, то рассматриваемый механизм поиска будет работать, но производительность такого поиска будет крайне низкой. Не рекомендуется использовать поиск по объектам, которые не индексируются полнотекстовым поиском.
● В прикладном решении должно быть регламентное задание, которое регулярно обновляет индекс полнотекстового поиска.

● Поиск выполняется не по всем колонкам динамического списка (и объекта конфигурации), а только по тем колонкам, которые отображаются в таблице.
● Поиск в динамическом списке по полям ссылочных типов с произвольным представлением выполняется по полям, которые используются для
формирования представления (см. здесь). Поля, входящие в представление, получаются с учетом обработчика ОбработкаПолученияПолейПредставления() соответствующего объекта.
● Для динамических списков с указанной основной таблицей используется полнотекстовый поиск по основной таблице. К результатам полнотекстового поиска будут добавлены все непроиндексированные ссылки из основной таблицы. Результат полнотекстового поиска для основной таблицы используется в качестве отбора по ключевым полям. Также выполняется полнотекстовый поиск по полям, отображаемым в списке из других таблиц (если для поля и объекта конфигурации используется полнотекстовый поиск). Без включенного полнотекстового поиска данные могут быть
найдены, но сам поиск будет выполняться очень медленно.
Если при попытке выполнить полнотекстовый поиска произошла ошибка, поиск будет выполняться без применения полнотекстового поиска.
Например, такое может произойти при поиске по одной букве и большому количеству строк в информационной базе, начинающихся с этой буквы.
● В том случае, если для поля основной таблицы динамического списка используется отбор с видом сравнения Равно, то при выполнении полнотекстового поиска к поисковому запросу по этой таблице будет добавлено значение отбора.
● Строка поиска разбивается на слова. Это разбиение выполняется по следующим правилам:
● Строка разбивается, используя символы пробела и табуляции в качестве разделителей.
● Затем обрабатывается каждый получившийся фрагмент:
● Если фрагмент является представлением даты (с временем или без него) с учетом текущих региональных установок сеанса, то словом является этот фрагмент.
● Иначе фрагмент разбивается далее, используя в качестве разделителей символы “,.-/\”. В этом случае в качестве слова принимается каждый получившийся фрагмент строки.

● Для каждого слова формируется свой набор условий, которые объединяются «по ИЛИ». Этот набор условий формируется в том случае, если полнотекстовый поиск данного слова в таблице, из которой было получено данное поле, вернул хотя бы один объект или полнотекстовый поиск не использовался для этого поля. Условия формируются следующим образом:
● Для поля типа Строка условие имеет вид ИмяПоля ПОДОБНО %Слово%.
● Для поля типа Число условие имеет вид ИмяПоля=Значение, где Значение – это слово, которое приведено к типу Число. Если приведение выполнить невозможно – поиск по полю выполняться не будет.
● Слово ищется как подстрока в представлении по умолчанию для типа Булево, определенное для текущего сеанса. Если искомое слово обнаружено в представлении, то в дальнейшем выполняется поиск значения, соответствующего представлению, в котором обнаружено слово. При этом для поиска не используются представления, которые заданы с помощью свойства элемента формы Формат.
● Для поля типа Дата условие имеет вид ИмяПоля>= НачалоДня(Слово) И ИмяПоля<=КонецДня(Слово). Если Слово подобно дате, в которой год
указан одной или двумя цифрами, год будет приведен к текущему веку и уже это значение будет подсталяться в поисковое условие.
● Для ссылочных полей выполняется поиск по полям, использующимся для формирования представления ссылки. В каждом из этих полей поиск
выполняется по правилам, описанным выше. Для поиска не используются поля, используемые для формирования произвольного представления данных.
Набор условий для каждого слова объединяются «по И».
● Для значений с ведущими нулями, выполнять поиск можно как по строке с ведущими нулями, так и по строке, указанной без ведущих нулей.
● Если динамический список отображает список документов или журнал документов, то заданный интервал просмотра списка также отображается в области формы, отведенной для отображения состояния просмотра для необходимого динамического списка.
● Команда поиска по текущему значению не доступна в том случае, если основной таблицей динамического списка является критерий отбора.
● Найденные фрагменты строк выделяются при отображении в таблице.
● Для одной колонки поддерживается поиск только по одной поисковой строке. При добавлении нового поискового запроса для колонки, по которой уже выполняется поиск, произойдет замена поискового выражения, а не сложение двух поисковых запросов.
● Если на форме отсутствует дополнение элемента формы вида Отображение строки поиска, связанное с таблицей (свойство Источник дополнения элемента формы), отображающей динамический список, то нажатие сочетания клавиш Ctrl+F приводит к открытию диалога поиска.


Рис. 7. Диалог поиска

Если на форме присутствует дополнение элемента формы вида Отображение строки поиска, связанное с таблицей (свойство Источник дополнения элемента формы), отображающей динамический список, то для открытия диалога поиска следует использовать команду Расширенный поиск.
● При использовании диалога поиска нужно помнить о следующих особенностях:
● Открытие диалога поиска по сочетанию клавиш приводит к тому, что значение текущей ячейки оказывается в строке Что искать, а значение переключателя Как искать устанавливается в значение По точному совпадению.

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

6. Получение данных, отображаемых динамическим списком

При использовании динамических списков может потребоваться выполнить различные действия с данными, которые в данный момент отображаются динамическим списком, с учетом наложенных отборов и примененного поиска. К таким действиям относятся: обработка отображаемой информации, например, перепроведение выделенных документов или установка какого-либо реквизита у выделенных объектов, формирование списка доступных объектов (с оформлением и т. д.), например, для печати или сохранения в табличный документ.
Для получения данных, которые отображаются динамическим списком, следует использовать методы ПолучитьИсполняемуюСхемуКомпоновкиДанных() и
ПолучитьИсполняемыеНастройкиКомпоновкиДанных().
Пример получения данных:

Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
Возврат ПроцессорВывода.Вывести(ПроцессорКомпоновки);

Получение данных в коллекцию значений (таблица или список значений) выполняется аналогично.
Получение данных динамического списка указанным образом имеет ряд особенностей, которые нужно учитывать при разработке прикладных решений:
● Не поддерживается следующее оформление таблицы:
● Чередование цветов строк;
● Картинка шапки;
● Картинка подвала;
● Цвет фона подвала;
● Цвет текста подвала;
● Шрифт подвала;
● Горизонтальное положение в подвале;
● Режим пароля.
● Не поддерживается условное оформление, указанное для управляемой формы;
● При упорядочивании иерархической таблицы по возрастанию, по полю типа Ссылка, записи, содержащие пустую ссылку всегда размещаются первыми.

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

Как установить отбор в список?

Создать отбор можно двумя способами: в форме самого списка или прописать программным способом. В первом случае необходимо добавить динамический список 1С 8 в форму, определить для него главную таблицу, а затем зайти в его свойства. Управляемая форма позволяет работать с самыми разными значениями. Там необходимо найти пункт «Настройка списка» и перейти в это меню. В открывшемся после перехода окошке можно вручную задать любой сортировщик для используемого списка, а после – управлять сформированным отбором программно.

Чтобы установить динамический сортировщик программно, следует знать, что отбор в 1С считается свойством динамического списка. Чтобы добавить отбор, пользуясь этим качеством, необходимо добавить новый элемент в свойство отбора. Чтобы все работало, необходимо установить параметр в поле выбора правого, левого значения, а еще в поле «Вид сравнения». Важно вписать значение «истина» в поле использования. Таким образом можно создать самый простой отбор. Добавляя условия в других полях можно сделать его более сложным и подогнать под свои нужды.

Отборы в таблице значений 1С

Чтобы установить отбор в таблице, можно использовать один из нескольких вариантов. Можно сделать ручной отбор – перебрать таблицу и скрыть все строки, которые вам не нужны. Но это очень трудоемкий процесс, заниматься которым захочется не каждому. Этот способ подойдет только для тех, кто только начинает работать с 1С и еще не может освоить более сложные, но продуктивные методики.

Второй вариант отбора в таблице действует через метод таблицы под названием «найти строки». Существенным недостатком такого метода является то, что единственный тип для сравнения будет «равно», что значительно сужает возможность использования отбора.

Самый рациональный метод отбора в таблице можно сделать через построитель запроса.

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

Динамические списки дают широкие возможности для работы с данными, которых в 1С 7 не было. Одна из самых удобных из них – создание форм выбора. К примеру, в 1С: Бухгалтерия необходимо зайти в меню «Номенклатура» и добавить новую форму выбора, назначив ее как основную.

Чтобы установить параметры в динамический список:

  • Можно воспользоваться формами выбора;
  • При создании этой формы на поле автоматически появится динамический список выбора;
  • Зайдя в его свойства, можно увидеть пункт «Произвольный запрос». Именно этот запрос и позволяет использовать все преимущества динамического списка;
  • Вы можете вписать в этот запрос свои параметры;
  • Установив флажок и открыв это окно, можно увидеть новый запрос, со всеми полями из справочника номенклатуры;
  • Нажав на кнопку конструктора запросов, вы можете изменить содержание этого списка.

Чтоб добавить собственный запрос в выпадающий список, необходимо зайти во вкладку настройки. В первой же вкладке вы увидите возможность сделать любой отбор по вашим потребностям.

Программная установка запроса

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

В 1С список значений на форме – это отличный способ сделать работу с программным обеспечением 1С более рациональной и продуктивной. Это позволяет оптимизировать всю работу на предприятии.