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

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

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

Разбор типичной ошибки конструктора РеквизитФормы

Проанализируем ситуацию: при попытке создать реквизит многие разработчики передают массив типов напрямую в конструктор РеквизитФормы. Это приводит к ошибке: "Недопустимое значение параметра (параметр номер 2)".

Выясним причину. Согласно синтакс-помощнику, второй параметр конструктора РеквизитФормы ожидает объект типа ОписаниеТипов, а не простой массив. Даже если массив содержит правильный тип "ТаблицаЗначений", платформа не сможет его обработать без обертки.

Рассмотрим правильный вариант инициализации базового реквизита таблицы:


// Правильный способ инициализации реквизита-таблицы
ИмяТЗ = "МояДинамическаяТаблица";
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("ТаблицаЗначений"));

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

Пошаговый алгоритм создания таблицы с колонками

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

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


&НаСервере
Процедура СоздатьТаблицуНаФорме()
    
    ДобавляемыеРеквизиты = Новый Массив;
    
    // 1. Создаем саму таблицу
    ОписаниеТиповТЗ = Новый ОписаниеТипов("ТаблицаЗначений");
    ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Таблица", ОписаниеТиповТЗ));
    
    // 2. Создаем колонку. 
    // Третий параметр "Таблица" указывает, что колонка принадлежит созданному выше реквизиту.
    ОписаниеТиповСтрока = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(100));
    ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Наименование", ОписаниеТиповСтрока, "Таблица"));
    
    // 3. Изменяем структуру формы
    ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
    
КонецПроцедуры

Важный момент: Обратите внимание, что при создании колонки в конструктор РеквизитФормы передается имя родительского реквизита (строка "Таблица"). Это критически важно для иерархической структуры управляемой формы.

Визуализация: Создание элементов формы

После вызова метода ИзменитьРеквизиты данные появились в памяти сервера, но пользователь их не видит. Чтобы таблица отобразилась на экране, нам нужно программно создать элементы управления. Рассмотрим этот процесс подробнее.

  1. Создаем основной элемент управления — ТаблицаФормы.
  2. Связываем его с созданным реквизитом через свойство ПутьКДанным.
  3. Добавляем поля (колонки) внутрь таблицы.

Проанализируем пример кода для визуализации:


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

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

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

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

Золотое правило разработки: Никогда не вызывайте ИзменитьРеквизиты в цикле. Если вам нужно добавить 20 колонок, сначала соберите их все в один массив, а затем вызовите метод ИзменитьРеквизиты один раз. Это значительно ускорит работу интерфейса.

Работа с данными: Реквизит против Объекта

Нужно четко понимать разницу между объектом ТаблицаЗначений в языке 1С и реквизитом формы того же типа. Реквизит формы — это специализированный объект, оптимизированный для отображения, у него нет многих привычных методов прикладного программирования (например, методов НайтиСтроки() или возможности работы в запросах).

Если вам нужно выполнить сложные вычисления с данными таблицы, выполним следующие шаги:

  1. Преобразуем данные формы в объект: ТЗОбъект = РеквизитФормыВЗначение("Таблица");
  2. Проводим необходимые манипуляции (поиск, сортировка, расчеты) методами прикладного объекта ТаблицаЗначений.
  3. Возвращаем данные на форму: ЗначениеВРеквизитФормы(ТЗОбъект, "Таблица");

Программная установка обработчиков событий

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

Используйте метод УстановитьДействие для созданного элемента формы. Помните, что процедура-обработчик в модуле формы должна иметь признак &НаКлиенте и быть объявлена как Экспорт.


&НаКлиенте
Процедура ТаблицаНаименованиеПриИзменении(Элемент) Экспорт
    // Логика обработки изменения
КонецПроцедуры

// В коде создания элементов:
ЭлементКолонка.УстановитьДействие("ПриИзменении", "ТаблицаНаименованиеПриИзменении");

Удаление программных реквизитов

Иногда требуется не только добавить, но и удалить созданные ранее данные. Для этого используется тот же метод ИзменитьРеквизиты, но массив имен передается во втором параметре.

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

Рассмотрим пример очистки:


МассивУдаляемых = Новый Массив;
МассивУдаляемых.Добавить("Таблица");

// Сначала удаляем визуализацию
Элемент = Элементы.Найти("ТаблицаВид");
Если Элемент <> Неопределено Тогда
    Элементы.Удалить(Элемент);
КонецЕсли;

// Затем удаляем данные
ЭтаФорма.ИзменитьРеквизиты(, МассивУдаляемых);

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

← На главную