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

Динамический список 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

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

Я
   Demanufactyre

30.11.18 — 18:39

Доброго времени суток товарищи. Подскажите такой момент. У меня в форме списка есть несколько списков. Там при открытии есть некие условия, при которых одни списки становятся невидимыми, а другие становятся видимыми. Все зависит от того, на каком устройстве запускается (компьютер, мобильная платформа или браузер).

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

Все уже перекопал. Не хватает мозгов, помогите пожалуйста.

Управляемые формы.

  

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

   Demanufactyre

1 — 30.11.18 — 18:51

Надеюсь понятно написал=)

   RomanYS

2 — 30.11.18 — 18:54

не, не понятно.

«основной реквизит» это у формы, таблицы что-то вроде «основная таблица». Или это про другое?

   Demanufactyre

3 — 30.11.18 — 19:08

(2) Вот пример

https://c.radikal.ru/c03/1811/eb/3807a77e9b4a.png

   hhhh

4 — 30.11.18 — 19:26

(3) посмотрел бы типовые, как сделано. Несколько форм списка, при открытии выбираешь нужную форму.

   Радим1987

5 — 30.11.18 — 19:31

Если не  ошибаюсь этот реквизит устанавливается только в конфигураторе, так что метод (4)

   Demanufactyre

6 — 30.11.18 — 19:46

(4) Я смотрел в типовых. Либо там еще не реализовано, либо я где-то просмотрел.

   hhhh

7 — 30.11.18 — 20:04

(6) видимо просмотрел. потому что там невозможно не заметить.

   RomanYS

8 — 30.11.18 — 20:20

(3) и какой эффект ожидается от смены основного реквизита& Кроме заполнения командной панели формы

   Demanufactyre

9 — 01.12.18 — 06:56

(8) Заполнение командной панели и ожидается

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

10 — 01.12.18 — 07:57

(0) «У меня в форме списка есть несколько списков»

расшифруй

   Demanufactyre

11 — 01.12.18 — 08:13

(10) Список один, список два, список три (Все эти списки динамические. Находятся они в ФормеСписка

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

12 — 01.12.18 — 08:24

(11) в (4) предложили сделать несколько форм списка.

Попробуй сделать 3 формы списка и одну общую, которая при открытии перенаправляет на ту, которая зависит от устройства

   АНДР

13 — 01.12.18 — 09:25

+12 Сейчас у тебя в форме все списки заполняются, что ее заметно утяжеляет. А и на мобильной платформе или браузере такой подход не спасет

   lucbak

14 — 01.12.18 — 09:54

(0) дин.список на форме сделай один + добавь закладки (страница) столько сколько дин.списков тебе надо. При переключении закладки (страницы) переноси туда дин.список — будет ощущение, что на каждой закладке свой дин.список.

  

Demanufactyre

15 — 01.12.18 — 11:58

(12) Спасибо. Сделал две ФормыСписка и сделал условие, где для каждого устройства выходит та или иная форма.

TurboConf — расширение возможностей Конфигуратора 1С

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

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С Предприятии 8.2 формы списка объектов конфигурации построены с помощью динамического списка. Например, форма списка справочника Номенклатура содержит основной реквизит типа ДинамическийСписок, отображающий основную таблицу Справочник.Номенклатура и динамический список формируется путем запроса к этой таблице.

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

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

Создадим форму списка справочника Номенклатура и откроем палитру свойств основного реквизита формы Список. Установим флаг ПроизвольныйЗапрос и в строке Настройка списка нажмем Открыть.


 

В поле Запрос введем следующий текст запроса:

ВЫБРАТЬ
   СправочникНоменклатура.Код,
   СправочникНоменклатура.Наименование,
   ЦеныСрезПоследних.Цена
ИЗ
   Справочник.Номенклатура КАК СправочникНоменклатура
      ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних КАК ЦеныСрезПоследних
      ПО ЦеныСрезПоследних.Номенклатура = СправочникНоменклатура.Ссылка 

Теперь перетащим поле Цена из окна реквизитов в окно элементов формы.


 

 В результате мы получим список номенклатуры, содержащий её актуальную цену.


Скачать демонстрационный пример (платформа 8.2.15.310). 

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

Возможности динамических списков в 1С

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

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

Рис.1 Возможности динамических списков
Рис.1 Возможности динамических списков

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

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

  • Отбор динамического списка;
  • Группировки;
  • Сортировку;
  • Оформление.

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

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

Пример использования динамического списка

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

Рис.2 Пример использования динамического списка
Рис.2 Пример использования динамического списка
Рис.3 Пример использования динамического списка
Рис.3 Пример использования динамического списка

ВЫБРАТЬ
     НоменклатураПеречень.Наименование КАК Наименование,
     ТоварыНаСкладахОстатки.Склад КАК Склад,
     ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток
ИЗ
     Справочник.Номенклатура КАК НоменклатураПеречень
             ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&ТекухцаяДата, ) КАК ТоварыНаСкладахОстатки
             ПО НоменклатураПеречень.Ссылка = ТоварыНаСкладахОстатки.Номенклатура
