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