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

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

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

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

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

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

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

Способ 1. Быстрый просмотр методом Показать()

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

ТЗ = Новый ТаблицаЗначений;

ТЗ.Колонки.Добавить("Номенклатура");

ТЗ.Колонки.Добавить("Количество");

// ... заполнение таблицы ...

ТЗ.Показать("Результат выборки");

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

Способ 2. Вывод через реквизит формы в управляемом приложении

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

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

&НаСервере

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

ТЗ = Новый ТаблицаЗначений;

ТЗ.Колонки.Добавить("Товар");

ТЗ.Колонки.Добавить("Остаток");

// заполнение ТЗ из запроса

ЗначениеВРеквизитФормы(ТЗ, "МояТаблица");

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

Ключевой момент — функция ЗначениеВРеквизитФормы(). Именно она преобразует серверный объект ТаблицаЗначений в данные формы, которые клиент способен отобразить. Обратное преобразование при чтении данных из формы выполняется через РеквизитФормыВЗначение(). Пропуск этих функций — самая частая причина ошибок вида «недопустимое значение» при передаче таблицы.

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

Способ 3. Программное создание реквизита формы

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

&НаСервере

Процедура СоздатьТаблицуПрограммно(ТЗ)

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

РеквизитТЗ = Новый РеквизитФормы("ДинТаблица",

Новый ОписаниеТипов("ТаблицаЗначений"));

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

Для Каждого Колонка Из ТЗ.Колонки Цикл

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

Колонка.Имя, Колонка.ТипЗначения, "ДинТаблица"));

КонецЦикла;

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

// создать элемент «Таблица» и колонки, затем:

ЗначениеВРеквизитФормы(ТЗ, "ДинТаблица");

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

После изменения состава реквизитов нужно программно добавить элемент формы типа «Таблица» с путём к данным «ДинТаблица» и для каждой колонки — поле с соответствующим путём. Без элементов формы реквизит существует, но пользователь его не видит. Учтите, что ИзменитьРеквизиты() — дорогая операция, вызывать её следует один раз при формировании структуры, а не при каждом обновлении данных.

Способ 4. Вывод в табличный документ

Когда таблицу нужно показать разово — для печати, сохранения в Excel или простого просмотра без интерактивности — удобно вывести её в табличный документ. Этот способ работает в любом клиенте, потому что табличный документ полностью поддерживается тонким и веб-клиентом.

ТабДок = Новый ТабличныйДокумент;

// шапка

Для Каждого Колонка Из ТЗ.Колонки Цикл

ТабДок.Область(1, ТЗ.Колонки.Индекс(Колонка) + 1).Текст = Колонка.Имя;

КонецЦикла;

// данные

Для Ном = 0 По ТЗ.Количество() - 1 Цикл

Для Каждого Колонка Из ТЗ.Колонки Цикл

ТабДок.Область(Ном + 2,

ТЗ.Колонки.Индекс(Колонка) + 1).Текст =

Строка(ТЗ[Ном][Колонка.Имя]);

КонецЦикла;

КонецЦикла;

ТабДок.Показать("Данные таблицы");

Метод Показать() у табличного документа, в отличие от таблицы значений, корректно работает на тонком клиенте. Для больших таблиц построчный вывод через Область() медленный; в прикладных решениях используют макет с областями и Параметры либо построитель отчёта. Но для отладки и разового просмотра приведённого кода достаточно.

Способ 5. Отладка через консоль кода и табличный документ запроса

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

Если таблица получена из запроса, часто рациональнее выводить не саму таблицу, а результат запроса через консоль запросов — там видны и данные, и план выполнения. А при отладке в конфигураторе содержимое таблицы смотрят через окно «Вычислить выражение» (Shift+F9): вводят имя переменной и разворачивают коллекцию строк в дереве значений. Это не «показ пользователю», но для разработчика — самый быстрый способ контроля.

Сравнение способов показа таблицы значений

ТЗ.Показать()

Одна строка кода, но только толстый клиент. Подходит для локальной отладки, не для прикладного решения.

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

Штатный путь для управляемых форм: сортировка, отбор, интерактивность. Требует ЗначениеВРеквизитФормы и работы с формой.

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

Работает в любом клиенте, данные можно сохранить и напечатать. Нет интерактивности, на больших объёмах нужен макет.

Отладчик и консоль запросов

Ничего не нужно программировать, но видит только разработчик, а не пользователь.

Типичные ошибки и их признаки

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

Вторая группа — ошибки преобразования. Если передать таблицу в реквизит формы простым присваиванием МояТаблица = ТЗ, платформа выдаст ошибку несоответствия типов. Нужен вызов ЗначениеВРеквизитФормы(), причём состав и типы колонок реквизита должны совпадать с колонками таблицы — лишние или несовпадающие по типу колонки вызовут ошибку преобразования.

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

Типичные ошибки
01
Вызов ТЗ.Показать() в тонком клиенте — окно не откроется, пользователь ничего не увидит
02
Присваивание ТЗ реквизиту формы напрямую вместо ЗначениеВРеквизитФормы — ошибка несоответствия типов
03
Несовпадение состава колонок реквизита и таблицы — ошибка преобразования данных формы
04
Создание ТаблицаЗначений в клиентской процедуре управляемой формы — объект недоступен на клиенте
05
Вывод сотен тысяч строк на форму — зависание интерфейса и расход памяти

Как проверить, что таблица показана корректно

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

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

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

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

Число строк на форме
Норма

Совпадает с ТЗ.Количество() в отладчике

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

Строк меньше — проверяйте права, отборы и преобразование

Колонки и типы данных
Норма

Все колонки видны, даты и числа в правильном формате

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

Колонки пустые или срезаны — несовпадение типов реквизита и ТЗ

Открытие формы с пустой таблицей
Норма

Форма открывается, таблица пустая, ошибок нет

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

Ошибка при открытии — код не учитывает пустой результат

Работа на тонком клиенте
Норма

Данные отображаются так же, как в толстом

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

Ошибка недоступности объекта — код рассчитан только на толстый клиент

Итог

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

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

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

Почему ТЗ.Показать() не работает в управляемом приложении?

Метод Показать() у таблицы значений ориентирован на интерфейс толстого клиента. В тонком и веб-клиенте он недоступен, а на сервере окно откроется не у пользователя. Для управляемых форм передавайте таблицу в реквизит формы через ЗначениеВРеквизитФормы() или выводите в табличный документ.

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

Нет, объект ТаблицаЗначений недоступен на тонком и веб-клиенте. Создавайте и заполняйте таблицу в серверной процедуре, а на клиент передавайте через реквизит формы — там она будет представлена как данные формы-коллекция, доступные для отображения и редактирования.

Как вывести таблицу, если состав колонок заранее неизвестен?

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

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

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

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

Поставьте точку останова после заполнения таблицы, нажмите Shift+F9 («Вычислить выражение»), введите имя переменной и разверните объект в дереве — будут видны колонки и строки со значениями. Это не требует никаких изменений в коде и работает в любом режиме клиента.

Таблица выводится на форму, но строк меньше, чем в запросе. В чём причина?

Чаще всего дело в правах доступа: запрос без ключевого слова РАЗРЕШЕННЫЕ всё равно подчиняется RLS и правам на объекты, поэтому под пользователем с ограничениями строк меньше. Также проверьте, не применён ли отбор в элементе формы и не теряются ли строки при преобразовании из-за дублирования имён колонок.