ГДЕ

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
      ОстаткиНоменклатуры.Параметры.УстановитьЗначениеПараметра("ТекутаяДата",ТекущаяДатаСеанса() )
КонецПроцедуры
Рис.4 Синими стрелками изменяем порядок полей в таблице на форме
Рис.4 Синими стрелками изменяем порядок полей в таблице на форме

Уже на этом этапе мы можем в 1С открыть нашу внешнюю обработку и увидеть, что динамический список работает. Мы можем смотреть остатки, создавать номенклатуру и группы, осуществлять поиск. Часто заказчики просят добавить возможность выбирать дату, на которую они будут видеть остатки. В случае формы с динамическим списком это обеспечивается за счет дополнительного поля и установки параметров с его помощью.

Добавляем реквизит «ДатаОстатков» типа «Дата» и переносим его в элементы формы. В событиях поля создаем событие «ПриИзменении» и прописываем код по установке параметра «ТекущаяДата», использующегося в динамическом запросе. Чтобы при открытии формы пользователь сразу понимал, на какую дату он видит остатки, внесем небольшие изменения в процедуру «ПриСозданииНаСервере».

Рис.5 Внесем небольшие изменения в процедуру «ПриСозданииНаСервере»
Рис.5 Внесем небольшие изменения в процедуру «ПриСозданииНаСервере»
Рис.6 Внесем небольшие изменения в процедуру «ПриСозданииНаСервере»
Рис.6 Внесем небольшие изменения в процедуру «ПриСозданииНаСервере»

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
       ДатаОстатков = ТекущаяДатаСеанса();
       ОстаткиНоменклатуры.Параметры.УстановитьЗначениеПараметра("ТекущаяДата", ДатаОстатков);
КонецПроцедуры

&НаКлиенте
Процедура ДатаОстатковПриИзменении(Элемент)
      ОстаткиНоменклатуры.Параметры.УстановитьЗначениеПараметра("ТекущаяДата",ДатаОстатков);
КонецПроцедуры

В результате наша форма Динамический список может отражать остатки на любую дату.

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

  1. Подбора;
  2. Списков.

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

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

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

Содержание

  1. Задача
  2. Решение
  3. Создание страниц
  4. Перемещение элементов формы
  5. Программное создание динамического списка
  6. Небольшая хитрость
  7. Результат

Задача

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

Решение

План работ следующий:

  1. Создать страницы на форме;
  2. Переместить типовой динамический список на нужную страницу;
  3. Создать динамический список и вывести его на нужную страницу.

Далее будет показан код по логическим блокам, в конце статьи будет представлен итоговый код

Создание страниц

Собственно создадим группу с видом «Страницы», и в нее добавим две группы с видом «Страница»

    Страницы = Элементы.Добавить("Страницы",	Тип("ГруппаФормы"),  ЭтаФорма);
    Страницы.Вид                = ВидГруппыФормы.Страницы;
    Страницы.Заголовок          = "Страницы";
	
    Страница_1 = Элементы.Добавить("Страница_1", Тип("ГруппаФормы"), Страницы);
    Страница_1.Вид              = ВидГруппыФормы.Страница;
    Страница_1.Заголовок        = "Страница 1";
	
    Страница_2 = Элементы.Добавить("Страница_2", Тип("ГруппаФормы"), Страницы);
    Страница_2.Вид              = ВидГруппыФормы.Страница;
    Страница_2.Заголовок        = "Страница 2";

Программное формирование реквизитов и элементов формы можно в статье 1С. Программное добавление и удаление реквизитов формы

Перемещение элементов формы

Для перемещения типового динамического списка воспользуемся методом коллекции элементов формы Переместить()

    Элементы.Переместить(Элементы.Список, Страница_1);

