21.04.2014 Получение данных динамического списка
Реализовано в версии 8.3.6.1977.
Мы реализовали возможность простого и удобного получения данных, отображаемых с помощью динамического списка.
Данные динамического списка могут понадобиться вам для того, чтобы распечатать их в нестандартном, «специфическом» виде. Или для того, чтобы выполнить с ними те или иные действия. Например, послать письмо всем контрагентам, которых вы отобрали в списке по некоторым признакам.
Кроме этого существует целый ряд задач, в которых пользователь, помимо списка элементов, хочет видеть ещё и итоговые данные, связанные с этим списком. Например, отобрав товары некоторой товарной группы и некоторого поставщика, он тут же хочет увидеть общее количество таких товаров в базе.
Динамический список сам по себе не может предоставить вам такую информацию. Задача динамического списка - обеспечить быстрый просмотр больших объёмов данных. Поэтому он считывает данные порциями, требуемыми для отображения на одном-двух экранах. И «ничего не знает», например, об общем количестве данных, которые ему предстоит считать.
В общем случае для того, чтобы получить дополнительную информацию, которую хочет пользователь, вам нужно выполнить запрос к базе данных. В точности повторяющий тот, который используется в динамическом списке.
Раньше вы могли это сделать. Но далеко не всегда это было просто. Ведь кроме текста исходного запроса, по которому работает динамический список, вам нужно было знать все отборы, сортировки и др. параметры, которые пользователь интерактивно установил в таблице, отображающей данные.
Теперь эта задача решается просто. У таблицы динамического списка появились два новых метода:
- ПолучитьИсполняемуюСхемуКомпоновкиДанных() ;
- ПолучитьИсполняемыеНастройкиКомпоновкиДанных() .
Таким образом, вы получаете и саму схему компоновки данных, и, главное, все её настройки, благодаря которым пользователь видит список именно таким. Вам остаётся только лишь программно скомпоновать макет и вывести его в коллекцию значений (для программной обработки) или в табличный документ (для отображения):
В результате вы получите структуру (или отчет), содержащую колонки и строки, выводимые в таблицу динамического списка.
Важным моментом является то, что схема и настройки, которые вы получаете от таблицы динамического списка, учитывают, в том числе, видимость колонок и применённый поиск. Так как настройки получаются отдельно, вы можете для своих целей изменить состав полей и получить, например, все колонки списка, а не только те, которые видны пользователю.
При выводе в табличный документ есть ещё один приятный момент. В общем, внешний вид отчета будет соответствовать внешнему виду таблицы динамического списка в момент получения схемы и настроек. В том числе и условному оформлению таблицы. Какие-то дополнительные действия понадобятся вам только в том случае, если вы захотите перенести в отчёт ещё и условное оформление формы.
Печать (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С, хотя эта возможность есть и ей нужно пользоваться. Вы можете просто указать таблицу, информация из которой вас интересует и 1С самостоятельно сформирует простейший запрос.
Чтобы посмотреть, как формируется динамический список и какие данные он показывает, необходимо открыть управляемые формы, где он расположен, в конфигураторе: в перечне реквизитов через контекстное меню открыть его свойства и обратить внимание на пункт «ПроизвольныйЗапрос». Если галка отсутствует, то параметр «Основная таблица» отражает таблицу БД, откуда берутся данные. В ином случае, динамический список отражает данные произвольного запроса, который можно увидеть, открыв настройку списка.
Намного чаще используется схема с произвольным запросом, так как это дает отличную возможность объединять и показывать самые разнообразные данные. Чаще всего этот механизм используется для отражения остатков на складах, цен номенклатуры, прихода, расхода или закупок. Пользоваться им нужно осторожно, так как быстродействие при сложных запросах может падать.
Еще одно полезное свойство динамического списка открывается при щелчке на надпись «Настройка списка». Это меню позволяет даже при использовании стандартного набора полей сделать информацию более доступной и понятной конечным пользователям. Вне зависимости от того, произвольный запрос или нет, вы увидите вкладку «Настройки», где сможете указать:
- Отбор динамического списка;
- Группировки;
- Сортировку;
- Оформление.
Использование параметров делает динамические списки универсальными и достаточно гибкими. Также вы можете связать их с реквизитами на управляемой форме, и данные будут меняться в зависимости от выбранных пользователем параметров. Использование этих механизмов можно понять и оценить при рассмотрении примеров реальных задач.
В качестве примера рассмотрим задачу по отражению на управляемой форме остатков номенклатуры. В реальной практике подобные заказы встречаются достаточно часто в различных конфигурациях, и динамический список идеально подходит в качестве инструмента. Для этой задачи нам придется использовать произвольный запрос, параметры динамического списка и его настройки.
Для большей наглядности создадим отдельную внешнюю обработку и разместим на ней динамический список. Чтобы реализовать задуманное, таблицы с номенклатурой будет мало, поэтому нам необходимо разрешить произвольный запрос. В нем мы опишем левое соединение справочника с перечнем номенклатуры и регистра остатков и установим справочник в качестве основной таблицы. Такая схема позволит пользователям, работая с динамическим списком, добавлять или изменять номенклатуру.
Так как в нашем запросе использовался параметр «ТекущаяДата», то нам необходимо задать его значение перед тем, как пользоваться обработкой. Для этого в модуле формы в процедуре «ПриСозданииНаСервере» стандартной командой присвоим ему функцию «ТекущаяДатаСеанса». Также нам необходимо вывести динамический список на управляющую форму и изменить порядок полей для наглядности. Перетаскиваем реквизит «ОстаткиНоменклатуры» в элементы формы (левая верхняя часть) и синими стрелками изменяем порядок полей в таблице на форме.
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ОстаткиНоменклатуры.Параметры.УстановитьЗначениеПараметра("ТекутаяДата",ТекущаяДатаСеанса()) КонецПроцедурыУже на этом этапе мы можем в 1С открыть нашу внешнюю обработку и увидеть, что динамический список работает. Мы можем смотреть остатки, создавать номенклатуру и группы, осуществлять поиск. Часто заказчики просят добавить возможность выбирать дату, на которую они будут видеть остатки. В случае формы с динамическим списком это обеспечивается за счет дополнительного поля и установки параметров с его помощью.
Добавляем реквизит «ДатаОстатков» типа «Дата» и переносим его в элементы формы. В событиях поля создаем событие «ПриИзменении» и прописываем код по установке параметра «ТекущаяДата», использующегося в динамическом запросе. Чтобы при открытии формы пользователь сразу понимал, на какую дату он видит остатки, внесем небольшие изменения в процедуру «ПриСозданииНаСервере».
В результате наша форма Динамический список может отражать остатки на любую дату.
Мы рассмотрели только малую часть возможностей этого инструментария, но и этого уже достаточно, чтобы понять удобство такого типа, как динамический список. Подобный механизм используется для множества задач, но наиболее часто его встречают в типовых конфигурациях в управляемых формах:
- Подбора;
- Списков.
Чтобы получить динамический список и его запрос в типовых управляемых формах, разработчику необходимо в конфигураторе открыть нужную форму. В разделе реквизитов найти реквизит с типом данных «ДинамическийСписок» (чаще всего он выделен жирным шрифтом). В его свойствах находится текст запроса, отборы и другие настройки.
Наконец-то осуществилась мечта любого «семерошника». Как часто пользователи программы 7.7 просили сделать нормальный подбор номенклатуры. Чтобы и остатки можно было видеть, и цены, и установить фильтры. Приходилось придумывать разные хитрости, вплоть до написания внешних компонентов. В 1С 8.2 появились динамические списки. Предлагаю рассмотреть, что это такое и что они нам могут дать в 1С 8.3.
За основу возьмем некую тестовую конфигурацию 1С:»Бухгалтерия предприятия 3.0″. Не будем сейчас делать подбор, просто в справочнике «Номенклатура» добавим еще одну форму выбора и сделаем ее временно основной:
При создании система по умолчанию добавит на форму табличное поле с типом «Динамический список».
Зайдем в его свойства и посмотрим, что там.
В первую очередь нас интересует флажок «Произвольный запрос». Он-то и откроет нам все преимущества динамического списка. У нас появится возможность написать собственный запрос, причем с параметрами. Устанавливаем флажок и нажимаем ссылку «Открыть»:
Откроется окно с уже готовым кодом на . Пока что там просто перечислены все поля справочника «Номенклатура».
Получите 267 видеоуроков по 1С бесплатно:
Как видим, имеется кнопка вызова « » и флажок, который дает возможность динамически изменять содержимое списка. То есть когда другой пользователь меняет что-то в справочнике, в нашем списке это тоже изменится. Кроме того, имеется закладка «Настройки», но ее мы коснемся позже.
Собственный запрос в динамическом списке
Сначала создадим нужный нам запрос с остатками и ценами. Примерно так:
Закладка «Настройки»
И вот теперь самое вкусное! Переходим на закладку «Настройки». И сразу видим, что на первой вкладке мы можем делать любые отборы по любому полю в запросе:
Программная установка параметров запроса в динамическом списке 1С 8.3
Не забываем, что в запросе у нас присутствуют два параметра: «Период» и «Тип цен». Мы должны передать их в запрос, иначе будет ошибка.
Пропишем эти параметры в параметрах формы, а в модуле формы добавим следующие строки:
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Список. Параметры. УстановитьЗначениеПараметра("Период" , Параметры. Дата) ; Список. Параметры. УстановитьЗначениеПараметра("ТипЦен" , Параметры. ТипЦен) ; КонецПроцедурыВ процессе доработки конфигураций каждый программист 1С сталкивается с динамическими списками.
Динамический список - это интерфейсный объект, использующийся для отображения различных списков объектов базы данных или необъектных данных - записей регистров.
Например, динамический список используется для отображения списка номенклатуры:
Для демонстрации возможностей динамического списка создадим внешнюю обработку, добавим основную форму. На форму добавим новый реквизит с типом «Динамический список». Зайдем в его свойства и посмотрим, что там.
Нас интересует свойство «Произвольный запрос». Его включение продемонстрирует нам все возможности динамического списка. Мы сможем написать запрос, используя практически все возможности языка запросов системы 1С: Предприятие. Устанавливаем флажок и нажимаем ссылку «Открыть»:
По умолчанию в наш список будут выводиться список номенклатуры с общим остатком по всем складам. Для реализации такого списка добавим следующий запрос:
В качестве основной таблицы выберем «Справочник.Номенклатура», это позволит нам работать с динамическим списком, как со списком номенклатуры - добавлять, изменять, помечать на удаление элементы справочника. Так же, установка основной таблицы делает доступным возможность динамического считывания данных - это означает, что выборка будет производиться порциями, по мере необходимости.
Далее необходимо создать элементы формы для нашего списка:
Если мы попробуем запустить нашу обработку в таком виде, то получим ошибку:
Для ее устранения необходимо установить значение параметру «Период». Для этого можно воспользоваться методом «УстановитьЗначениеПараметра» коллекции «Параметры» динамического списка. Метод принимает два параметра:
. «Параметр» - Тип: Строка; ПараметрКомпоновкиДанных. Имя параметра или параметр компоновки данных, значение которого нужно установить;
. «Значение» - Тип: Произвольный. Значение, которое нужно установить.
Может быть вызван в обработчике «ПриСозданииНаСервере» формы:
У вас есть вопрос, нужна помощь консультанта?
Предоставим пользователю возможность изменять период получения остатков. Для этого добавим реквизит и связанный с ним элемент формы «Дата»:
В обработчике «ПриИзменении» элемента формы «Дата» вызовем метод «УстановитьЗначениеПараметра», передав в качестве значения значение связанного реквизита. Аналогичным образом изменим процедуру «ПриСозданииНаСервере» формы. Так как метод доступен на клиенте, вызов сервера не потребуется:
Теперь при изменении даты, будут автоматически обновляться остатки:
Предположим, что пользователи хотят видеть либо текущие остатки, либо планируемые поступления. Рассмотрим один из вариантов реализации. Добавим реквизит формы булевого типа и связанный с ним переключатель:
При изменении значения переключателя будем менять текст запроса. Для этого воспользуемся обработчиком события «ПриИзменении» элемента формы «ОтображатьКоличествоКПоступлению». Нам необходимо изменить свойство «ТекстЗапроса» динамического списка в зависимости от значения реквизита. Так как данное свойство недоступно на клиенте необходим вызов серверной процедуры:
Результат внесенных изменений: