1с реквизит табличной части в динамический список

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

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

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

Отбор в динамическом списке по реквизиту табличной части элемента

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

  1. В свойствах реквизита Список на управляемой форме установим флаг Произвольного запроса и перейдем в Настройку списка. Для наглядности для появившегося запроса можно открыть конструктор запросов.
    Отбор в динамическом списке по реквизиту табличной части элемента
  2. В конструкторе запросов необходимо убрать из полей выборки все табличне части. Вместо этого добавим табличную часть, по реквизиту которой необходимо делать отбор, в источники запроса (таблицы).
    Отбор в динамическом списке по реквизиту табличной части элемента
  3. Далее левым соединением соединяем табличные части с самим документом.
    Отбор в динамическом списке по реквизиту табличной части элемента
  4. И делаем группировку по всем полям (хотя можно и использовать ВЫБРАТЬ РАЗЛИЧНЫЕ).
    Отбор в динамическом списке по реквизиту табличной части элемента
  5. На вкладке Компановка данных — Таблицы снимаем флаг Обязательно для табличной части. Это нужно для того, чтобы соединение выполнялось не всегда, а только если используется отбор. Таким образом экономятся ресурсы и ускоряется работа конфигурации.
    Отбор в динамическом списке по реквизиту табличной части элемента
    На вкладке Компановка данных — Условия создаем необходимые условия отбора по необходимым реквизитам табличной части.
    Отбор в динамическом списке по реквизиту табличной части элемента
  6. Сохраняем запрос и переходим на вкладку Настройка. Там можно сразу добавить необходимые условия отбора, чтобы пользователям самим не приходилось каждый раз выбирать поля. Не забудьте снять флаги с полей отбора, иначе при открытии формы списка условие отбора будет сразу применено.

Отбор в динамическом списке по реквизиту табличной части элемента

Отбор в динамическом списке по реквизиту табличной части элемента

Вывод табличной части в динамический список

Я
   Черный всадник

28.12.15 — 02:34

Доброго времени суток.

Есть справочник Исполнители, у него есть табличная часть ресурсы (две колонки: тип ресурса и сотрудник). Надо вывести сотрудников из ресурсов в колонку динамического списка. Подскажите, пожалуйста, возможно ли это в 1С, если да, то как это сделать? Заранее спасибо.

  

Партнерская программа EFSOL Oblako

   Сильф

1 — 28.12.15 — 02:42

(0) Возможно. Запросом.

   Сильф

2 — 28.12.15 — 02:46

(0) У динамического списка ставим флажок «Произвольный запрос», «Настройка списка» -> «Открыть», пишем свой запрос, поля из этого запроса автоматически подтянутся как колонки дин. списка. Вкратце так.

   Черный всадник

3 — 28.12.15 — 03:38

(1, 2) Мне не удалось найти способа свернуть табличную часть справочника в одно поле в запросе. Должен получиться список вида:

Исполнитель | Сотрудники

Бригада 1   | Иванов, Петров, Сидоров

Бригада 2   | Колобок, Степашка, Филин

На SQL я бы использовал такую конструкцию:

SELECT

    ExecutorId

    , (SELECT

           array_to_string(

             array_agg(tn.Name), ‘, ‘)

         FROM

           (SELECT

                e.Name

              FROM

                ExecutorsResourceLines erl

                LEFT JOIN Employee e ON e.Id = erl.Employee

              WHERE erl.ExecutorId = Executors.Id

              ORDER BY erl.!Name) tn

       )

  FROM

    Executors

   Nuobu

4 — 28.12.15 — 05:52

(3) Задай реквизит в «Бригаде», куда «ПередЗАписью» пиши своих сотрудников и уже их вытаскивай в динамический список.

   Черный всадник

5 — 28.12.15 — 23:53

(4) Это решение имеет несколько недостатка — растёт объём базы, записанные в дополнительный реквизит значения могут поменяться и надо обновить исполнителей. Конкретно для таблицы исполнителей это не критично, но для системы в целом это будет эффект разбитого окна (рано или поздно этот пример перенесут на таблицу где эти недостатки будут критичны), поэтому хотелось бы сделать сразу по уму. Как я понял в 1С это похоже единственный вариант. Спасибо.

   vicof

6 — 28.12.15 — 23:58

(5) Можешь извратиться, Написать свой запрос в СКД, оттуда выгрузить в таблицу, а на динамический список вообще забить.

   kosts