Программное создание динамического списка

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

    // Создадим реквизит формы динамическог списка
    ДобавляемыеРеквизиты	= Новый Массив;
	
    ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Список_Альтернативный", Новый ОписаниеТипов("ДинамическийСписок")));
	
    ИзменитьРеквизиты(ДобавляемыеРеквизиты);
	
    // Опишем параметры динамического списка	
    ЭтаФорма.Список_Альтернативный.ПроизвольныйЗапрос   = Истина;
    ЭтаФорма.Список_Альтернативный.ТекстЗапроса         =
    "ВЫБРАТЬ
    |	Спр_Номенклатура.Ссылка КАК Ссылка,
    |	Спр_Номенклатура.Код КАК Код,
    |	Спр_Номенклатура.Наименование КАК Наименование,
    |	Спр_Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
    |	Спр_Номенклатура.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа,
    |	ЕСТЬNULL(ДанныеДляОбработки.Обработан, ЛОЖЬ) КАК Обработан,
    |	ЕСТЬNULL(ДанныеДляОбработки.ОшибкаПриОбработке, ЛОЖЬ) КАК ОшибкаПриОбработке
    |ИЗ
    |	Справочник.Номенклатура КАК Спр_Номенклатура
    |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеДляОбработки КАК ДанныеДляОбработки
    |		ПО (ДанныеДляОбработки.Номенклатура = Спр_Номенклатура.Ссылка)";
	
    ЭтаФорма.Список_Альтернативный.ОсновнаяТаблица = "Справочник.Номенклатура";

