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

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

Как создать таблицу на форме в 1С

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

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

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

Выбор типа таблицы: динамический список или таблица значений

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

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

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

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

Данные из базы, автообновление, отборы и сортировка из коробки. Ограничение: нельзя свободно редактировать произвольные колонки, только через объекты базы.

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

Полный программный контроль над строками и колонками. Ограничение: данные живут только в сеансе формы, обновление — вручную кодом.

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

Когда строки нужно хранить в документе или справочнике. Ограничение: структура фиксируется в метаданных объекта.

Создание таблицы значений на форме

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

Далее раскройте созданный реквизит и добавьте в него колонки как подчинённые реквизиты: «Номенклатура» (тип СправочникСсылка.Номенклатура), «Количество» (тип Число, длина 15, точность 3), «Сумма» (тип Число). Состав и типы колонок должны соответствовать данным, которые вы будете загружать, иначе при присвоении значений получите ошибки преобразования типов.

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

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

Программное заполнение таблицы значений

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

&НаСервере

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

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

Запрос.Текст =

"ВЫБРАТЬ ПЕРВЫЕ 100

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

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

|ИЗ

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

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

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

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

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

1c
НоваяСтрока = ТаблицаДанных.Добавить();
НоваяСтрока.Номенклатура = ВыбраннаяНоменклатура;
НоваяСтрока.Количество = 1;
НоваяСтрока.Сумма = 0;

Создание динамического списка на форме

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

Флаг «Произвольный запрос» включайте только когда стандартного выбора основной таблицы недостаточно. При произвольном запросе желательно указать основную таблицу в настройках списка — тогда корректно будут работать стандартные команды «Создать», «Скопировать», «Удалить» и динамическое обновление при изменении данных.

Перетащите динамический список в элементы формы. Отборы и сортировку можно настроить декларативно в свойствах списка или программно через Список.КомпоновщикНастроек. Не заполняйте динамический список вручную построчно — это противоречит его назначению и ломает механизм выборки.

Настройка внешнего вида и поведения таблицы

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

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

Для обработки действий пользователя используйте события таблицы: Выбор (двойной щелчок), ПриАктивизацииСтроки, ПередУдалением, ПриОкончанииРедактирования. В них доступна текущая строка через Элементы.ТаблицаДанных.ТекущиеДанные.

Если таблица на форме должна реагировать на изменение отбора без перезаписи кода, выносите параметры в отдельные реквизиты формы и привязывайте их к параметрам запроса через обработчик ПриИзменении — так поведение останется прозрачным и легко отлаживается.
ПЗ
Практическое замечание

Частые ошибки и ограничения

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

Вторая группа ошибок — производительность. Выгружать в таблицу значений сотни тысяч строк нельзя: форма будет открываться долго и потреблять память сеанса. Для больших выборок используйте динамический список, который читает данные порциями. Ограничивайте выборку условиями и конструкцией ПЕРВЫЕ N.

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

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

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

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

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

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

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

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

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

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

Таблица пустая или часть колонок не заполнена

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

Форма открывается без заметной паузы

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

Задержка в секунды — признак избыточной выборки

Стандартные команды списка
Норма

Создать, скопировать, удалить работают

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

Команды недоступны — не указана основная таблица

Сохранность введённых данных
Норма

Изменения обрабатываются и сохраняются по задуманной логике

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

Данные пропадают после закрытия формы без предупреждения

FAQ

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

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

Почему таблица значений на форме пустая, хотя запрос возвращает строки?

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

Чем динамический список лучше таблицы значений для больших данных?

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

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

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

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

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

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

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

Итог

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

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