К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как удалить колонки таблицы значений в 1С

Как удалить колонки таблицы значений в 1С: метод Колонки.Удалить(), удаление по индексу и имени, проверка существования колонки, типичные ошибки и примеры кода.

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

Важно понимать: удаление колонки — необратимая операция. Вместе с колонкой удаляются все данные, хранящиеся в ней по всем строкам таблицы. Если данные ещё понадобятся, их нужно предварительно скопировать в другую таблицу или структуру. Восстановить удалённую колонку штатными средствами нельзя — только пересоздать и заново заполнить.

Ниже разобраны основные способы удаления колонок, проверки перед удалением, массовое удаление по условию и типичные ошибки, которые приводят к падению кода или потере данных.

Базовый способ: метод Колонки.Удалить()

Основной инструмент — метод Удалить() у коллекции Колонки таблицы значений. Метод принимает один параметр, которым может быть имя колонки (строка), объект КолонкаТаблицыЗначений или её индекс (число). Все три варианта дают одинаковый результат — колонка исчезает из таблицы вместе с данными.

ТЗ = Новый ТаблицаЗначений;

ТЗ.Колонки.Добавить("Номенклатура");

ТЗ.Колонки.Добавить("Количество");

ТЗ.Колонки.Добавить("СлужебноеПоле");

// Удаление по имени

ТЗ.Колонки.Удалить("СлужебноеПоле");

// Удаление по объекту колонки

Колонка = ТЗ.Колонки.Найти("Количество");

Если Колонка <> Неопределено Тогда

ТЗ.Колонки.Удалить(Колонка);

КонецЕсли;

// Удаление по индексу (нумерация с нуля)

ТЗ.Колонки.Удалить(0);

Выбор варианта зависит от контекста. Имя удобно, когда колонка известна заранее. Объект колонки передают, когда он уже получен в цикле или через Найти(). Индекс используют реже — обычно при обходе колонок с конца таблицы, потому что после удаления индексы оставшихся колонок сдвигаются.

Проверка существования колонки перед удалением

Если передать в Удалить() имя несуществующей колонки, платформа выдаст ошибку выполнения, и код прервётся. В отладочных сценариях это помогает найти проблему, но в рабочем коде, где состав колонок формируется динамически, такое поведение недопустимо.

Стандартный приём — сначала проверить наличие колонки методом Найти(). Он возвращает объект колонки или Неопределено, если колонки с таким именем нет:

Если ТЗ.Колонки.Найти("СлужебноеПоле") <> Неопределено Тогда

ТЗ.Колонки.Удалить("СлужебноеПоле");

КонецЕсли;

Такая проверка особенно важна, когда таблица значений приходит из внешнего источника: из запроса с динамическим текстом, из файла Excel или CSV, из другой функции. Состав колонок в этих случаях не гарантирован, и жёсткое обращение по имени — частая причина падения обработок.

Удаление нескольких колонок по списку и по условию

Когда нужно убрать несколько колонок, удобно сформировать список имён и пройтись по нему циклом. Проверку существования внутри цикла лучше не пропускать — один отсутствующий элемент остановит всю обработку.

Удаляемые = Новый Массив;

Удаляемые.Добавить("ВременноеПоле1");

Удаляемые.Добавить("ВременноеПоле2");

Для Каждого ИмяКолонки Из Удаляемые Цикл

Если ТЗ.Колонки.Найти(ИмяКолонки) <> Неопределено Тогда

ТЗ.Колонки.Удалить(ИмяКолонки);

КонецЕсли;

КонецЦикла;

Удаление всех колонок кроме нужных

Обратная задача — оставить только «белый список» колонок. Здесь нельзя удалять колонки, одновременно перебирая коллекцию ТЗ.Колонки в прямом цикле: изменение коллекции во время итерации приводит к пропуску элементов. Надёжный приём — сначала собрать имена на удаление в отдельный массив, затем удалять:

Оставить = Новый Массив;

Оставить.Добавить("Номенклатура");

Оставить.Добавить("Сумма");

КУдалению = Новый Массив;

Для Каждого Колонка Из ТЗ.Колонки Цикл

Если Оставить.Найти(Колонка.Имя) = Неопределено Тогда

КУдалению.Добавить(Колонка.Имя);

КонецЕсли;

КонецЦикла;

Для Каждого ИмяКолонки Из КУдалению Цикл

ТЗ.Колонки.Удалить(ИмяКолонки);

КонецЦикла;

Типичные ошибки
01
Удаление колонок в цикле прямого перебора коллекции Колонки — часть элементов пропускается из-за сдвига индексов
02
Вызов Удалить() с именем без проверки Найти() — код падает, если колонки нет
03
Удаление колонки, по которой построен индекс или которая используется в отборе далее по коду — последующие обращения дают ошибку

Альтернатива: новая таблица с нужными колонками

Не всегда удаление — оптимальный путь. Если нужно оставить малую часть колонок, а данные ещё и преобразовать, проще создать новую таблицу значений с требуемым составом колонок и скопировать в неё строки. Это особенно удобно при подготовке таблицы для передачи в другую процедуру или для выгрузки.

Для копирования данных без лишних колонок также подходит связка ВыгрузитьКолонку() / ЗагрузитьКолонку() для отдельных полей либо запрос: можно поместить таблицу во временную таблицу и выбрать только нужные поля — результат запроса вернёт новую таблицу без лишних колонок. Этот способ хорош, когда одновременно нужна фильтрация или группировка строк.

