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