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

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

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

Анализ технической ситуации: почему возникает путаница

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

Разберем подробнее: ДинамическийСписок — это не просто массив данных, это сложный программный механизм, предназначенный для эффективного извлечения записей из базы данных и их отображения в таблицах формы. Когда мы указываем его как тип значения в СпискеЗначений, мы создаем коллекцию, элементами которой являются сами механизмы динамических списков. То есть в каждой строке вашего списка значений будет лежать не ссылка на документ или справочник, а целый объект со своими настройками запроса, отборами, группировками и условным оформлением. Именно поэтому в интерфейсе настройки реквизита нет поля «Текст запроса» — запрос принадлежит конкретному экземпляру объекта, а не типу данных в списке.

Почему метафора гиперкуба здесь уместна

В обсуждениях разработчиков часто проскакивает шутка про «автоматизацию гиперкуба». Это ироничное сравнение указывает на избыточную сложность структуры. Если попытаться реализовать «Список значений динамических списков», мы получим многомерную структуру, где внутри каждого элемента списка находится еще один список (динамический), который управляет отображением данных. В 99.9% случаев в реальной бизнес-автоматизации такая структура не требуется и является следствием логической ошибки проектирования.

Правильные способы реализации задачи

Если ваша цель — предоставить пользователю возможность выбирать элементы из базы данных (например, номенклатуру или документы) на основе динамически обновляемого списка, рассмотрим пошагово три стандартных и эффективных способа.

Вариант 1. Динамический список с механизмом пометок

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

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

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

Вариант 2. Использование Списка значений с типом Ссылка

Если нам необходимо хранить результат подбора элементов в компактном виде, выясним, как правильно настроить СписокЗначений. Вместо типа ДинамическийСписок, укажите конкретный ссылочный тип. Например, СправочникСсылка.Номенклатура.

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


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

Здесь Объект.СписокЭлементов — это реквизит формы типа СписокЗначений. Мы видим, что запрос выполняется отдельно, а в список попадают только нужные нам ссылки.

Вариант 3. Использование Таблицы значений

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

Алгоритм работы будет следующим:

  1. Создаем реквизит формы с типом ТаблицаЗначений.
  2. Добавляем необходимые колонки (например, Ссылка, Пометка, Количество).
  3. Заполняем таблицу результатом запроса при открытии формы или по нажатию кнопки.

Резюме

Подводя итог, важно запомнить: указать запрос непосредственно для типа значения в Списке значений невозможно. Тип значения лишь определяет, какие данные могут храниться в ячейках списка. Если вам нужен динамический механизм отображения данных из БД с поддержкой запроса — используйте объект ДинамическийСписок как самостоятельный реквизит формы, а не как элемент коллекции. Если же вам нужно хранить результаты выбора — используйте СписокЗначений с типом Ссылка и заполняйте его программно с помощью объекта Запрос.

← На главную