Теперь создадим элементы формы относящиеся к динамическому списку

    //Создание элементов формы
    эл_Список = Элементы.Добавить("Список_Альтернативный", Тип("ТаблицаФормы"), Страница_2);
    эл_Список.ПутьКДанным                    = "Список_Альтернативный";
    эл_Список.Отображение                    = ОтображениеТаблицы.Список;
    эл_Список.ПоложениеУправленияПоиском     = ПоложениеУправленияПоиском.Нет;
    эл_Список.ПоложениеУправленияПоиском     = ПоложениеУправленияПоиском.Нет;
    эл_Список.ПоложениеСостоянияПросмотра    = ПоложениеСостоянияПросмотра.Нет;
    эл_Список.ПоложениеСтрокиПоиска          = ПоложениеСтрокиПоиска.Нет;
    эл_Список.ПоложениеКоманднойПанели       = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
    
    НоваяКолонка = Элементы.Добавить("Список_Альт_Ссылка", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.Ссылка";
    НоваяКолонка.Видимость                  = Ложь;
    
    НоваяКолонка = Элементы.Добавить("Список_Альт_ПометкаУдаления", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.ПометкаУдаления";
    НоваяКолонка.Видимость                  = Ложь;
    
    НоваяКолонка = Элементы.Добавить("Список_Альт_Код", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.Код";
    
    НоваяКолонка = Элементы.Добавить("Список_Альт_Наименование", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.Наименование";
    НоваяКолонка.Ширина                     = 20;
    НоваяКолонка.РастягиватьПоГоризонтали   = Ложь;
    
    НоваяКолонка = Элементы.Добавить("Список_Альт_Обработан", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.Обработан";
    НоваяКолонка.Вид                        = ВидПоляФормы.ПолеФлажка;
    
    НоваяКолонка = Элементы.Добавить("Список_Альт_ОшибкаПриОбработке", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.ОшибкаПриОбработке";
    НоваяКолонка.Заголовок                  = "Ошибка";
    НоваяКолонка.Вид                        = ВидПоляФормы.ПолеФлажка;
    
    НоваяКолонка = Элементы.Добавить("Список_Альт_НоменклатурнаяГруппа", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.НоменклатурнаяГруппа";

Небольшая хитрость

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

    ЭтаФорма.Список_Альтернативный.УстановитьОбязательноеИспользование("Ссылка", Истина);

Результат

Теперь проверяем, что у нас получилось. Первая страница, на которую мы перенесли типовой список

Программное создание динамического списка

Вторая страница с нашим сформированным списком

Программное создание динамического списка

И результирующий код:

#Область ОбработчикиСобытийформы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    #Область СозданиеСтраниц
    
    Страницы = Элементы.Добавить("Страницы",    Тип("ГруппаФормы"),  ЭтаФорма);
    Страницы.Вид                = ВидГруппыФормы.Страницы;
    Страницы.Заголовок          = "Страницы";
    
    Страница_1 = Элементы.Добавить("Страница_1", Тип("ГруппаФормы"), Страницы);
    Страница_1.Вид              = ВидГруппыФормы.Страница;
    Страница_1.Заголовок        = "Страница 1";
    
    Страница_2 = Элементы.Добавить("Страница_2", Тип("ГруппаФормы"), Страницы);
    Страница_2.Вид              = ВидГруппыФормы.Страница;
    Страница_2.Заголовок        = "Страница 2";
    
    #КонецОбласти
    
    #Область ПеремещениеТиповогоДинамическогоСписка
    
    Элементы.Переместить(Элементы.Список, Страница_1);
    
    #КонецОбласти
    
    #Область СозданиеДинамическогоСписка
    
    // Создадим реквизит формы динамическог списка
    ДобавляемыеРеквизиты    = Новый Массив;
    
    ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Список_Альтернативный", Новый ОписаниеТипов("ДинамическийСписок")));
    
    ИзменитьРеквизиты(ДобавляемыеРеквизиты);
    
    // Опишем параметры динамического списка    
    ЭтаФорма.Список_Альтернативный.ПроизвольныйЗапрос   = Истина;
    ЭтаФорма.Список_Альтернативный.ТекстЗапроса         =
    "ВЫБРАТЬ
    |    Спр_Номенклатура.Ссылка КАК Ссылка,
    |    Спр_Номенклатура.Код КАК Код,
    |    Спр_Номенклатура.Наименование КАК Наименование,
    |    Спр_Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
    |    Спр_Номенклатура.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа,
    |    ЕСТЬNULL(ДанныеДляОбработки.Обработан, ЛОЖЬ) КАК Обработан,
    |    ЕСТЬNULL(ДанныеДляОбработки.ОшибкаПриОбработке, ЛОЖЬ) КАК ОшибкаПриОбработке
    |ИЗ
    |    Справочник.Номенклатура КАК Спр_Номенклатура
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеДляОбработки КАК ДанныеДляОбработки
    |        ПО (ДанныеДляОбработки.Номенклатура = Спр_Номенклатура.Ссылка)";
    
    ЭтаФорма.Список_Альтернативный.ОсновнаяТаблица = "Справочник.Номенклатура";
    
    // Установка обязательного использования
    ЭтаФорма.Список_Альтернативный.УстановитьОбязательноеИспользование("Ссылка", Истина);
    
    //Создание элементов формы
    эл_Список = Элементы.Добавить("Список_Альтернативный", Тип("ТаблицаФормы"), Страница_2);
    эл_Список.ПутьКДанным                    = "Список_Альтернативный";
    эл_Список.Отображение                    = ОтображениеТаблицы.Список;
    эл_Список.ПоложениеУправленияПоиском     = ПоложениеУправленияПоиском.Нет;
    эл_Список.ПоложениеУправленияПоиском     = ПоложениеУправленияПоиском.Нет;
    эл_Список.ПоложениеСостоянияПросмотра    = ПоложениеСостоянияПросмотра.Нет;
    эл_Список.ПоложениеСтрокиПоиска          = ПоложениеСтрокиПоиска.Нет;
    эл_Список.ПоложениеКоманднойПанели       = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
    
    НоваяКолонка = Элементы.Добавить("Список_Альт_Ссылка", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.Ссылка";
    НоваяКолонка.Видимость                  = Ложь;
    
    НоваяКолонка = Элементы.Добавить("Список_Альт_ПометкаУдаления", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.ПометкаУдаления";
    НоваяКолонка.Видимость                  = Ложь;
    
    НоваяКолонка = Элементы.Добавить("Список_Альт_Код", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.Код";
    
    НоваяКолонка = Элементы.Добавить("Список_Альт_Наименование", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.Наименование";
    НоваяКолонка.Ширина                     = 20;
    НоваяКолонка.РастягиватьПоГоризонтали   = Ложь;
        
    НоваяКолонка = Элементы.Добавить("Список_Альт_Обработан", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.Обработан";
    НоваяКолонка.Вид                        = ВидПоляФормы.ПолеФлажка;
    
    НоваяКолонка = Элементы.Добавить("Список_Альт_ОшибкаПриОбработке", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.ОшибкаПриОбработке";
    НоваяКолонка.Заголовок                  = "Ошибка";
    НоваяКолонка.Вид                        = ВидПоляФормы.ПолеФлажка;
    
    НоваяКолонка = Элементы.Добавить("Список_Альт_НоменклатурнаяГруппа", Тип("ПолеФормы"), эл_Список);
    НоваяКолонка.ПутьКДанным                = "Список_Альтернативный.НоменклатурнаяГруппа";
    
    #КонецОбласти
    
КонецПроцедуры

#КонецОбласти

 +16 

   

Распечатать

Динамический список ~ Как на управляемой форме разместить список регистра сведений с отбором?

Решение рассмотрено для элемента справочника (Контрагент и регистр КонтактнаяИнформация)

1.

Создание реквизита:

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

2.

Отображение на форме:

Перетащить реквизит формы в элементы формы (c права налево ).
Так же для отображения необходимо задать хотя-бы одну колонку для вывода.

3.

Настройка отбора:

В процедуре ПриСозданииНаСервере вручную устанавливаем необходимый отбор.

Пример:

Код 1C v 8.2 УП

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

Решение явно не единственное, так что если кто что накопает ещё — пишите ;)

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