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

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Выясняем причину: почему данные не выводятся на форму?

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

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

Решение 1: Правильное связывание данных через свойства "Данные" и "Значение"

В обычных формах существует два основных способа связать табличное поле (элемент формы) с таблицей значений:

  1. Прямое присвоение значения. Этот способ использовался в обсуждении. Мы напрямую передаем таблицу значений в свойство Значение элемента формы:
    
    ЭлементыФормы.ТабТовары.Значение = ИзмененияКоличества;
    ЭлементыФормы.ТабТовары.СоздатьКолонки();
    
    Здесь метод СоздатьКолонки() является ключевым. Он заставляет элемент формы полностью перестроить свою структуру, удалив старые колонки и создав новые на основе переданной таблицы значений.
  2. Использование пути к данным (рекомендованный способ). Более надежным и правильным подходом является создание реквизита в самой форме (например, с именем ТоварыТаблица и типом ТаблицаЗначений). В конфигураторе у элемента формы ТабличноеПоле в свойстве Данные указывается имя этого реквизита.

    При таком подходе вам больше не нужно обращаться к коллекции ЭлементыФормы для изменения данных. Вы работаете напрямую с реквизитом формы, а визуальное поле обновляется автоматически:

    
    // Работаем напрямую с реквизитом формы
    ТоварыТаблица = ПолучитьТаблицуДанных(); 
    // Если структура колонок изменилась, обновляем визуальную часть
    ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();
    

Решение 2: Программное создание колонок без потери визуальных настроек

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


// Добавляем колонку в источник данных (в Таблицу Значений)
ТаблицаИсточник.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));

// Программно добавляем колонку в визуальный элемент управления
НоваяКолонка = ЭлементыФормы.ТабличноеПоле1.Колонки.Добавить("Сумма");
НоваяКолонка.Данные = "Сумма";
НоваяКолонка.ТекстШапки = "Итоговая сумма";
НоваяКолонка.Ширина = 12;

Решение 3: Оптимальное заполнение таблицы значений данными

На форуме предлагался вариант построчного заполнения таблицы значений в цикле с использованием метода ЗаполнитьЗначенияСвойств. Разберем этот пример:


Для Каждого СтрокаТЗ Из ИсточникДанных Цикл
    НоваяСтрока = Причина.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТЗ);
КонецЦикла;

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

Для быстрой вставки больших объемов данных используйте встроенный метод платформы Загрузить(). Он работает на уровне платформы (C++) и мгновенно переносит все данные, сопоставляя колонки по именам:


// Если структура колонок совпадает
РеквизитФормыТаблица.Загрузить(ТаблицаИсточник);

Также можно воспользоваться методом Скопировать(), чтобы создать полную копию структуры и данных исходной таблицы:


РеквизитФормыТаблица = ТаблицаИсточник.Скопировать();
ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();

Дополнительные настройки для удобства работы пользователей

Чтобы выводимая таблица значений была не просто статичной картинкой, а удобным инструментом для работы, обратите внимание на следующие нюансы:

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

← На главную