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