7 — 29.12.15 — 07:20

(5) Добавь в динамический список несколько колонок (штук 10 к примеру). Размести их в группе одно под другим.

В каждую колонку получай из запроса по одному исполнителю из одной конкретной строки ТЧ.

В условном оформлении скрывай колонки в которых нет исполнителей.

В последней колонке выводи многоточие, если исполнителей больше 10.

Я думаю вполне жизнеспособный вариант.

   МимохожийОднако

8 — 29.12.15 — 07:30

(5)По твоим словам, любой новый документ или реквизит ведёт к росту базы. Однако не просто так в ЗУПе пошли именно таким путём.

  

Черный всадник

9 — 29.12.15 — 10:25

(7) Интересный вариант, не смотря на большое количество левых соединений, выборка должна происходить быстро поскольку за раз отображается небольшое количество записей. Спасибо.

(8) Именно так. Платформа 1С сильно ограничена по возможностям. Выбрать оптимальное решение достаточно сложно. А типовые конфигурации пишут такие же люди как мы с вами, и случается используют далеко не лучшие способы решения задач.


Добавление доп. реквизита в динамический список программно

Добавление доп. реквизита в динамический список программно

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

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

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

Получившейся код модуля:

&НаКлиенте
Процедура dev_ПриОткрытииПосле(Отказ)
	
	ОтображениеДополнительныхРеквизитов();
	
КонецПроцедуры

&НаСервере
Процедура ОтображениеДополнительныхРеквизитов()
		
	// Получаем набор свойств объекта по пустой ссылке объекта метаданных.
	НаборСвойств = УправлениеСвойствамиСлужебный.ПолучитьНаборыСвойствОбъекта(Справочники.Номенклатура.ПустаяСсылка());
		
	// Инициализируем имя набора свойств. 
	ИмяНабора = НаборСвойств[0].Набор.Наименование;     
	Свойства  = НаборСвойств[0].Набор.ДополнительныеРеквизиты.Выгрузить().ВыгрузитьКолонку("Свойство");
	
	// Наполняем массив именами доп.реквизитов, которые мы хотим отобразить в списке формы. 
	// Можно создать отдельную настроку, например регистр где будем хранить выводимые поля,
	// для конкретных объектов метаданных или даже в зависимости от роли.
	МассивОтображаемыхСвойств = Новый Массив;
	МассивОтображаемыхСвойств.Добавить("Краткое описание");
	// и т.д.
	
	// Если например у нас полные права то выведем все доп.реквизиты.
	Если РольДоступна("ПолныеПрава") Тогда   
		МассивОтображаемыхСвойств = ПолучитьМассивНаименованийСвойств(Свойства);
	КонецЕсли;
	
	// Квадратные скобки обязательны.
	// Именно так платформа понимает что мы обращаемся к реквизиту ТЧ "ДополнительныеРеквизиты" 
	ШаблонПутьКДанным = "Список.Ссылка.[%1 (%2)]";	 
	
	// Обход циклом свойств для вывода в список.
	Для каждого ТекущееСвойство Из Свойства Цикл
		
		НаименованиеСвойства = ТекущееСвойство.Наименование; 
		ИмяЭлемента = ТекущееСвойство.ИдентификаторДляФормул; 
		
		Если  МассивОтображаемыхСвойств.Найти(НаименованиеСвойства) <> Неопределено Тогда
			СтрокаДанные = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонПутьКДанным, НаименованиеСвойства, ИмяНабора); 					
			НовыйЭлемент = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), Элементы.Список);
			НовыйЭлемент.Вид 			= ВидПоляФормы.ПолеВвода;
			НовыйЭлемент.ПутьКДанным 	= СтрокаДанные;
			НовыйЭлемент.Заголовок 		= НаименованиеСвойства;	  
		КонецЕсли;  
		
	КонецЦикла; 
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьМассивНаименованийСвойств(МассивСвойств) 

	МассивНаименований = Новый Массив;
	Для каждого Свойство Из МассивСвойств Цикл	
		МассивНаименований.Добавить(Свойство.Наименование);
	КонецЦикла;
	
	Возврат МассивНаименований;
	
КонецФункции;

Данный код проверялся на конфигурации «Бухгалтерия предприятия 3.0», но он подойдет для любой конфигурации.

Как результат работы нашего кода прикладываем скриншот и тестовое расширение конфигурации:

6.png - ITsale

Как видим все доп. реквизиты появились в нашем списке.

