Особенности работы динамического списка с произвольным запросом
Не во всех ситуациях динамический список может корректно отобразить данные, полученные из произвольного запроса. Поэтому задача разработчика заключается в том, чтобы правильно использовать возможности, предоставляемые динамическим списком. Рассмотрим одну из типичных ситуаций.
Существует справочник Товары и документ Накладная, который регистрирует поступление товаров. В каждой накладной указывается, от какого поставщика получены товары.
Для удобства пользователей решено показывать в списке товаров еще и поставщика, от которого получен этот товар. Для этого динамический список товаров использует произвольный запрос следующего вида:
Таблица справочника Товары связывается с табличной частью документа Накладная и из таблицы документа выбирается поставщик, от которого получен этот товар.
В системе существует два товара и проведено две накладных, которыми оформлено поступление этих товаров.
Таким образом, в процессе выполнения этого запроса, для товара Молоко будет найдена одна подходящая запись:
А для товара Хлеб будет найдена тоже одна подходящая запись:
В результате данные, предназначенные для отображения динамическим списком, будут выглядеть следующим образом:
Заметки из Зазеркалья
Данная статья является анонсом новой функциональности.
Не рекомендуется использовать содержание данной статьи для освоения новой функциональности.
Полное описание новой функциональности будет приведено в документации к соответствующей версии.
Полный список изменений в новой версии приводится в файле v8Update.htm.
Реализовано в версии 8.3.14.1565.
Динамические списки являются удобным инструментом для быстрого отображения и просмотра большого количества записей. Они получают и отображают данные порциями. Благодаря этому пользователи могут одинаково быстро работать и с маленькими, и с большими списками.
Однако возможности динамических списков гораздо шире, чем просто «стандартное» получение данных из одной таблицы. Вы можете написать произвольный запрос для динамического списка. Такой запрос может получать данные из таблиц, которые «в обычной ситуации» не используются для непосредственного отображения в интерфейсе (например, из таблицы остатков регистра или из таблицы регистрации изменений). Также вы можете в произвольном запросе получать данные сразу из нескольких таблиц, соединяя их с помощью языка запросов.
С одной стороны это хорошо, потому что вы можете создавать списки, которые основаны на довольно сложных запросах. С другой стороны это может приводить к тому, что списки начинают работать неэффективно. Часто ситуация складывается таким образом, что для сложного запроса вы не можете выбрать основную таблицу.
В этой ситуации платформа не может считывать данные динамически. Так как в выборке отсутствуют ключевые поля, платформе приходится использовать в качестве них порядковый номер записи, и каждый раз считывать данные с начала, что может занимать значительное время и существенный объем памяти. Также в этой ситуации становится недоступной часть функциональности динамического списка. Например, не поддерживается группировка записей в списке. Кроме этого при обновлении списка текущая строка, с точки зрения пользователя, может самопроизвольно «перепрыгивать» на другую строку, если с момента предыдущего отображения данных количество предшествующих строк списка изменилось.
Для того чтобы устранить перечисленные недостатки и повысить производительность списков, мы добавили в платформу возможность указывать произвольные ключевые поля для запроса динамического списка. Например, вы можете выбрать данные из таблицы остатков регистра накопления, используя ключевые поля Товар и Склад.

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


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

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

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

