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