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