Для подключения расширения использовались такие надстройки:

7.png - ITsale

Скачать расширение

Оставить заявку на бесплатную консультацию прямо сейчас!


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

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 (описание способов приведено выше).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Рис.2 Окно настройки
Рис.2 Окно настройки

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

Рис.3 На вкладке «Отбор»
Рис.3 На вкладке «Отбор»

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

Отбор также можно группировать по логическим условиям «И», «ИЛИ».

Рис.4 Отбор также можно группировать по логическим условиям «И», «ИЛИ»
Рис.4 Отбор также можно группировать по логическим условиям «И», «ИЛИ»

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

Рис.5 Поля быстрых отборов
Рис.5 Поля быстрых отборов

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

Рис.6 Группа пользовательских настроек
Рис.6 Группа пользовательских настроек

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

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

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

Фиксированный отбор

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

Рис.7 Фиксированный отбор
Рис.7 Фиксированный отбор

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

Рис.8 Окно динамического списка
Рис.8 Окно динамического списка

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

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

Рис.9 Настроить список
Рис.9 Настроить список

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

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

Методы

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


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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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


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

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

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


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

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

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

Рис.10 Отбор в динамическом списке
Рис.10 Отбор в динамическом списке

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

Рис.11 Условие «ГДЕ Истина»
Рис.11 Условие «ГДЕ Истина»

…в коде:


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

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


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

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

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

…в коде:


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

где ФИО – массив.

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

Добавление выбранного поля

Пример добавления выбранного поля:

Копировать в буфер обмена

// Добавим выбранное поле для вывода в отчет.
ВыбранноеПоле = Настройки.Выбор.Элементы.Добавить(Тип(«ВыбранноеПолеКомпоновкиДанных»));
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных(«КоличествоОстаток»);

В данном примере в список выбранных полей было добавлено поле КоличествоОстаток.

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

Пример:

  // Создадим группу полей, для того, чтобы выводить в ней склад в раздельных колонках.
 ГруппаПолей = Настройки.Выбор.Элементы.Добавить(Тип("ГруппаВыбранныхПолейКомпоновкиДанных"));
 // Установим шапку группы полей.
 ГруппаПолей.Заголовок = "Реквизиты склада";
 // Укажем размещение.
 ГруппаПолей.Расположение = РасположениеПоляКомпоновкиДанных.Горизонтально;
 
 // Добавим выбранное поле в группу для вывода в отчет.
 ВыбранноеПоле = ГруппаПолей.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
 ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Склад");
 
 // Добавим выбранное поле  в группу для вывода в отчет.
 ВыбранноеПоле = ГруппаПолей.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
 ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Склад.Код");
 // Установим заголовок поля.
 ВыбранноеПоле.Заголовок = "Код";

В данном примере создана группа выбранных полей, в нее помещено два поля. Группе указано, каким образом располагать поля, вложенные в нее. Для поля Склад.Код установлен заголовок.

Добавление отбора

Пример добавления элемента отбора:

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

В данном примере в отчет добавлен элемент отбора с видом сравнения «В Группе».

В отбор можно добавлять сложные условия. Делается это при помощи групп элементов отбора.

Пример добавления группового условия:

Копировать в буфер обмена

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

В данном примере добавлено условие КоличествоОстаток >= 100 И КоличествоОстаток <=200.

Добавление упорядочивания

Пример добавления упорядочивания:

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

В данном примере показано добавление упорядочивания по полю КоличествоОстаток в убывающем порядке.

Установка параметров вывода

Пример установки параметров вывода:

 // Установим макет оформления.
 ЭлементОформления = Настройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("МакетОформления"));
 ЭлементОформления.Использование = Истина;
 ЭлементОформления.Значение = "Море";
 
 // Укажем, что отбор не нужно выводить в отчет.
 ЭлементОформления = Настройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ВыводитьОтбор"));
 ЭлементОформления.Использование = Истина;
 ЭлементОформления.Значение = ТипВыводаТекстаКомпоновкиДанных.НеВыводить;

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

Добавление условного оформления

Пример добавления условного оформления:

