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