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

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

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

Общий алгоритм реализации задачи

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

  1. Создание реквизита формы: Мы должны объявить в памяти формы структуру, которая будет хранить данные. На этом этапе используется метод ИзменитьРеквизиты().
  2. Создание визуальных элементов: Реквизит — это только данные. Чтобы пользователь их увидел, нам нужно добавить на форму элемент типа ТаблицаФормы и соответствующие колонки.
  3. Заполнение данными: На последнем этапе мы копируем данные из нашей программной таблицы в созданный реквизит формы с помощью метода ЗначениеВРеквизитФормы().

Шаг 1: Создание программных реквизитов формы

Рассмотрим ситуацию, когда у нас есть некоторая переменная ТаблицаОбъект, которую нужно отобразить. Сначала нам нужно подготовить массив новых реквизитов. Важно понимать, что метод ИзменитьРеквизиты принимает массив объектов РеквизитФормы.

Разберем пример кода, который создает структуру таблицы с одной колонкой "Контрагент":


ИмяТаблицыНаФорме = "ДинамическаяТаблица";
МассивДобавляемыхРеквизитов = Новый Массив;

// Добавляем саму таблицу (контейнер)
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(ИмяТаблицыНаФорме, Новый ОписаниеТипов("ТаблицаЗначений")));

// Добавляем колонку в эту таблицу. Третий параметр указывает на родителя — нашу таблицу.
ОписаниеТипаСтрока = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150));
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Контрагент", ОписаниеТипаСтрока, ИмяТаблицыНаФорме, "Контрагент"));

// Выполняем изменение структуры формы на сервере
ЭтаФорма.ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);

Важный момент: Метод ИзменитьРеквизиты является "тяжелой" операцией, так как он вызывает полную переинициализацию формы. Старайтесь собирать все изменения в один массив и вызывать метод один раз.

Шаг 2: Создание элементов управления на форме

После того как реквизиты созданы, форма "знает" о существовании таблицы, но не показывает ее. Нам нужно добавить элементы в коллекцию Элементы. Рассмотрим, как это сделать правильно:


// Добавляем саму таблицу на форму
ТаблицаФормы = Элементы.Добавить(ИмяТаблицыНаФорме, Тип("ТаблицаФормы"));
ТаблицаФормы.ПутьКДанным = ИмяТаблицыНаФорме;
ТаблицаФормы.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Верх;

// Добавляем колонку (поле) внутрь таблицы
НоваяКолонка = Элементы.Добавить("КолонкаКонтрагент", Тип("ПолеФормы"), ТаблицаФормы);
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка.ПутьКДанным = ИмяТаблицыНаФорме + ".Контрагент";
НоваяКолонка.Заголовок = "Наименование контрагента";

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

Шаг 3: Заполнение данными и работа над ошибками

Теперь выясним причину распространенной ошибки: "Недопустимое значение параметра (параметр номер '2')" при вызове метода ЗначениеВРеквизитФормы. Эта ошибка возникает, если структура или типы данных в исходной ТаблицеЗначений не совпадают на 100% с тем, что мы описали в РеквизитФормы.

Проанализируем пример правильного заполнения, где типы строго соответствуют:


// 1. Создаем исходную таблицу значений
ТЗ = Новый ТаблицаЗначений;
// ТИП ДОЛЖЕН СОВПАДАТЬ С ОПИСАНИЕМ В РЕКВИЗИТЕ!
ТЗ.Колонки.Добавить("Контрагент", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150)));

// 2. Заполняем данными
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Контрагент = "ООО Ромашка";

// 3. Передаем данные в реквизит формы
ЗначениеВРеквизитФормы(ТЗ, ИмяТаблицыНаФорме);

Если в ТаблицеЗначений колонка будет иметь тип "Строка" неограниченной длины, а в реквизите формы — "Строка(150)", метод ЗначениеВРеквизитФормы выдаст ошибку. Посмотрим на лайфхак: чтобы избежать ручного сопоставления типов, можно сначала создать ТаблицуЗначений, а затем формировать массив реквизитов, обходя коллекцию ТЗ.Колонки.

Дополнительные рекомендации по оптимизации

Рассмотрим несколько полезных советов для профессиональной работы с динамическими формами:

  1. Очистка старых реквизитов: Если вы планируете пересоздавать таблицу (например, при нажатии кнопки "Обновить структуру"), вам нужно сначала удалить старые реквизиты. Для этого передайте массив имен удаляемых реквизитов в первый параметр метода ИзменитьРеквизиты(МассивДобавляемых, МассивУдаляемых).
  2. Командная панель: Чтобы у программной таблицы появились стандартные кнопки (Добавить, Удалить), установите свойство КоманднаяПанель или создайте группу типа КоманднаяПанель и назначьте ее таблице.
  3. События: Если вам нужно обрабатывать нажатие на колонку или изменение данных, используйте метод УстановитьДействие() для элемента формы. Помните, что обработчик должен быть &НаКлиенте и помечен ключевым словом Экспорт.

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

← На главную