3. Рекомендации к запросам в динамических списках
Динамические списки 1С предназначены для непосредственного представления информации пользователю, поэтому главную роль играет скорость обновления и вывода данных. Выделим ряд основных рекомендаций, которые следует учесть при проектировании.
Во-первых, стоит проектировать простые запросы за счет оптимизации архитектуры конфигурации. Например, сложные вычисления проводить не в запросе, а при проведении документов, включая их регистры, которые затем и использовать в запросе.
Во-вторых, необходимо рассматривать возможности индексирования полей, данные которых ожидается использовать при настройке группировок, порядка, отбора, группировок. Следует учесть, что избыточность индексов приводит к неоправданной нагрузке.
В-третьих, следует ограничить количество соединений с реальными и виртуальными таблицами, а также вложенными запросами. Оптимальный случай – использовать только основную таблицу.
Вместе с тем для эффективного использования запросов стоит ознакомиться с требованиями по разработке оптимальных запросов.
Работа с динамическим списком в 1С 8.3 (8.2)
Наконец-то осуществилась мечта любого «семерошника». Как часто пользователи программы 7.7 просили сделать нормальный подбор номенклатуры. Чтобы и остатки можно было видеть, и цены, и установить фильтры. Приходилось придумывать разные хитрости, вплоть до написания внешних компонентов. В 1С 8.2 появились динамические списки. Предлагаю рассмотреть, что это такое и что они нам могут дать в 1С 8.3.
Создание формы выбора
За основу возьмем некую тестовую конфигурацию 1С:»Бухгалтерия предприятия 3.0″. Не будем сейчас делать подбор, просто в справочнике «Номенклатура» добавим еще одну форму выбора и сделаем ее временно основной:
При создании система по умолчанию добавит на форму табличное поле с типом «Динамический список».
Зайдем в его свойства и посмотрим, что там.
В первую очередь нас интересует флажок «Произвольный запрос». Он-то и откроет нам все преимущества динамического списка. У нас появится возможность написать собственный запрос, причем с параметрами. Устанавливаем флажок и нажимаем ссылку «Открыть»:
Откроется окно с уже готовым кодом на языке запросов. Пока что там просто перечислены все поля справочника «Номенклатура».
Как видим, имеется кнопка вызова «Конструктора запроса» и флажок, который дает возможность динамически изменять содержимое списка. То есть когда другой пользователь меняет что-то в справочнике, в нашем списке это тоже изменится. Кроме того, имеется закладка «Настройки», но ее мы коснемся позже.
Собственный запрос в динамическом списке
Сначала создадим нужный нам запрос с остатками и ценами. Примерно так:
Закладка «Настройки»
И вот теперь самое вкусное! Переходим на закладку «Настройки». И сразу видим, что на первой вкладке мы можем делать любые отборы по любому полю в запросе:
Программная установка параметров запроса в динамическом списке 1С 8.3
Не забываем, что в запросе у нас присутствуют два параметра: «Период» и «Тип цен». Мы должны передать их в запрос, иначе будет ошибка.
Пропишем эти параметры в параметрах формы, а в модуле формы добавим следующие строки:
Значения параметров можно передать из объекта, откуда вызывается форма, либо другие, установленные по умолчанию.
Далее на форму с «Динамическим списком» можно добавить таблицу значений, куда будут при двойном клике передаваться строки с выбранным товаром и затем переноситься в документ.
Также на форму можно добавить флажок «Запрашивать количество».
В этом случае мы получаем уже простенький подбор товаров, однако с достаточно расширенными возможностями.
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
Динамический список, ключи записей. Нюансы
Тем не менее, есть нюансы поведения ДС при отсутствии основной таблицы и, тем более, с разными видами ключей.
Не весь функционал ДС с основной таблицей унаследован для ДС с произвольными запросами, даже для случаев, когда, казалось бы, построение ключа и поведение системы ровно то же. Так, «Уведомление не влияет на динамические списки, у которых не задана основная таблица» (с) СП, т.е. мы не можем рассчитывать на обновление ДС и очистку кэша форм выбора при вызове «ОповеститьОбИзменении» и при работе аналогичных стандартных команд. Приходится делать вручную, как и ранее.
Аналогично, «ОповеститьОбАктивизации», даже будучи вызван с корректным аргументом, эффекта не возымеет, поэтому для синхронизации ДС на произвольных запросах, даже с видом ключа «Авто», тоже всё вручную. Ряд релизов при связке справочников по владельцу средствами ДС без основной таблицы вообще аварийно завершался при чтении первой же порции данных.
Есть особенности в поведении произвольных запросов с разными ключами, рассмотрим их на примере общеизвестных функций получения СКД и настроек ДС (например, описано тут). В качестве задачи возьмём, например, эмуляцию возможностей свойства «ТекущиеДанные» (доступного, в отличие от «ТекущаяСтрока», лишь на клиенте), на сервере.
Может указываться и для произвольного запроса без основной таблицы. При этом поле значения ключа сам не очищает и не проверяет.
Если для произвольного запроса указана основная таблица, ПоляКлюча не то что бы недоступны, а именно «не используются» (с) СП. Замечено, что поведение при обращении к полям ключа может разниться для толстого и тонкого клиентов.
Для всех случаев ключей нельзя использовать поля, могущие иметь значения «Неопределено» и «Null», даже потенциально. Тут платформу одолевает паранойя даже при очевидных разыменованиях и составных типах. Многотипные, в общем случае, допустимы, в т.ч. смешанные из простых и ссылочных типов.
Защита от дублирования ключевых всегда срабатывает только при отображении ДС, а не при настройке, т.е. заранее не проверяется, что, при возможности программного переопределения, разумно.
Во всех режимах одинаково полные возможности Отбора, Порядка, Условного оформления. В режиме «НомерСтроки» отсутствует возможность Группировок; при этом возвращаемый ПолучитьОграниченияИспользованияВГруппировке() массив пуст.
Если у ДС указаны в конфигураторе настройки, все они ровно так и отображается (отбор, порядок, группировка как структура), но искать их следует именно в исполняемых настройках, а не в НастройкиПоУмолчанию.
Получение ограничений использования (в отборе, в сортировке, в группировках) совершенно ничем не отличается от «Авто» и интереса не представляет.
Механизм автозаполнения доступных полей, механизм свойства «ПолучениеПредставленийДляНевидимыхПолей» (и соответственно кэш представлений ссылок формы) работают для всех случаев строго так же, как для обычных с основной таблицей.
И собственно функция, реализующая демонстрационную задачу






