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

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

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

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

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

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

Ниже разобраны оба сценария с готовым кодом, варианты для динамических списков и табличных частей, а также типичные ошибки, из-за которых данные не появляются на форме.

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

В обычных формах (платформа 8.2/8.3 в режиме обычного приложения) табличное поле имеет свойство «Данные», в котором указывается путь к таблице значений — реквизиту формы или переменной модуля. Если свойство не заполнено, можно присвоить таблицу напрямую: ЭлементыФормы.ТабличноеПоле1.Значение = ТаблицаЗначений;. После этого поле само построит колонки по структуре таблицы, если они не созданы вручную.

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

Загрузка в обычную форму: метод Загрузить и свойство Данные

Если табличное поле привязано к реквизиту формы типа «ТаблицаЗначений», используйте метод Загрузить() — он переносит строки из источника в реквизит с сохранением типов колонок:

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

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

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

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

НоваяСтрока = ТЗ.Добавить();

НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("0000001");

НоваяСтрока.Количество = 10;

Товары.Загрузить(ТЗ);

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

Метод Загрузить() полностью очищает реквизит перед переносом. Если нужно добавить строки к существующим, перебирайте таблицу-источник в цикле и используйте Товары.Добавить() с заполнением свойств строки.

Загрузка в управляемую форму: ЗначениеВРеквизитФормы

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

&НаСервере

Процедура ЗагрузитьДанныеНаСервере()

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ Номенклатура, Количество ИЗ РегистрНакопления.Остатки.Остатки";

ТЗ = Запрос.Выполнить().Выгрузить();

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

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

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

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

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

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

Табличная часть документа или справочника

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

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

Табличное поле, связанное с динамическим списком, нельзя заполнить таблицей значений напрямую — оно отображает результат запроса. Варианты обхода: установить произвольный запрос динамического списка с временной таблицей (параметром-таблицей через конструкцию ВЫБРАТЬ ... ПОМЕСТИТЬ и передачей ТЗ как параметра запроса) либо заменить источник данных на реквизит типа «ТаблицаЗначений».

Способы загрузки данных в табличное поле

Загрузить() в реквизит/ТЧ

Быстро и просто; подходит когда структура колонок совпадает. Полностью замещает текущие данные.

ЗначениеВРеквизитФормы()

Стандарт для управляемых форм; требует серверного контекста и совпадения имён колонок.

Цикл с Добавить()

Позволяет фильтровать и преобразовывать строки на лету; медленнее на больших объёмах.

Параметр-таблица в динамическом списке

Единственный способ показать произвольную ТЗ через динамический список; сложнее в настройке, список становится недоступен для изменения.

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

После загрузки проверьте, что табличное поле действительно отображает строки: откройте форму в режиме предприятия и убедитесь, что количество строк соответствует источнику, а типизированные колонки (даты, ссылки, числа) показывают значения, а не пустые ячейки. Если данные не видны, первым делом сверьте свойство «ПутьКДанным» табличного поля и имена колонок.

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

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

Производительность и ограничения

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

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

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

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

Строки на форме
Норма

Количество строк совпадает с источником, все колонки заполнены

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

Строк нет или часть колонок пуста — проверяйте ПутьКДанным и имена колонок

Типы данных
Норма

Ссылки отображаются представлениями, даты — в формате даты

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

Вместо значений пусто или строки вида «Объект» — несовпадение типов колонок

Скорость формы
Норма

Форма открывается и прокручивается без задержек

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

Заметные паузы — сократите объём загружаемых данных

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

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

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

Почему после ЗначениеВРеквизитФормы таблица на форме пустая?

Чаще всего не совпадают имена колонок таблицы значений и реквизита формы либо табличное поле привязано к другому реквизиту. Также проверьте, что вызов выполняется на сервере и таблица-источник действительно содержит строки.

Как добавить строки к уже загруженным, не очищая таблицу?

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

Как загрузить результат запроса сразу в табличное поле?

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

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

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

Что делать, если колонка содержит тип, недопустимый в данных формы?

Преобразуйте значение в допустимый тип: уникальный идентификатор — в строку через Строка(Ссылка.УникальныйИдентификатор()), хранилище значения — извлеките содержимое. Добавьте в реквизит формы колонку строкового типа для отображения.

Итог

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

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