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

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

Таблица значений как реквизит формы в 1С

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

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

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

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

Зачем нужна таблица значений на форме и когда она уместна

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

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

Сравнение вариантов

Таблица значений (реквизит формы)

Полный контроль из кода, данные не хранятся в базе. Подходит для временных и расчётных данных. Ограничение: нет встроенных механизмов запросов и постраничной загрузки.

Табличная часть объекта

Данные сохраняются вместе с документом или справочником. Подходит, если строки — часть бизнес-объекта. Не годится для временных данных.

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

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

Как создать реквизит формы с типом «Таблица значений»

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

Для каждой колонки добавьте подчинённый реквизит с именем и типом: Номенклатура (СправочникСсылка.Номенклатура), Количество (Число), Комментарий (Строка) и так далее. Типы колонок важно задать сразу и точно: от них зависит вид элемента управления в ячейке, проверка ввода и сортировка. Составной тип допустим, но усложняет ввод и отображение.

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

Как вывести таблицу на форму и настроить колонки

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

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

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

Как заполнить таблицу программно

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

&НаСервере

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

ТаблицаДанных.Очистить();

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

Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 100

| Номенклатура.Ссылка КАК Номенклатура,

| Номенклатура.Код КАК Код

|ИЗ Справочник.Номенклатура КАК Номенклатура";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

Строка = ТаблицаДанных.Добавить();

Строка.Номенклатура = Выборка.Номенклатура;

Строка.Код = Выборка.Код;

КонецЦикла;

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

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

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

bsl
&НаСервере
Процедура ЗагрузитьИзТЗ(ТЗ)
    ЗначениеВРеквизитФормы(ТЗ, "ТаблицаДанных");
КонецПроцедуры

Изменение структуры таблицы программно

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

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

События таблицы и интерактивная работа

Для элемента «Таблица» доступны события: ПриИзменении, ПередНачаломДобавления, ПередУдалением, ПриОкончанииРедактирования, Выбор. Через них реализуют контроль ввода: например, в ПередУдалением задают вопрос пользователю и при отказе устанавливают Отказ = Истина.

Текущая строка таблицы доступна через Элементы.ТаблицаДанных.ТекущиеДанные — это объект ДанныеФормыЭлементКоллекции. Через него читают и меняют значения ячеек активной строки. Для пересчёта связанных колонок (цена × количество = сумма) используют событие ПриИзменении у конкретного поля-колонки.

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

Типовые ошибки и ограничения

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

Вторая группа ошибок — типы колонок. Если колонка объявлена как Строка, а в неё пытаются поместить ссылку, отображение и сортировка будут работать некорректно. Обратная ситуация — колонка ссылочного типа без ограничения состава — приводит к тому, что в ячейке доступен выбор из всех справочников. Всегда сужайте тип до конкретного объекта.

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

Типичные ошибки
01
Заполнение локальной переменной вместо реквизита формы — данные не отображаются на форме
02
Изменение структуры колонок без сохранения данных — введённые строки теряются
03
Составной тип колонки без необходимости — усложняет ввод и ломает сортировку
04
Загрузка огромной таблицы целиком — форма тормозит из-за сериализации при каждом серверном вызове
05
Попытка добавить колонку на клиенте — метод ИзменитьРеквизиты доступен только на сервере

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

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

Полезно проверить граничные случаи: пустая таблица, одна строка, таблица с большим числом строк, отказ от удаления в обработчике. Такие проверки быстро выявляют ошибки в событиях и в логике заполнения.

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

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

Отображение данных
Норма

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

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

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

Сохранность при серверных вызовах
Норма

После нажатия любой кнопки содержимое таблицы сохраняется

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

Строки исчезают после серверного вызова — проверьте ИзменитьРеквизиты и флаг сохраняемых данных

Типы колонок
Норма

В ссылочной колонке открывается выбор нужного справочника, числа сортируются как числа

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

Все значения ведут себя как строки — тип колонки задан неверно или составной

Часто задаваемые вопросы

Чем таблица значений на форме отличается от динамического списка?

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

Можно ли добавить колонку в таблицу формы на клиенте?

Нет. Изменение структуры реквизитов формы выполняется только на сервере методом ИзменитьРеквизиты(). На клиенте можно менять только значения ячеек и свойства элементов, например видимость колонки.

Почему данные таблицы пропадают после серверного вызова?

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

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

На сервере получите объект документа, очистите его табличную часть и в цикле перенесите строки из реквизита формы, копируя значения одноимённых колонок. После записи объекта данные сохранятся в базе.

Есть ли ограничение на количество строк в таблице значений формы?

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

Как сделать колонку таблицы недоступной для редактирования?

Установите свойство «ТолькоПросмотр» у элемента-колонки в редакторе формы или программно: Элементы.ТаблицаДанныхКод.ТолькоПросмотр = Истина. Если редактирование должно зависеть от данных строки, управляйте свойством в обработчике ПриАктивизацииСтроки.

Итог

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

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