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

Программист 1С v8.3 (Обычные формы) Управленческий учет Торговля и дистрибуция
← На главную

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

Шаг 1. Подготовка структуры таблицы значений

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


// Создаем объект ТаблицаЗначений
ТЗСклады = Новый ТаблицаЗначений;    
ТЗСклады.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));

// Допустим, мы получили список складов запросом
Пока ВыборкаСкладов.Следующий() Цикл
    // Подготавливаем идентификатор колонки (без пробелов и спецсимволов)
    ИмяКолонкиОстаток = "Остаток_" + СтрЗаменить(ВыборкаСкладов.Наименование, " ", "_");
    ИмяКолонкиЦена = "Цена_" + СтрЗаменить(ВыборкаСкладов.Наименование, " ", "_");
    
    // Добавляем колонки с указанием типов
    ТЗСклады.Колонки.Добавить(ИмяКолонкиОстаток, Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
    ТЗСклады.Колонки.Добавить(ИмяКолонкиЦена, Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));
КонецЦикла;

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

Шаг 2. Связывание таблицы значений с элементом формы

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

  1. Назначаем таблицу значений элементу формы.
  2. Вызываем метод СоздатьКолонки(). Этот метод автоматически генерирует визуальные колонки в табличном поле на основе структуры колонок в ТаблицаЗначений.

// Привязываем таблицу к элементу формы
ЭлементыФормы.ТаблицаТоваров.Значение = ТЗСклады;

// Генерируем колонки в визуальном элементе
ЭлементыФормы.ТаблицаТоваров.СоздатьКолонки();

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

Шаг 3. Настройка многострочного отображения (колонки друг под другом)

Часто данных становится слишком много, и они не умещаются по ширине экрана. Посмотрим на ситуацию, когда нам нужно вывести Цена под колонкой Остаток для каждого склада, чтобы сэкономить место. Для этого в 1С используется свойство Положение у колонки табличного поля.

Выясним, какие значения может принимать это свойство:

Рассмотрим пример настройки таких «двухэтажных» строк:


// Настраиваем визуальное отображение складов
Для Каждого Колонка Из ЭлементыФормы.ТаблицаТоваров.Колонки Цикл
    Если Лев(Колонка.Имя, 6) = "Остаток" Тогда
        // Оставляем как есть или настраиваем заголовок
        Колонка.Заголовок = "Ост.";
    ИначеЕсли Лев(Колонка.Имя, 4) = "Цена" Тогда
        // Переносим цену под остаток
        Колонка.Положение = ПоложениеКолонки.НаСледующейСтроке;
        Колонка.Заголовок = "Цена";
    КонецЕсли;
КонецЦикла;

Оптимизация работы и полезные советы

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

1. Использование индексов для поиска данных. Если вы заполняете таблицу в цикле, используя метод Найти(), обязательно добавьте индекс по тем колонкам, по которым идет поиск (например, Номенклатура). Это в разы ускорит заполнение при большом количестве строк.

ТЗСклады.Индексы.Добавить("Номенклатура");

2. Очистка старых данных. Если форма предусматривает повторное формирование таблицы (например, при нажатии кнопки «Обновить»), не забывайте очищать не только строки, но и сами колонки, иначе при каждом нажатии у вас будут добавляться новые и новые колонки складов.


// Полная очистка перед перестроением
ЭлементыФормы.ТаблицаТоваров.Колонки.Очистить();
ТЗСклады.Колонки.Очистить();
ТЗСклады.Очистить();

3. Оформление ячеек. Чтобы визуально отделить один склад от другого в многострочном режиме, можно использовать событие ПриВыводеСтроки. Там мы можем раскрасить ячейки или изменить шрифт для определенных колонок через объект ОформлениеСтроки.Ячейки.

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

← На главную