В практике разработки на платформе 1С 8.3 часто возникают ситуации, когда структура данных на форме заранее неизвестна и должна формироваться динамически. Одной из самых востребованных задач является программное создание реквизита типа ТаблицаЗначений. В этой статье мы подробно разберем, как избежать распространенных ошибок при вызове конструкторов, как правильно типизировать данные и визуализировать таблицу на управляемой форме.
Проанализируем ситуацию: при попытке создать реквизит многие разработчики передают массив типов напрямую в конструктор РеквизитФормы. Это приводит к ошибке: "Недопустимое значение параметра (параметр номер 2)".
Выясним причину. Согласно синтакс-помощнику, второй параметр конструктора РеквизитФормы ожидает объект типа ОписаниеТипов, а не простой массив. Даже если массив содержит правильный тип "ТаблицаЗначений", платформа не сможет его обработать без обертки.
Рассмотрим правильный вариант инициализации базового реквизита таблицы:
// Правильный способ инициализации реквизита-таблицы
ИмяТЗ = "МояДинамическаяТаблица";
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("ТаблицаЗначений"));
// Обязательно используем Новый ОписаниеТипов
ОписаниеТиповТЗ = Новый ОписаниеТипов(МассивТипов);
НовРеквизит = Новый РеквизитФормы(ИмяТЗ, ОписаниеТиповТЗ, , "Подпись таблицы");
Процесс создания полноценной таблицы состоит из двух этапов: регистрации реквизита в структуре формы и создания колонок, которые будут принадлежать этой таблице. Проанализируем, как это реализовать одной операцией.
Разберем пример кода, который добавляет таблицу и одну текстовую колонку в неё:
&НаСервере
Процедура СоздатьТаблицуНаФорме()
ДобавляемыеРеквизиты = Новый Массив;
// 1. Создаем саму таблицу
ОписаниеТиповТЗ = Новый ОписаниеТипов("ТаблицаЗначений");
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Таблица", ОписаниеТиповТЗ));
// 2. Создаем колонку.
// Третий параметр "Таблица" указывает, что колонка принадлежит созданному выше реквизиту.
ОписаниеТиповСтрока = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(100));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Наименование", ОписаниеТиповСтрока, "Таблица"));
// 3. Изменяем структуру формы
ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
КонецПроцедуры
Важный момент: Обратите внимание, что при создании колонки в конструктор РеквизитФормы передается имя родительского реквизита (строка "Таблица"). Это критически важно для иерархической структуры управляемой формы.
После вызова метода ИзменитьРеквизиты данные появились в памяти сервера, но пользователь их не видит. Чтобы таблица отобразилась на экране, нам нужно программно создать элементы управления. Рассмотрим этот процесс подробнее.
ТаблицаФормы.ПутьКДанным.Проанализируем пример кода для визуализации:
// Добавляем таблицу на форму
ЭлементТаблица = Элементы.Добавить("ТаблицаВид", Тип("ТаблицаФормы"));
ЭлементТаблица.ПутьКДанным = "Таблица";
// Добавляем колонку в таблицу
ЭлементКолонка = Элементы.Добавить("ТаблицаНаименование", Тип("ПолеФормы"), ЭлементТаблица);
ЭлементКолонка.Вид = ВидПоляФормы.ПолеВвода;
ЭлементКолонка.ПутьКДанным = "Таблица.Наименование";
Метод ИзменитьРеквизиты является одной из самых ресурсоемких операций на платформе 1С. При его вызове происходит полная переинициализация структуры формы, что требует значительных затрат времени сервера и трафика между сервером и клиентом.
Золотое правило разработки: Никогда не вызывайте ИзменитьРеквизиты в цикле. Если вам нужно добавить 20 колонок, сначала соберите их все в один массив, а затем вызовите метод ИзменитьРеквизиты один раз. Это значительно ускорит работу интерфейса.
Нужно четко понимать разницу между объектом ТаблицаЗначений в языке 1С и реквизитом формы того же типа. Реквизит формы — это специализированный объект, оптимизированный для отображения, у него нет многих привычных методов прикладного программирования (например, методов НайтиСтроки() или возможности работы в запросах).
Если вам нужно выполнить сложные вычисления с данными таблицы, выполним следующие шаги:
ТЗОбъект = РеквизитФормыВЗначение("Таблица");ТаблицаЗначений.ЗначениеВРеквизитФормы(ТЗОбъект, "Таблица");Если ваша динамическая таблица должна реагировать на действия пользователя (например, при изменении значения в ячейке), вам потребуется программно назначить обработчики событий. Выясним, как это сделать правильно.
Используйте метод УстановитьДействие для созданного элемента формы. Помните, что процедура-обработчик в модуле формы должна иметь признак &НаКлиенте и быть объявлена как Экспорт.
&НаКлиенте
Процедура ТаблицаНаименованиеПриИзменении(Элемент) Экспорт
// Логика обработки изменения
КонецПроцедуры
// В коде создания элементов:
ЭлементКолонка.УстановитьДействие("ПриИзменении", "ТаблицаНаименованиеПриИзменении");
Иногда требуется не только добавить, но и удалить созданные ранее данные. Для этого используется тот же метод ИзменитьРеквизиты, но массив имен передается во втором параметре.
Важно помнить: нельзя удалить реквизиты, созданные в конфигураторе. Удалению подлежат только те объекты, которые были добавлены программно. Перед удалением реквизита обязательно удалите все связанные с ним визуальные элементы методом Элементы.Удалить(), иначе платформа выдаст критическую ошибку при попытке обновления интерфейса.
Рассмотрим пример очистки:
МассивУдаляемых = Новый Массив;
МассивУдаляемых.Добавить("Таблица");
// Сначала удаляем визуализацию
Элемент = Элементы.Найти("ТаблицаВид");
Если Элемент <> Неопределено Тогда
Элементы.Удалить(Элемент);
КонецЕсли;
// Затем удаляем данные
ЭтаФорма.ИзменитьРеквизиты(, МассивУдаляемых);
Тщательное следование этим правилам позволит вам создавать гибкие и производительные интерфейсы в 1С, корректно работающие с динамическими структурами данных.