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

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

Как показать таблицу значений в форме 1С

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

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

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

Ниже разобраны оба варианта — для управляемых форм (современные конфигурации на платформе 8.3) и для обычных форм (старые конфигурации), а также способ вывода таблицы без создания реквизита через табличный документ.

Как определить, какой способ подходит вашей форме

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

Признаки управляемой формы: в конфигураторе у формы видны закладки «Реквизиты» и «Элементы», код модуля содержит директивы &НаСервере и &НаКлиенте. Обычная форма выглядит как визуальный редактор с панелями, а в модуле нет директив компиляции. Если конфигурация работает в режиме «Управляемое приложение» — используйте первый способ.

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

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

Конфигурация работает в управляемом приложении (8.2/8.3, тонкий или веб-клиент)Создавайте реквизит формы и используйте ИзменитьРеквизиты() и ЗначениеВДанныеФормы()
Форма обычная (режим обычного приложения)Добавьте элемент ТабличноеПоле и назначьте таблицу напрямую
Нужно только показать данные для просмотра без редактированияРассмотрите вывод через табличный документ — это проще и не требует реквизитов
Нужна интерактивность: отбор, сортировка, оформление строкИспользуйте динамический список или реквизит-таблицу с настройкой условного оформления

Способ 1: вывод таблицы в управляемой форме через реквизит

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

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

Порядок действий для управляемой формы
  1. 1
    Откройте форму в конфигураторе, перейдите на закладку «Реквизиты» и добавьте реквизит, например ТЗДанные, с типом «ТаблицаЗначений»
  2. 2
    Добавьте в реквизит подчинённые колонки с нужными именами и типами (Строка, Число, Дата, ссылки)
  3. 3
    Перетащите реквизит ТЗДанные в дерево элементов формы — появится таблица с колонками
  4. 4
    В модуле формы создайте серверную процедуру, которая строит таблицу значений (запросом или вручную)
  5. 5
    Вызовите ЗначениеВРеквизитФормы() или присвойте реквизиту результат запроса через Загрузить()
  6. 6
    Откройте форму в режиме предприятия и убедитесь, что строки и колонки отображаются

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

bsl
&НаСервере
Процедура ЗаполнитьТаблицуНаСервере()
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 100
	| Номенклатура.Ссылка КАК Товар,
	| Номенклатура.Код КАК Код
	|ИЗ Справочник.Номенклатура КАК Номенклатура";
	ТЗ = Запрос.Выполнить().Выгрузить();
	ЗначениеВРеквизитФормы(ТЗ, "ТЗДанные");
КонецПроцедуры

Метод ЗначениеВРеквизитФормы() доступен только в серверном контексте формы. Если таблица строится на клиенте, вызывайте серверную процедуру-обёртку — прямая передача объекта «ТаблицаЗначений» с клиента на сервер невозможна, так как этот тип несериализуем.

Создание реквизита программно, когда структура неизвестна заранее

Когда набор колонок определяется в момент выполнения, реквизит добавляется кодом. Для этого формируется массив объектов «ОписаниеРеквизитаФормы», вызывается ИзменитьРеквизиты(), а затем программно создаются элементы формы — таблица и её колонки.

bsl
&НаСервере
Процедура СоздатьТаблицуПрограммно()
	Добавляемые = Новый Массив;
	Добавляемые.Добавить(Новый РеквизитФормы("ТЗДинам", Новый ОписаниеТипов("ТаблицаЗначений")));
	Добавляемые.Добавить(Новый РеквизитФормы("Товар", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150)), "ТЗДинам"));
	Добавляемые.Добавить(Новый РеквизитФормы("Сумма", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)), "ТЗДинам"));
	ИзменитьРеквизиты(Добавляемые);

	ЭлементТаблица = Элементы.Добавить("ТЗДинам", Тип("ТаблицаФормы"));
	ЭлементТаблица.ПутьКДанным = "ТЗДинам";
	Для Каждого ИмяКолонки Из СтрРазделить("Товар,Сумма", ",") Цикл
		Колонка = Элементы.Добавить("ТЗДинам" + ИмяКолонки, Тип("ПолеФормы"), ЭлементТаблица);
		Колонка.ПутьКДанным = "ТЗДинам." + ИмяКолонки;
	КонецЦикла;
