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