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