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

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

1С: как заполнить таблицу формы из таблицы значений

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

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

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

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

Как устроены таблица значений и таблица формы

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

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

Способ 1: метод Загрузить() для реквизита формы

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

Типовой код в серверной процедуре формы:

&НаСервере

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

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

ТЗ.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));

ТЗ.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));

// ... заполнение ТЗ данными, например из запроса

ТаблицаФормы.Загрузить(ТЗ);

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

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

Способ 2: ЗначениеВДанныеФормы для ДанныеФормыКоллекция

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

Для табличной части документа перенос выглядит так:

&НаСервере

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

ОбъектДокумента = РеквизитФормыВЗначение("Объект");

ОбъектДокумента.Товары.Загрузить(ТЗИзЗапроса);

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

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

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

bsl
ЗначениеВДанныеФормы(ТаблицаЗначенийИсточник, ЭтаФорма.РеквизитТаблица);

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

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

Если данные нужно собрать по интерактивным действиям пользователя, передавайте на сервер только параметры (отборы, даты, ссылки), а не сами данные. Это снижает объём трафика между клиентом и сервером и упрощает отладку.

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

Совпадение типов колонок и типичные ошибки

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

Вторая группа ошибок — типы. Если колонка таблицы значений содержит строку, а колонка формы ожидает ссылку на справочник, при загрузке возникнет ошибка преобразования. Формируйте колонки таблицы значений с явным ОписаниеТипов, совпадающим с типом реквизита формы. Если таблица получена из запроса, типы обычно уже корректны — запрос возвращает ссылки и примитивные типы в нужном виде.

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

Проверка результата и отладка

После загрузки убедитесь, что данные действительно на форме. Простой способ — сразу после Загрузить() проверить количество строк: ТаблицаФормы.Количество() должно совпадать с количеством строк источника. Если число нулевое, проблема в структуре колонок или в том, что источник пуст.

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

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

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

Количество строк реквизита после Загрузить()
Норма

Равно числу строк таблицы значений-источника

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

Ноль или меньше ожидаемого — проверяйте имена колонок и заполненность источника

Отображение на форме
Норма

Строки видны в табличном поле сразу после выполнения процедуры

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

Таблица пуста — проверьте, к какому реквизиту привязан элемент формы

Типы значений в колонках
Норма

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

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

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

FAQ

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

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

Чем отличается Загрузить() от ЗначениеВДанныеФормы()?

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

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

Выгрузите текущее содержимое реквизита методом Выгрузить(), присоедините к нему новые строки (например, через цикл или объединение таблиц), затем загрузите результат обратно методом Загрузить(). Либо добавляйте строки по одной через Реквизит.Добавить() на сервере.

Почему после Загрузить() таблица на форме пустая, хотя источник заполнен?

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

Можно ли заполнить табличную часть документа из таблицы значений?

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

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

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

Итог

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

Перенос из таблицы значений в таблицу формы выполняется только на сервере: методом Загрузить() для реквизита типа ТаблицаЗначений или через ЗначениеВДанныеФормы() для ДанныеФормыКоллекция. Следите за совпадением имён и типов колонок и проверяйте результат по количеству строк.