// Добавим условное оформление.
 ЭлементУсловногоОформления = Настройки.УсловноеОформление.Элементы.Добавить();
 
 // Создадим условие оформления.
 ГруппаЭлементовОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
 ГруппаЭлементовОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
 
 ЭлементОтбора = ГруппаЭлементовОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
 ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("КоличествоОстаток");
 ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
 ЭлементОтбора.ПравоеЗначение = 100;
 
 ЭлементОтбора = ГруппаЭлементовОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
 ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("КоличествоОстаток");
 ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
 ЭлементОтбора.ПравоеЗначение = 200;
 
 // Укажем цвет.
 ЭлементОформления = ЭлементУсловногоОформления.Оформление.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ЦветТекста"));
 ЭлементОформления.Использование = Истина;
 ЭлементОформления.Значение = Новый Цвет(255, 0, 0);
 
 // Укажем, что оформление нужно применять только к одному полю.
 ОформляемоеПоле = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
 ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("КоличествоОстаток");

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

Добавление группировки

Пример добавление группировки:

 // Добавим новую группировку в структуру отчета.
Группировка = Настройки.Структура.Добавить(Тип(«ГруппировкаКомпоновкиДанных»));

// Укажем, по каким полям нужно группировать.
ПолеГруппировки = Группировка.ПоляГруппировки.Элементы.Добавить(Тип(«ПолеГруппировкиКомпоновкиДанных»));
ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных(«Номенклатура»);

// Укажем тип иерархии.
ПолеГруппировки.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Иерархия;

В данном примере добавлена группировка по полю Номенклатура с иерархией.

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

Пример добавления автополей в порядок и выбранные поля.

Копировать в буфер обмена

 // Укажем, что поля, которые нужно выводить в группировке, система должна определять самостоятельно.
Группировка.Выбор.Элементы.Добавить(Тип(«АвтоВыбранноеПолеКомпоновкиДанных»));

// Укажем, что системе необходимо самостоятельно определять порядок, в котором выводить группировку.
Группировка.Порядок.Элементы.Добавить(Тип(«АвтоЭлементПорядкаКомпоновкиДанных»));

Добавление детальных записей

Детальные записи являются группировкой, в которой отсутствуют поля группировки.

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

Копировать в буфер обмена

// Добавим в отчет детальные записи, вложенные в группировку.
ДетальныеЗаписи = Группировка.Структура.Добавить(Тип(«ГруппировкаКомпоновкиДанных»));

// Укажем, что поля, которые нужно выводить в детальных записях, система должна определять самостоятельно.
ДетальныеЗаписи.Выбор.Элементы.Добавить(Тип(«АвтоВыбранноеПолеКомпоновкиДанных»));

// Укажем, что системе необходимо самостоятельно определять порядок, в котором выводить детальные записи.
ДетальныеЗаписи.Порядок.Элементы.Добавить(Тип(«АвтоЭлементПорядкаКомпоновкиДанных»));

// Добавим детальным записям оформление.
ЭлементУсловногоОформления = ДетальныеЗаписи.УсловноеОформление.Элементы.Добавить();
// Укажем наклонный шрифт.
ЭлеменОформления = ЭлементУсловногоОформления.Оформление.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(«Шрифт»));
ЭлеменОформления.Использование = Истина;
ЭлеменОформления.Значение = Новый Шрифт(,,, Истина);

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

Добавление диаграммы

Пример добавления диаграммы:

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

 // Укажем, по какому полю нужно группировать в серии.
 ПолеГруппировки = Серия.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
 ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Склад");
 
 // Укажем, что система сама должна определять, какие поля нужно выводить в серии.
 Серия.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
 
 // Укажем каким образом нужно упорядочивать данные серии
 ЭлементПорядка = Серия.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
 ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных("Склад");

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

Добавление таблицы

Пример добавления таблицы:

// Добавим в отчет таблицу
 Таблица = Настройки.Структура.Добавить(Тип("ТаблицаКомпоновкиДанных"));
 
 // Добавим в таблицу строку
 Строка = Таблица.Строки.Добавить();
 // Укажем, что система сама должна определять, какие поля нужно выводить в группировке
 Строка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
 // Укажем, что системе необходимо самостоятельно определять порядок, в котором выводить группировку
 Строка.Порядок.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных"));
 // Укажем, по какому полю нужно группировать
 ПолеГруппировки = Строка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
 ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Номенклатура");
 
 // Добавим в таблицу колонку
 Колонка = Таблица.Колонки.Добавить();
 // Укажем, что система сама должна определять, какие поля нужно выводить в группировке
 Колонка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
 // Укажем, что системе необходимо самостоятельно определять порядок, в котором выводить группировку
 Колонка.Порядок.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных"));
 // Укажем, по какому полю нужно группировать
 ПолеГруппировки = Колонка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
 ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Склад");

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

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

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

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

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

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

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

