К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как вывести список на форму 1С

Способы вывести список на форму 1С: динамический список, таблица и список значений. Пошаговые инструкции, примеры кода, типичные ошибки и ответы на вопросы.

Вывести список на форму в 1С можно несколькими способами, и выбор зависит от того, что за данные нужно показать: записи справочника или документа, результат произвольного запроса, временную подборку строк, сформированную программно. Универсального «лучшего» варианта нет — у каждого механизма свои ограничения по редактированию, отборам и производительности.

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

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

Как выбрать подходящий способ вывода списка

Прежде чем открывать конфигуратор, определите три вещи: откуда берутся данные, должен ли пользователь их редактировать и какой объём ожидается. От ответов зависит выбор механизма и дальнейшие настройки.

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

Маршрут решения

Как выбрать действие

Данные хранятся в таблице базы и их многоИспользуйте динамический список с произвольным или стандартным запросом
Данные формируются программно и пользователь должен их менятьИспользуйте таблицу значений как реквизит формы
Нужен короткий перечень без редактирования и колонокИспользуйте список значений
Список должен обновляться при изменении данных в базеВыбирайте динамический список — он обновляется автоматически

Вывод списка через динамический список

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

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

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

Пример произвольного запроса для списка товаров с остатками:

ВЫБРАТЬ

Товары.Ссылка КАК Номенклатура,

Товары.Наименование,

ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК Остаток

ИЗ

Справочник.Номенклатура КАК Товары

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки

ПО Товары.Ссылка = Остатки.Номенклатура

Обратите внимание на свойство «Основная таблица»: если оно заполнено, платформа автоматически добавляет стандартные команды (создать, изменить, обновить) и корректно работает динамическое обновление при изменении данных. Для сложных запросов с группировками основную таблицу указать нельзя — тогда часть команд придётся реализовывать вручную.

Вывод данных через таблицу значений

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

Создайте реквизит формы типа ТаблицаЗначений, например РезультатПодбора. Затем добавьте подчинённые реквизиты-колонки с нужными типами: «Номенклатура» (ссылка на справочник), «Количество» (число), «Цена» (число). Перетащите таблицу в элементы формы и заполните её программно.

&НаСервере

Процедура ЗаполнитьСписок()

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 100

| Номенклатура.Ссылка КАК Номенклатура,

| Номенклатура.Наименование КАК Наименование

|ИЗ

| Справочник.Номенклатура КАК Номенклатура";

РезультатПодбора.Загрузить(Запрос.Выполнить().Выгрузить());

КонецПроцедуры

Метод Загрузить() заполняет таблицу целиком, заменяя текущие строки. Если нужно добавить строки к существующим, используйте цикл с РезультатПодбора.Добавить() и заполнением полей вручную. Для больших объёмов предпочтителен Загрузить() — он работает заметно быстрее построчного добавления.

bsl
НоваяСтрока = РезультатПодбора.Добавить();
НоваяСтрока.Номенклатура = ТекущийТовар;
НоваяСтрока.Количество = 1;

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

Список значений — самый лёгкий вариант, когда нужно показать небольшой перечень строк без колонок и без редактирования: например, список доступных складов, вариантов ответа или выбранных пользователем элементов.

Добавьте реквизит формы типа СписокЗначений и элемент формы, связанный с ним. Заполнение выполняется одной строкой кода на элемент:

&НаКлиенте

Процедура ПриОткрытии(Отказ)

СписокСкладов.Добавить("Основной склад");

СписокСкладов.Добавить("Склад резерва");

СписокСкладов.Добавить("Транзитный склад");

КонецПроцедуры

У элемента списка значений есть представление и значение: в Добавить() вторым параметром можно передать отображаемый текст. Это удобно, когда хранить нужно ссылку или код, а показывать — понятное название. Учтите, что список значений не поддерживает отборы и поиск «из коробки» — для этого лучше подходит динамический список.

Программное создание реквизитов и колонок

Иногда структура списка заранее неизвестна — например, колонки зависят от настроек пользователя. В этом случае реквизиты и элементы формы создаются программно в обработчике ПриСозданииНаСервере.

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

ДобавляемыеРеквизиты = Новый Массив;

НовыйРеквизит = Новый РеквизитФормы("ДопКолонка",

Новый ОписаниеТипов("Строка"), "РезультатПодбора", "Доп. поле");

ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);

ИзменитьРеквизиты(ДобавляемыеРеквизиты);

НовыйЭлемент = Элементы.Добавить("РезультатПодбораДопКолонка",

Тип("ПолеФормы"), Элементы.РезультатПодбора);

НовыйЭлемент.ПутьКДанным = "РезультатПодбора.ДопКолонка";

КонецПроцедуры

Ключевые моменты: сначала вызывается ИзменитьРеквизиты(), и только потом создаются элементы, привязанные к новым реквизитам. Если поменять порядок, платформа выдаст ошибку, что реквизит не найден. Удаление реквизитов выполняется тем же методом, но со вторым параметром — массивом имён удаляемых реквизитов.

Проверка результата и типичные ошибки

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

Контрольные точки

Как проверить результат

Отображение данных
Норма

Строки видны сразу после открытия формы

Тревожный признак

Пустая таблица при наличии данных в базе — проверьте запрос и отбор

Отбор и поиск
Норма

Отбор применяется без ошибок и задержек

Тревожный признак

Ошибка «Поле не найдено» — имя поля в отборе не совпадает с запросом

Обновление
Норма

После записи объекта список обновляется сам

Тревожный признак

Данные устарели — у динамического списка не задана основная таблица

Редактирование
Норма

Строки таблицы значений редактируются

Тревожный признак

Ячейки недоступны — проверьте свойство «ТолькоПросмотр» у элемента

Типичные ошибки
01
Загрузка тысяч строк в таблицу значений вместо динамического списка — форма открывается долго и потребляет много памяти
02
Отсутствие основной таблицы у динамического списка — не работают стандартные команды и автообновление
03
Опечатка в свойстве «ПутьКДанным» элемента — колонка остаётся пустой без явной ошибки
04
Вызов ИзменитьРеквизиты() на клиенте или повторно при каждом серверном вызове — ошибки выполнения и лишняя нагрузка
05
Использование произвольного запроса с группировкой там, где нужно редактирование, — список становится доступным только для чтения

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

Итог

Что важно запомнить

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

Частые вопросы

Как вывести список на форму внешней обработки?

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

Можно ли вывести список без запроса, просто из кода?

Да. Создайте реквизит типа «ТаблицаЗначений» или «СписокЗначений» и заполните его программно в обработчике ПриСозданииНаСервере или по команде. Запрос нужен только для динамического списка.

Почему динамический список пустой, хотя данные в базе есть?

Чаще всего причина в скрытом отборе: проверьте свойство «Отбор» у реквизита и установленные пользователем настройки. Также проверьте права доступа к таблице — при их отсутствии список молча показывает пустой результат.

Как обновить таблицу значений после изменения данных?

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

Что выбрать для списка с картинками и флажками?

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

Работает ли это в обычных формах (8.2 и старше)?

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