Сравнение подходов

Колонки.Удалить()

Подходит, когда удаляется одна или несколько колонок из готовой таблицы. Ограничение: данные колонки теряются безвозвратно

Новая таблица с копированием

Подходит, когда оставляемых колонок мало или нужно изменить типы. Требует дополнительного кода и памяти на копию

Запрос к таблице значений

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

Особенности для таблиц на форме и связанных данных

Если таблица значений является реквизитом управляемой формы и отображается пользователю, удаление колонки программно изменит структуру данных, но элемент формы, связанный с этой колонкой, может остаться и начнёт выдавать ошибку «Поле не найдено». При динамическом изменении состава колонок на форме элементы нужно пересоздавать или скрывать программно через Элементы.

Отдельный случай — дерево значений: у него колонки удаляются тем же методом Колонки.Удалить(), синтаксис полностью аналогичен. А вот у табличной части объекта (документа, справочника) колонки программно удалить нельзя — её состав определяется метаданными конфигурации и меняется только в конфигураторе.

Проверка результата и типичные ошибки

После удаления убедитесь, что таблица пришла в ожидаемое состояние. Быстрая проверка — сравнить количество колонок до и после, а также убедиться, что нужные колонки на месте:

// Контроль после удаления

Если ТЗ.Колонки.Найти("СлужебноеПоле") = Неопределено Тогда

// Колонка успешно удалена

КонецЕсли;

КоличествоКолонок = ТЗ.Колонки.Количество();

Кроме уже упомянутых ошибок с несуществующими именами и удалением в цикле, встречается проблема с регистром имён: в обычном синтаксисе платформа ищет колонку без учёта регистра, однако при работе через Выполнить() или внешние компоненты поведение может отличаться. Ещё одна частая ситуация — удаление колонки, которая затем используется в Найти(), НайтиСтроки() или Сортировать(): вызов завершится ошибкой, поэтому порядок операций в коде стоит перепроверить.

Контрольные точки

Как проверить результат

Состав колонок после удаления
Норма

Колонки.Найти() по удалённому имени возвращает Неопределено, нужные колонки на месте

Тревожный признак

Удалилась не та колонка или осталась колонка, которая должна была быть удалена

Данные в оставшихся колонках
Норма

Значения в строках соответствуют исходным

Тревожный признак

Данные сместились или потеряны — признак удаления по неверному индексу

Дальнейшая работа кода
Норма

Найти(), НайтиСтроки(), Сортировать() отрабатывают без ошибок

Тревожный признак

Ошибка «Колонка не найдена» — где-то ниже по коду используется удалённая колонка

Когда удалять колонки не нужно вовсе

Иногда задачу «удалить колонку» на самом деле решают другие приёмы. Если лишняя колонка мешает только при выводе пользователю — достаточно скрыть её в настройках таблицы формы или не включать в макет печатной формы. Если колонка мешает при выгрузке в файл — при формировании файла просто не записывайте это поле.

Физическое удаление оправдано, когда таблица передаётся дальше как самостоятельная структура данных, когда нужно сэкономить память на больших объёмах или когда состав колонок должен строго соответствовать ожиданиям вызываемой процедуры. В остальных случаях проще и безопаснее оставить таблицу как есть и работать только с нужными полями.

Итог

Что важно запомнить

Колонки удаляют методом ТЗ.Колонки.Удалить() по имени, объекту или индексу. Перед удалением по имени проверяйте наличие через Найти(), при массовом удалении собирайте список заранее, а не изменяйте коллекцию в цикле перебора. Удалённые данные не восстанавливаются — при сомнениях копируйте их заранее.

Частые вопросы

Можно ли восстановить удалённую колонку таблицы значений?

Штатно — нет. Метод Удалить() уничтожает колонку вместе со значениями всех строк. Если данные нужны, заранее скопируйте их: выгрузите колонку методом ВыгрузитьКолонку() в массив или скопируйте всю таблицу через Скопировать() до удаления.

Как удалить все колонки таблицы значений сразу?

Используйте метод ТЗ.Колонки.Очистить() — он удаляет все колонки и, соответственно, все данные таблицы. Если нужно очистить только строки, сохранив структуру колонок, вызывайте ТЗ.Очистить() у самой таблицы, а не у коллекции колонок.

Что произойдёт, если удалить колонку по несуществующему имени?

Платформа выдаст ошибку времени выполнения, и выполнение кода прервётся. Чтобы этого избежать, всегда проверяйте наличие колонки через ТЗ.Колонки.Найти(Имя) перед вызовом Удалить() — метод вернёт Неопределено, если колонки нет.

Можно ли удалить колонку табличной части документа программно?

Нет. Состав колонок табличной части жёстко определён в метаданных конфигурации и не изменяется встроенным языком. Удаление реквизита табличной части выполняется в конфигураторе и приводит к потере данных этого реквизита во всех объектах базы.

Почему при удалении колонок в цикле удаляется не всё?

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

Удаляются ли данные строк при удалении колонки?

Да, значения удалённой колонки теряются во всех строках таблицы. Сами строки и значения остальных колонок не затрагиваются — структура строк сохраняется, меняется только набор полей.