Разработка и Конфигурация · 12 мин
Как изменить динамический список в 1С
Как изменить динамический список в 1С: произвольный запрос, отборы, условное оформление, основная таблица и типовые ошибки. Практическая инструкция для разработчика.
Динамический список — основной механизм отображения табличных данных в управляемых формах 1С: списки документов, справочников, регистров и произвольных выборок строятся именно на нём. Изменить динамический список можно двумя принципиально разными путями: через настройки в режиме предприятия (пользовательские отборы, сортировка, группировка) и через конфигуратор — изменением запроса, состава полей, отборов и оформления. Первый путь доступен пользователю без прав разработчика, второй требует доработки конфигурации или расширения.
Выбор способа зависит от задачи. Если нужно просто отфильтровать записи или поменять порядок колонок — достаточно пользовательских настроек. Если требуется вывести данные из нескольких таблиц, добавить вычисляемое поле, изменить источник данных или задать постоянный отбор, недоступный пользователю, — придётся работать с запросом динамического списка в конфигураторе или программно.
Что такое динамический список и где он настраивается
Динамический список — это объект формы, который автоматически выполняет запрос к базе данных и отображает результат с поддержкой динамического считывания: данные подгружаются порциями по мере прокрутки, без загрузки всей таблицы в память. Именно поэтому он используется для списков, где записей могут быть сотни тысяч.
Настройки динамического списка делятся на три уровня. Первый — свойства реквизита формы типа «ДинамическийСписок» в конфигураторе: текст запроса, основная таблица, ключевые поля, признаки произвольного запроса и динамического считывания. Второй — настройки компоновки данных, которые видит пользователь через кнопку «Ещё — Настроить список»: отбор, сортировка, группировка, условное оформление. Третий — программное изменение через встроенный язык в обработчиках формы.
Понимание этой трёхуровневой структуры важно: многие проблемы возникают из-за того, что разработчик пытается решить задачу не на том уровне. Например, жёстко зашивает в запрос условие, которое логичнее было бы реализовать пользовательским отбором, или наоборот — оставляет пользователю возможность снять отбор, который по смыслу обязателен.
Как изменить запрос динамического списка в конфигураторе
Основной способ изменить состав данных — включить произвольный запрос. Откройте форму списка в конфигураторе, найдите реквизит с типом «ДинамическийСписок» (обычно называется «Список») и откройте его свойства. Установите флаг «Произвольный запрос» — станет доступной кнопка «Открыть», запускающая конструктор запроса.
В конструкторе можно писать любой запрос на встроенном языке запросов: соединения таблиц, группировки, виртуальные таблицы регистров, вычисляемые поля. Например, чтобы в списке документов показать сумму и контрагента одновременно с данными шапки, достаточно стандартной таблицы документа; а вот чтобы добавить остаток по товару или признак оплаты, потребуется левое соединение с регистром.
После включения произвольного запроса обязательно проверьте два свойства. «Основная таблица» должна указывать на таблицу объекта, иначе перестанут работать стандартные команды: создание, копирование, пометка удаления, проведение. Ключевые поля должны однозначно идентифицировать строку — для списка документов это ссылка; если запрос содержит группировку, ссылку нужно включить в группировку или агрегировать.
- 1Откройте форму списка в конфигураторе и найдите реквизит типа «ДинамическийСписок»
- 2В свойствах установите флаг «Произвольный запрос» и нажмите «Открыть»
- 3Сформируйте запрос в конструкторе: таблицы, соединения, поля, условия
- 4Проверьте свойство «Основная таблица» — оно должно ссылаться на таблицу объекта
- 5Убедитесь, что в выборке есть ключевое поле (ссылка), иначе нарушится интерактивная работа
- 6Обновите конфигурацию базы данных и проверьте список в режиме предприятия
Как добавить отбор, сортировку и параметры
Отборы в динамическом списке задаются через настройки компоновки данных. В конфигураторе у реквизита списка есть свойство «Отбор» — там можно зафиксировать условия, которые пользователь не сможет снять. Это правильный способ скрыть, например, помеченные на удаление элементы или ограничить список текущей организацией.
Программно отбор устанавливается в обработчике ПриСозданииНаСервере. Типовой приём — добавление элемента отбора в коллекцию Список.Отбор.Элементы с указанием поля, вида сравнения и значения. Важно: если отбор должен зависеть от параметров сеанса или прав пользователя, устанавливайте его именно программно, а не в запросе — так логика останется прозрачной и её проще изменить.
Если в произвольном запросе используются параметры (например, «&Период» для виртуальной таблицы остатков), их нужно установить до первого выполнения запроса — как правило, в том же ПриСозданииНаСервере через Список.Параметры.УстановитьЗначениеПараметра(). Неустановленный параметр приведёт к ошибке при открытии формы.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПометкаУдаления");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Ложь;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
КонецПроцедурыКак добавить колонку и настроить условное оформление
Новая колонка появляется в списке автоматически, если поле присутствует в запросе и добавлено в настройки компоновки. В конфигураторе у реквизита списка есть закладки настроек: «Выбранные поля», «Отбор», «Сортировка», «Условное оформление». Добавьте вычисляемое поле запроса в выбранные поля — и оно станет доступно пользователю.
Чтобы колонка была видна на форме, проверьте также таблицу формы, связанную со списком: у неё должен существовать элемент, связанный с этим полем, либо включён режим автогенерации колонок. Если колонки нет в дереве элементов формы, добавьте её вручную и укажите путь к данным вида «Список.ИмяПоля».
Условное оформление позволяет раскрасить строки по условию: например, выделить красным просроченные документы или серым — непроведённые. Настройка выполняется на закладке «Условное оформление» у реквизита списка: задаётся отбор (условие), оформление (цвет, шрифт) и список оформляемых полей. Оформление, заданное в конфигураторе, пользователь видит, но не может отключить, если вы не вынесли его в пользовательские настройки.
Как изменить список программно без изменения конфигурации
Если дорабатывать типовую конфигурацию нельзя или нежелательно, часть изменений выполняется через расширение конфигурации: форма списка заимствуется в расширение, и в ней меняется запрос, отборы и оформление. Это безопаснее прямой доработки — при обновлении типовой конфигурации расширение не конфликтует с изменениями поставщика, хотя совместимость после обновления всё равно нужно проверять.
Ещё один вариант — программная подмена текста запроса через свойство Список.ТекстЗапроса в обработчике ПриСозданииНаСервере. Так делают, когда текст запроса должен зависеть от условий: например, для разных ролей подставляются разные соединения. Приём работает, но требует аккуратности: строка запроса в коде плохо читается и не проверяется конструктором.
Пользовательские настройки (кнопка «Ещё — Настроить список») — самый безопасный уровень: отборы, сортировка, группировка и оформление сохраняются для конкретного пользователя и не затрагивают конфигурацию. Если задача решается на этом уровне, не стоит лезть в конфигуратор.
Как выбрать способ изменения
Типовые ошибки и ограничения динамических списков
Самая частая ошибка — потеря основной таблицы после включения произвольного запроса. Симптомы: пропадают кнопки «Создать», не работает двойной клик по строке, недоступны команды изменения объекта. Лечится явным указанием основной таблицы в свойствах списка.
Вторая группа проблем связана с производительностью. Соединение с виртуальными таблицами регистров без отборов, выборка по неиндексированным полям, функции в условиях запроса — всё это заставляет список выполнять тяжёлые запросы при каждой прокрутке. Динамический список выполняет запрос многократно, поэтому даже умеренно медленный запрос превращается в заметные задержки.
Третья типичная ситуация — попытка использовать в динамическом списке временные таблицы, пакетные запросы или несоединимые конструкции. Динамический список поддерживает только одиночный запрос-выборку: никаких «УНИЧТОЖИТЬ», «ПОМЕСТИТЬ» и нескольких запросов. Если логика требует предварительной подготовки данных, замените её вложенными запросами или виртуальными таблицами.
Как проверить результат после изменений
После изменения динамического списка проверку стоит выполнять в несколько шагов. Сначала откройте список в режиме предприятия и убедитесь, что данные отображаются и соответствуют ожидаемому отбору. Затем проверьте интерактивность: создание нового элемента из списка, открытие существующего, пометку удаления и проведение (для документов).
Далее проверьте пользовательские настройки: примените отбор и сортировку через «Настроить список», убедитесь, что они сочетаются с зашитыми условиями и не приводят к пустому или искажённому результату. Если список используется на формах подбора или в других объектах, проверьте и их.
Наконец, оцените скорость на реальном объёме данных, а не на пустой тестовой базе. Если список открывается дольше нескольких секунд, анализируйте запрос: уберите лишние соединения, добавьте отборы в виртуальные таблицы, проверьте индексацию полей отбора.
Как проверить результат
Данные отображаются, условия отбора соблюдены
Ошибка запроса, пустой список или лишние записи
Работают «Создать», открытие, пометка удаления
Команды недоступны — проверьте основную таблицу
Настройки применяются и сочетаются с фиксированными условиями
Отбор ломает список или игнорируется
Список открывается и прокручивается без заметных пауз
Задержки при каждой прокрутке — оптимизируйте запрос
Часто задаваемые вопросы
Можно ли изменить динамический список без прав разработчика?
Да, в пределах пользовательских настроек: отбор, сортировка, группировка и условное оформление доступны через «Ещё — Настроить список». Изменить состав полей и текст запроса таким способом нельзя — для этого нужен конфигуратор или расширение.
Почему после произвольного запроса пропала кнопка «Создать»?
При включении произвольного запроса платформа может сбросить свойство «Основная таблица». Откройте свойства реквизита списка и укажите таблицу объекта (например, «Документ.РеализацияТоваровУслуг») — стандартные команды вернутся.
Как скрыть помеченные на удаление элементы из списка?
Добавьте в отбор списка условие «ПометкаУдаления = Ложь» с режимом отображения «Недоступный», чтобы пользователь не мог его снять. Это можно сделать в свойствах списка в конфигураторе или программно в ПриСозданииНаСервере.
Можно ли использовать временные таблицы в запросе динамического списка?
Нет. Динамический список поддерживает только одиночный запрос-выборку без пакетов, временных таблиц и инструкций ПОМЕСТИТЬ/УНИЧТОЖИТЬ. Сложную логику реализуйте через вложенные запросы, соединения и виртуальные таблицы регистров.
Как изменить список в типовой конфигурации, не снимая её с поддержки?
Используйте расширение конфигурации: заимствуйте форму списка, измените запрос, отборы или оформление в расширении. Типовая конфигурация останется на полной поддержке, а доработка сохранится при обновлениях — но совместимость расширения после каждого обновления нужно проверять.
Почему список с произвольным запросом стал медленно работать?
Чаще всего причина в соединениях с виртуальными таблицами без отборов, условиях по неиндексированным полям или функциях в тексте запроса. Динамический список выполняет запрос при каждой прокрутке, поэтому оптимизируйте его: сужайте выборку параметрами виртуальных таблиц и проверяйте план запроса на реальном объёме данных.
Что важно запомнить
Динамический список изменяется на трёх уровнях: пользовательские настройки, свойства реквизита в конфигураторе и программный код. Для произвольного запроса всегда проверяйте основную таблицу и ключевые поля, обязательные условия задавайте недоступным отбором, а доработку типовых конфигураций выполняйте через расширение. После изменений проверяйте команды формы, пользовательские настройки и скорость работы на реальном объёме данных.