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

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

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

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

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

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

Метод одинаково работает в толстом и тонком клиенте, на сервере и на клиенте, в обычных и управляемых формах. Различий в синтаксисе между платформами 8.2 и 8.3 нет, поэтому примеры из статьи применимы в любой современной конфигурации.

Метод Колонки.Удалить: синтаксис и варианты вызова

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

Наиболее читаемый и безопасный вариант — удаление по имени. Имя не зависит от позиции колонки, поэтому код не сломается, если порядок колонок изменится после доработки запроса или выгрузки.

bsl
Таблица.Колонки.Удалить("СуммаНДС");
// или через объект колонки:
Колонка = Таблица.Колонки.Найти("СуммаНДС");
Если Колонка <> Неопределено Тогда
    Таблица.Колонки.Удалить(Колонка);
КонецЕсли;

Удаление по индексу используют редко, в основном когда имя заранее неизвестно, а позиция колонки гарантирована структурой источника. Помните, что индексация колонок начинается с нуля: первая колонка имеет индекс 0.

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

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

Проверку выполняют методом Найти(), который возвращает объект колонки либо Неопределено, если колонка не найдена. Такой шаблон делает код устойчивым к изменениям источника данных.

Порядок безопасного удаления колонки
  1. 1
    Проверьте наличие колонки методом Колонки.Найти(ИмяКолонки)
  2. 2
    Если результат Неопределено — пропустите удаление или запишите предупреждение в журнал
  3. 3
    Вызовите Колонки.Удалить с найденным объектом или именем
  4. 4
    Убедитесь, что дальше по коду нет обращений к удалённой колонке
  5. 5
    Проверьте результат, выведя состав колонок в отладчике

Обращение к удалённой колонке в любом месте кода — например, Строка.СуммаНДС после её удаления — приведёт к ошибке «Поле объекта не обнаружено». Перед удалением полезно выполнить поиск по имени колонки по всему модулю, чтобы найти все места её использования.

Удаление нескольких колонок в цикле

Когда нужно убрать сразу несколько колонок, удобнее всего собрать их имена в массив или список значений и пройти по нему циклом. Это компактнее, чем несколько отдельных вызовов, и упрощает поддержку: список лишних колонок легко пополнить или сократить.

bsl
УдаляемыеКолонки = Новый Массив;
УдаляемыеКолонки.Добавить("СуммаНДС");
УдаляемыеКолонки.Добавить("СтавкаНДС");
УдаляемыеКолонки.Добавить("СлужебныйПризнак");

Для Каждого ИмяКолонки Из УдаляемыеКолонки Цикл
    Если Таблица.Колонки.Найти(ИмяКолонки) <> Неопределено Тогда
        Таблица.Колонки.Удалить(ИмяКолонки);
    КонецЕсли;
КонецЦикла;

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

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

Удаление колонок после запроса и при работе с формой

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

Отдельный случай — таблица значений, связанная с реквизитом формы. Если таблица отображается на управляемой форме, удаление колонки программно из коллекции Колонки не удалит элемент формы, связанный с этой колонкой. Элемент останется на форме с пустыми данными, а при обращении к нему возможны ошибки. Элементы формы нужно удалять отдельно через коллекцию Элементы либо пересоздавать реквизит формы методом ИзменитьРеквизиты().

Альтернативы удалению: когда колонку лучше не трогать

Не всегда удаление — оптимальное решение. Если лишние колонки мешают только при выводе, проще ограничить состав полей на этапе формирования: в запросе перечислить только нужные поля, а не использовать ВЫБРАТЬ *. Это снимает проблему до её появления.

Если таблица нужна в нескольких местах с разным составом колонок, лучше оставить исходную таблицу нетронутой и создавать производные копии через Скопировать() с последующим удалением лишнего в копии. Так исходные данные остаются доступными для повторного использования и отладки.

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

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

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

СкопироватьКолонки() с нужными именами

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

Ограничение полей в запросе

Лучший вариант, если таблица формируется запросом: лишние колонки просто не попадают в результат.

Скопировать() и удалить в копии

Подходит, когда исходная таблица ещё нужна целиком. Требует дополнительной памяти на копию.

Типичные ошибки и как их избежать

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

Типичные ошибки
01
Удаление колонки без проверки её существования — при отсутствии колонки код падает с ошибкой
02
Удаление внутри цикла обхода коллекции Колонки — из-за сдвига индексов часть колонок пропускается
03
Обращение к удалённой колонке дальше по коду — ошибка «Поле объекта не обнаружено»
04
Ожидание, что удалится элемент формы — реквизит и элемент формы удаляются отдельными механизмами
05
Удаление колонки, участвующей в индексе таблицы — индекс становится некорректным, его нужно пересоздать

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

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

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

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

Колонки.Найти(ИмяКолонки) возвращает Неопределено

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

Колонка по-прежнему находится — удаление не выполнено или удалялась другая таблица

Целостность данных
Норма

В оставшихся колонках все строки на месте, Количество() строк не изменилось

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

Число строк изменилось — вероятно, удалялись не колонки, а строки

Работа дальнейшего кода
Норма

Модуль выполняется без ошибок обращения к полям

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

Ошибка «Поле объекта не обнаружено» — где-то осталось обращение к удалённой колонке

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

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

Можно ли восстановить удалённую колонку с данными?

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

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

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

Удалится ли колонка из таблицы на форме автоматически?

Нет. Для реквизита формы типа «ТаблицаЗначений» удаление колонки из коллекции не меняет описание реквизита и элементы формы. Используйте ИзменитьРеквизиты() для реквизита и удалите связанный элемент через коллекцию Элементы.

Что быстрее: удалить лишние колонки или скопировать нужные в новую таблицу?

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

Работает ли удаление колонок в мобильной платформе и веб-клиенте?

Да, метод Колонки.Удалить() доступен во всех клиентах и на сервере, включая веб-клиент и мобильную платформу. Синтаксис и поведение идентичны.

Как удалить колонку, имя которой известно только в переменной?

Передайте переменную напрямую: Таблица.Колонки.Удалить(ИмяПеременной). Метод принимает строку с именем, поэтому предварительно получать объект колонки не обязательно, но проверка через Найти() по-прежнему рекомендуется.

Итог

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

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