Рис.1 Настроить список
Рис.1 Настроить список

 

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

Рис.2 Окно настройки
Рис.2 Окно настройки

 

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

Рис.3 На вкладке «Отбор»
Рис.3 На вкладке «Отбор»

 

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

Отбор также можно группировать по логическим условиям «И», «ИЛИ».

Рис.4 Отбор также можно группировать по логическим условиям «И», «ИЛИ»
Рис.4 Отбор также можно группировать по логическим условиям «И», «ИЛИ»

 

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

Рис.5 Поля быстрых отборов
Рис.5 Поля быстрых отборов

 

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

Рис.6 Группа пользовательских настроек
Рис.6 Группа пользовательских настроек

 

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

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

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

Фиксированный отбор

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

Рис.7 Фиксированный отбор
Рис.7 Фиксированный отбор

 

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

Рис.8 Окно динамического списка
Рис.8 Окно динамического списка

 

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

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

Рис.9 Настроить список
Рис.9 Настроить список

 

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

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

Методы

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


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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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


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

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

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


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

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

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

Рис.10 Отбор в динамическом списке
Рис.10 Отбор в динамическом списке

 

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

Рис.11 Условие «ГДЕ Истина»
Рис.11 Условие «ГДЕ Истина»

 

…в коде:


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

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


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

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

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

…в коде:


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

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

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

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

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

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

В моем примере динамический список создан на основной форме обработки.

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

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

Динамический список 1С — основная таблица

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

 Основная таблица динамического списка 1C

Например, в качестве основной таблицы выберем справочник Номенклатура.

 Основная таблица динамического списка 1C

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

Основная таблица динамического списка 1C

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

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

Можно сделать отображение списка в виде дерева. Для этого можно изменить режим просмотра таблицы на форме в пользовательском режиме.

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

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

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

После этого, динамический список на форме будет в виде дерева.

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

Произвольный запрос динамического списка 1С

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

Чтобы посмотреть на запрос, следует нажать на гиперссылку Открыть свойства НастройкаСписка.

Произвольный запрос динамического списка 1С

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

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

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

Произвольный запрос динамического списка 1С

Свяжем левым соединением таблицу номенклатуры с виртуальной таблицей СрезПоследних регистра сведений.

Произвольный запрос динамического списка 1С

И исправим имя поля Цена.

Произвольный запрос динамического списка 1С

Наш запрос готов.

Произвольный запрос динамического списка 1С

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

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

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

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

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

Управляемое приложение 1С 8.3

Очень подробно работа с динамическими списками дается в моей книге «Основы разработки в 1С: Такси».

В этой книге вы научитесь:

  • Настраивать динамические списки;
  • Работать с поиском в динамическом списке;
  • Программировать динамические списки (программная установка параметров, отборов, группировок, сортировок и условного оформления).

У вас, как у читателя блога, есть скидка 15 % по промо-коду:  48PVXHeYu

Более подробно о работе с другими интересными объектами языка программирования в 1С читайте в моей книге «Программировать в 1С за 11 шагов»

Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

  1. Книга написана понятным и простым языком — для новичка.
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Научитесь понимать архитектуру 1С;
  4. Станете писать код на языке 1С;
  5. Освоите основные приемы программирования;
  6. Закрепите полученные знания при помощи задачника;

Книга «Основы разработки в 1С: Такси»

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

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu


Если Вы всё еще «плаваете» в конструкциях языка запросов, и у Вас вызывают трудности даже самые простые запросы, то рекомендую вам мой курс «Запросы в 1С от новичка до профи». Где эти и многие другие вопросы рассматриваются более подробно.

В чем особенность этого курса:
• Курс рассчитан на тех, кто не знаком с языком запросов в 1С;
• Учебный материал грамотно скомпонован и прост в освоении;
• Несколько десятков уроков;
• Полезные практические примеры;
• Все уроки изложены понятным и простым языком

Для моих читателей, купон на скидку 25%: hrW0rl9Nnx


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

можно оплатить вручную:

Яндекс.Деньги — 410012882996301
Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

Понравилась статья? Поделить с друзьями:
  • 1с сообщение пользователю с указанием на реквизит
  • 1с стандартные реквизиты справочника в расширение
  • 1с управляемая форма реквизит использовать всегда
  • 1с управляемые формы получить реквизит на клиенте
  • 200 тысяч на открытие бизнеса от государства 2022