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

Существует справочник Товары и документ Накладная, который регистрирует поступление товаров. В каждой накладной указывается, от какого поставщика получены товары.

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

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

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

Оба упомянутых поля уже есть в запросе, поэтому динамический список добавляет только раздел УПОРЯДОЧИТЬ ПО . В результате запрос получается таким:

Теперь посмотрим на запрос. В запросе указано левое соединение основной таблицы справочника Товары с табличной частью документа Накладная . Это значит, что для каждой строки из основной таблицы будет выведено ее объединение с каждой строкой из табличной части, удовлетворяющее условию ПО .

В системе существует два товара и проведено две накладных, которыми оформлено поступление этих товаров.

Таким образом, в процессе выполнения этого запроса, для товара Молоко будет найдена одна подходящая запись:

А для товара Хлеб будет найдена тоже одна подходящая запись:

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

Рассмотрим работу с динамическими списками на примере конфигурации 1С.Управление торговлей. Для примера разберем динамический список для справочника «Контрагенты».

Запустим 1С в режиме «Конфигуратор».

В конфигурации найдем справочник «Контрагенты».

Откроем форму «Форма Списка».

Рассмотрим форму списка справочника. Реквизит «Список» имеет тип «ДинамическийСписок».

Двойным щелчком откроем свойства реквизита.

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

Нажмем теперь «Открыть» у свойства «Настройка списка».

Перед нами открывается окно настройки запроса динамического списка. Первая вкладка «Запрос».

Мы можем ка написать запрос вручную в поле «Запрос», так и воспользоваться кнопкой «Конструктор запросов».

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

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

Флаг «Автозаполнение доступных полей» определяет поля доступные для отбора. Если флаг установлен, то поля верхней выборки становятся доступными для установки отбора.

Вторая вкладка «Настройки».

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

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

Так же на вкладке «Настройки» мы можем задавать «Порядок», «Группировки» и «Условное оформление.

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

Как оптимизировать работу с программой?

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

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

Вы еще не внедрили 1С или необходимо установить программу в новый филиал компании? Обратитесь за внедрением и настройкой к нам — вы сэкономите свое время и избежите возможных ошибок и проблем в дальнейшем.

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

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

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

Работа с базой данных

При открытии списка

SQL-запрос при открытии динамического списка

Опишем полученный запрос. Мы выбираем первые 42 записи из таблицы "_Reference7". Именно в этой таблице хранятся записи для всех элементов справочника "Товары". Почему выбирается именно 42 записи? Найти что-либо, что повлияет на эту цифру я не смог (ни размер экрана, ни общее количество записей в таблице). Делаю вывод, что платформа по умолчанию выбирает 42 записи при открытии динамического списка.

Поля выборки содержат те данные, которые будут отображаться непосредственно в динамическом списке. На рисунке подписано как каждое из полей отображается в режиме 1С:Предприятие. Может возникнуть логичный вопрос: "Для чего в выборке присутствует поле ‘Предопределенный’ и ‘Пометка удаления’?". Нужны эти поля для того, чтобы платформа соответствующими пиктограммами могла выделять помеченные на удаление и предопределенные элементы.

В разделе "ORDER BY" обозначены поля для сортировки результирующей выборки: "ЭтоГруппа", "Наименование", "Ссылка" (см. подписи полей выборки). В разделе наложения условий указывается отбор по родителю для выбираемых элементов. В нашем случае, поскольку динамический список был только открыт, отбираются записи без родительского элемента. В переменную условия "P1" передается пустое значение ссылки на элемент родителя.

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

При раскрытии группы с элементами

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

Пролистываем список элементов

Запрос для выборки следующей порции элементов

Получение данных по последней выбранной записи

Настройка отображения списка

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

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

Группировки динамического списка

Обратите внимание на появившееся дополнительное левое соединение и дополнительные операции для полей выборки.

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

Не смотря на то, что чтение будет происходить динамически (первая выборка при открытии списка будет содержать 42 записи), включение группировок увеличивает нагрузку на сервер.