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