Разработка и Конфигурация · 10 мин
Как удалить колонку из таблицы значений в 1С
Как удалить колонку из таблицы значений 1С: метод Колонки.Удалить(), удаление по имени и индексу, проверка существования, типичные ошибки и примеры кода.
Таблица значений в 1С — один из самых используемых объектов для промежуточной обработки данных: выгрузки из запросов, накопление результатов расчётов, подготовка данных для отчётов. Часто после формирования таблицы оказывается, что часть колонок не нужна — они дублируют другие поля, содержат служебную информацию или просто занимают память. Удалить такую колонку можно штатными средствами встроенного языка, без пересоздания таблицы.
Для удаления колонок у таблицы значений существует коллекция Колонки с методом Удалить(). Метод принимает либо объект колонки, либо её индекс, поэтому перед удалением важно правильно определить, что именно удалять, и убедиться, что колонка существует. Попытка удалить несуществующую колонку приведёт к ошибке выполнения и остановке кода.
Ниже разобраны способы удаления по имени и по индексу, удаление нескольких колонок в цикле, проверка существования, ограничения для связанных объектов и типичные ошибки разработчиков.
Основной способ: метод Колонки.Удалить()
У объекта ТаблицаЗначений есть свойство Колонки — это коллекция типа КоллекцияКолонокТаблицыЗначений. У неё есть метод Удалить(), который принимает один параметр: либо объект колонки (КолонкаТаблицыЗначений), либо целочисленный индекс колонки в коллекции.
На практике чаще всего колонку удаляют по имени. Для этого её сначала находят методом Найти(), а результат передают в Удалить():
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Номенклатура");
ТЗ.Колонки.Добавить("Количество");
ТЗ.Колонки.Добавить("СлужебноеПоле");
// Удаление колонки по имени
ТЗ.Колонки.Удалить(ТЗ.Колонки.Найти("СлужебноеПоле"));
После выполнения колонка исчезает из коллекции вместе со всеми данными в строках таблицы. Восстановить её штатными средствами нельзя — если данные ещё понадобятся, их нужно предварительно сохранить в другую структуру или скопировать таблицу методом Скопировать() до удаления.
ТЗ.Колонки.Удалить(ТЗ.Колонки.Найти("СлужебноеПоле"));Удаление колонки по индексу
Метод Удалить() также принимает индекс колонки — целое число от нуля до количества колонок минус один. Такой вариант полезен, когда имя колонки заранее неизвестно, но известна её позиция, например при обработке произвольных выгрузок, где нужно убрать первую или последнюю колонку.
// Удалить первую колонку
Если ТЗ.Колонки.Количество() > 0 Тогда
ТЗ.Колонки.Удалить(0);
КонецЕсли;
// Удалить последнюю колонку
ИндексПоследней = ТЗ.Колонки.Количество() - 1;
Если ИндексПоследней >= 0 Тогда
ТЗ.Колонки.Удалить(ИндексПоследней);
КонецЕсли;
Работа с индексами требует осторожности: после удаления одной колонки индексы всех колонок правее неё смещаются на единицу. Если в цикле удалять колонки по возрастанию индексов, часть колонок будет пропущена. Безопасный приём — идти по коллекции с конца к началу.
Проверка существования колонки перед удалением
Если передать в Удалить() результат метода Найти() для несуществующей колонки, будет передано значение Неопределено, и платформа выдаст ошибку. Поэтому перед удалением по имени колонку нужно проверить.
Колонка = ТЗ.Колонки.Найти("СлужебноеПоле");
Если Колонка <> Неопределено Тогда
ТЗ.Колонки.Удалить(Колонка);
КонецЕсли;
Такая проверка особенно важна в универсальных процедурах, где состав таблицы значений формируется динамически и разработчик не гарантирует наличие конкретной колонки в каждом вызове. Альтернативный вариант — обернуть удаление в попытку, но явная проверка через Найти() читается лучше и не маскирует другие возможные ошибки.
- 1Определите имя или позицию колонки, которую нужно удалить
- 2Найдите колонку методом ТЗ.Колонки.Найти("ИмяКолонки")
- 3Проверьте, что результат не равен Неопределено
- 4Вызовите ТЗ.Колонки.Удалить() с найденным объектом или индексом
- 5Проверьте результат: ТЗ.Колонки.Количество() уменьшилось, Найти() по имени вернул Неопределено
Удаление нескольких колонок сразу
Когда нужно удалить несколько колонок по списку имён, удобно организовать цикл по массиву имён. Удаление по объекту колонки в этом случае безопасно: смещение индексов не влияет на поиск по имени.
УдаляемыеКолонки = Новый Массив;
УдаляемыеКолонки.Добавить("СлужебноеПоле");
УдаляемыеКолонки.Добавить("ВременныйПризнак");
Для Каждого ИмяКолонки Из УдаляемыеКолонки Цикл
Колонка = ТЗ.Колонки.Найти(ИмяКолонки);
Если Колонка <> Неопределено Тогда
ТЗ.Колонки.Удалить(Колонка);
КонецЕсли;
КонецЦикла;
Удаление всех колонок целиком
Если нужно полностью очистить структуру таблицы, проще не удалять колонки по одной, а использовать метод ТЗ.Колонки.Очистить() — он удаляет все колонки за один вызов. Учтите, что строки таблицы при этом теряют смысл: без колонок данные строк недоступны, поэтому обычно вместе с колонками очищают и строки методом ТЗ.Очистить() или просто создают новую таблицу значений.
Удаление колонок по условию
Иногда нужно удалить все колонки, подходящие под условие — например, все, чьи имена начинаются с определённого префикса. Здесь корректно идти по коллекции с конца к началу:
Для Индекс = 1 - ТЗ.Колонки.Количество() По 0 Цикл
ТекущийИндекс = -Индекс;
Если СтрНачинаетсяС(ТЗ.Колонки[ТекущийИндекс].Имя, "Вр_") Тогда
ТЗ.Колонки.Удалить(ТекущийИндекс);
КонецЕсли;
КонецЦикла;
Особенности для связанных объектов и форм
Если таблица значений связана с элементом формы (табличное поле, динамический список на её основе), удаление колонки изменит состав отображаемых данных. В управляемых формах реквизит типа «ТаблицаЗначений» и элементы формы создаются программно, поэтому удаление колонки потребует и удаления связанного элемента формы, иначе отобразится пустая или «битая» колонка.
Для таблиц, полученных выгрузкой результата запроса (Запрос.Выполнить().Выгрузить()), удаление колонок не влияет на сам запрос — меняется только локальная копия данных. Если колонка не нужна, эффективнее вообще не выбирать её в запросе: это сократит объём передаваемых данных и упростит код.
Отдельный случай — колонки, участвующие в индексах таблицы значений (метод Индексы.Добавить()). Перед удалением такой колонки индекс по ней следует удалить или пересоздать, иначе последующие операции поиска могут работать некорректно.
Альтернатива: копирование только нужных колонок
Когда нужно оставить небольшую часть колонок, а удалить большинство, удобнее работать «от обратного»: создать новую таблицу, скопировав только нужные колонки. Для этого у таблицы значений есть метод СкопироватьКолонки(), принимающий строку с перечнем имён колонок через запятую.
// Новая таблица только с двумя нужными колонками
НоваяТЗ = ТЗ.СкопироватьКолонки("Номенклатура,Количество");
// Если нужны и данные:
НоваяТЗ = ТЗ.Скопировать(, "Номенклатура,Количество");
Такой подход безопаснее при массовом сокращении структуры: не нужно следить за индексами, а исходная таблица остаётся нетронутой, что упрощает отладку. Минус — дополнительный расход памяти на время копирования, что заметно только на очень больших таблицах.
Сравнение вариантов
Подходит для удаления одной или нескольких колонок по имени/индексу. Изменяет исходную таблицу, требует проверки существования.
Подходит, когда нужно оставить меньшую часть колонок. Исходная таблица не меняется, но расходуется дополнительная память.
Оптимально, если таблица строится из запроса и колонка не нужна вообще. Самый экономный по ресурсам вариант.
Проверка результата после удаления
После удаления убедитесь, что структура таблицы соответствует ожиданиям. Основные контрольные точки: количество колонок уменьшилось на число удалённых, поиск по имени удалённой колонки возвращает Неопределено, а обращение к оставшимся колонкам в строках работает без ошибок.
// Контроль после удаления
Если ТЗ.Колонки.Найти("СлужебноеПоле") = Неопределено Тогда
// Колонка успешно удалена
КонецЕсли;
При отладке удобно вывести состав колонок в сообщение или журнал: перебрать ТЗ.Колонки в цикле и вывести имена. Это быстро показывает, что удалили именно то, что планировали, и не задели соседние колонки.
Как проверить результат
ТЗ.Колонки.Найти("Имя") вернул Неопределено
Колонка по-прежнему находится — удаление не выполнено
Уменьшилось ровно на число удалённых
Уменьшилось больше — удалены лишние колонки из-за смещения индексов
Обращения к оставшимся колонкам работают без ошибок
Ошибка «Поле не найдено» — код обращается к удалённой колонке
Что важно запомнить
Колонку удаляют методом ТЗ.Колонки.Удалить() с объектом колонки или индексом. Перед удалением по имени проверяйте существование через Найти(), при удалении нескольких колонок по индексам идите с конца коллекции, а для сокращения большого числа колонок рассмотрите копирование только нужных.
Частые вопросы
Можно ли удалить колонку, просто передав её имя строкой в Удалить()?
Нет. Метод Удалить() принимает объект колонки или числовой индекс. Строку с именем нужно сначала преобразовать в объект через ТЗ.Колонки.Найти("Имя") и передать результат.
Что происходит с данными в строках при удалении колонки?
Значения удалённой колонки теряются безвозвратно во всех строках таблицы. Если данные могут понадобиться, заранее скопируйте их в другую таблицу или структуру.
Как удалить колонку из таблицы значений на форме?
Для программно созданного реквизита формы недостаточно удалить колонку из таблицы — нужно также удалить связанный элемент формы и сам реквизит через ИзменитьРеквизиты(). Иначе на форме останется элемент, ссылающийся на несуществующие данные.
Как удалить все колонки таблицы значений одним действием?
Используйте ТЗ.Колонки.Очистить(). Если таблица после этого не нужна вовсе, проще присвоить переменной новый объект: ТЗ = Новый ТаблицаЗначений.
Почему после удаления колонки в цикле удаляются не те колонки?
Причина — смещение индексов: после каждого удаления колонки справа сдвигаются на одну позицию. Перебирайте коллекцию с конца к началу или удаляйте по объектам колонок, найденным через Найти().