КонецПроцедуры

Обратите внимание: ИзменитьРеквизиты() нельзя вызывать после того, как форма уже открыта пользователю и реквизиты используются, — структуру меняют в обработчике ПриСозданииНаСервере. Повторный вызов с тем же именем реквизита приведёт к ошибке, поэтому перед добавлением проверяйте существование.

Способ 2: таблица значений в обычной форме

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

Типовой код для обычной формы выглядит так:

bsl
Процедура ПриОткрытии()
	ТЗ = Новый ТаблицаЗначений;
	ТЗ.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150)));
	ТЗ.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
	НоваяСтрока = ТЗ.Добавить();
	НоваяСтрока.Товар = "Пример";
	НоваяСтрока.Количество = 5;
	ЭлементыФормы.ТабличноеПоле1.Значение = ТЗ;
	ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();
КонецПроцедуры

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

Способ 3: быстрый показ через табличный документ

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

bsl
&НаКлиенте
Процедура ПоказатьТаблицу(Команда)
	ТабДок = ПостроитьТабДокНаСервере();
	ТабДок.Показать("Данные таблицы");
КонецПроцедуры

&НаСервере
Функция ПостроитьТабДокНаСервере()
	ТабДок = Новый ТабличныйДокумент;
	НомерСтроки = 1;
	Для Каждого Колонка Из ТЗ.Колонки Цикл
		ТабДок.Область(1, НомерСтроки).Текст = Колонка.Имя;
		НомерСтроки = НомерСтроки + 1;
	КонецЦикла;
	// далее цикл по строкам таблицы с выводом значений
	Возврат ТабДок;
КонецФункции

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

Сравнение вариантов вывода

Реквизит формы «ТаблицаЗначений»

Полноценная интерактивная таблица в управляемой форме: редактирование, отборы, условное оформление. Требует описания структуры и серверного кода

ТабличноеПоле в обычной форме

Прямое назначение таблицы без реквизитов. Работает только в режиме обычного приложения

Табличный документ

Быстрый показ для просмотра и отладки. Нет интерактивности, данные нельзя менять

Динамический список

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

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

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

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

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

Видимость таблицы на форме
Норма

Таблица с колонками отображается в заданном месте формы

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

Элемент есть в дереве, но на форме пусто или ошибка при открытии

Заполнение данными
Норма

После выполнения команды строки появляются, значения в правильных колонках

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

Колонки есть, строк нет, либо значения съехали в чужие колонки

Повторное заполнение
Норма

Старые строки заменяются новыми

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

Строки дублируются при каждом нажатии кнопки

Производительность
Норма

Форма открывается и заполняется без заметной паузы

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

Зависание при большом объёме — стоит ограничить выборку или использовать постраничный вывод

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

Полезные доработки: заголовки, оформление, итоги

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

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

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

Часто задаваемые вопросы

Можно ли вывести таблицу значений в форму без создания реквизита?

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

Почему возникает ошибка при передаче таблицы значений с клиента на сервер?

Тип «ТаблицаЗначений» несериализуем и не может передаваться между клиентом и сервером. Стройте и заполняйте таблицу в серверной процедуре, а с клиента передавайте только параметры для её построения (отборы, даты, ссылки).

Как обновить данные в уже отображаемой таблице?

Постройте таблицу заново на сервере и снова вызовите ЗначениеВРеквизитФормы() — реквизит полностью заменится. Либо очистите реквизит методом Очистить() и добавьте строки в цикле. Форма обновит отображение автоматически.

Чем вывод в таблицу формы отличается от динамического списка?

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

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

У элемента-колонки таблицы формы установите свойство ТолькоПросмотр в Истина — в конфигураторе или программно. Чтобы запретить редактирование всей таблицы, установите ТолькоПросмотр у самого элемента-таблицы.

Почему программно добавленные колонки не видны после переоткрытия формы?

Программно созданные реквизиты и элементы живут только в текущем экземпляре формы. Код их создания должен выполняться при каждом открытии — разместите его в обработчике ПриСозданииНаСервере.

Итог

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

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