Как программно настроить динамический список и установить отборы в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

Различия между обычными и управляемыми формами

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

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

Шаг 1: Программная инициализация динамического списка

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

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


&НаСервере
Процедура ИнициализироватьСписокНаСервере()
    
    // Указываем основную таблицу, это критически важно для работы стандартных команд
    Список.ОсновнаяТаблица = "Документ." + ИмяВыбранногоВидаДокумента;
    
    // Включаем произвольный запрос
    Список.ПроизвольныйЗапрос = Истина;
    
    // Формируем текст запроса
    Список.ТекстЗапроса = 
        "ВЫБРАТЬ
        |   Док.Ссылка,
        |   Док.Дата,
        |   Док.Номер,
        |   Док.Проведен
        |ИЗ
        |   Документ." + ИмяВыбранногоВидаДокумента + " КАК Док";
    
    // Включаем автозаполнение, чтобы компоновщик увидел поля запроса
    Список.АвтоЗаполнениеДоступныхПолей = Истина;
    
КонецПроцедуры

Обратим внимание на свойство ОсновнаяТаблица. Если его не заполнить, система не будет знать, с каким типом данных она работает. Это приведет к тому, что в списке не будут работать стандартные действия (открытие формы, пометка на удаление), а механизмы динамического считывания данных могут работать некорректно.

Шаг 2: Работа с Компоновщиком настроек и отборами

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

Если у вас есть отдельный КомпоновщикНастроек на форме (например, связанный с внешней схемой компоновки), вы можете перенести настройки в динамический список следующим образом:


// Вместо ручного перебора элементов используйте метод ЗагрузитьНастройки
НастройкиДляЗагрузки = МойКомпоновщикНастроек.ПолучитьНастройки();
Список.КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиДляЗагрузки);

Однако, если вы хотите добавить конкретные элементы программно, рассмотрим правильный способ добавления отбора:


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

Важный нюанс: если вы хотите установить "жесткое" ограничение, которое пользователь не сможет отключить в интерфейсе, используйте свойство ФиксированныеНастройки. Настройки, помещенные туда, объединяются с пользовательскими по правилу "И" и не видны в стандартном окне настройки списка.

Шаг 3: Почему список остается пустым?

Разберем основные причины, по которым после выполнения кода список на форме не отображает данные:

  1. Отсутствие обновления на клиенте. В управляемых формах изменение реквизита типа ДинамическийСписок на сервере не всегда мгновенно отражается в таблице на форме. Рекомендуется вызвать метод Элементы.ИмяТаблицыСписка.Обновить() на стороне клиента.
  2. Несоответствие полей. Если вы сначала программно изменили запрос, а затем попытались применить старые настройки компоновщика, возникнет конфликт. Всегда устанавливайте АвтоЗаполнениеДоступныхПолей = Истина до манипуляций с настройками.
  3. Контекст выполнения. Убедитесь, что инициализация происходит в серверном контексте (&НаСервере), так как свойства ТекстЗапроса и КомпоновщикНастроек недоступны на клиенте.
  4. Обычные формы. Как уже упоминалось, если вы пытаетесь использовать ДинамическийСписок на обычной (толстой) форме, он просто не будет работать как ожидается. Для обычных форм используйте ПостроительОтчета, привязанный к табличному полю.

Шаг 4: Вывод настроек компоновщика на форму

Чтобы пользователь мог удобно редактировать отборы прямо на форме вашей обработки, не заходя в глубокие настройки, выполните следующие действия:

Рассмотрим порядок действий:

  1. Выберите в дереве реквизитов формы ваш ДинамическийСписок.
  2. Разверните его структуру до пути: КомпоновщикНастроек -> Настройки -> Отбор.
  3. Перетащите ветку Отбор на форму. 1С автоматически создаст таблицу, которая будет напрямую связана с отборами списка.

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

Практический совет по производительности

Проанализируем работу динамического списка с большими объемами данных. Помните, что ДинамическийСписок с произвольным запросом выполняет запрос ВЫБРАТЬ ПЕРВЫЕ... при каждой прокрутке. Если ваш запрос содержит сложные соединения или функции в полях, это может замедлить интерфейс. Старайтесь всегда указывать ОсновнуюТаблицу, чтобы платформа могла оптимизировать запросы, используя индексы основной таблицы метаданных.

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

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

← На главную