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

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

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

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

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

Важно понимать: у таблицы значений нет встроенного метода «изменить тип колонки» или «переименовать колонку» одной командой. Большинство изменений выполняется через комбинацию присвоения свойств объекта КолонкаТаблицыЗначений либо через добавление новой колонки с последующим переносом данных и удалением старой.

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

Как обратиться к колонке и изменить её имя

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

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

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

ТЗ.Колонки.Добавить("СтароеИмя", Новый ОписаниеТипов("Строка"));

// Переименование колонки

Колонка = ТЗ.Колонки.Найти("СтароеИмя");

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

Колонка.Имя = "НовоеИмя";

КонецЕсли;

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

Как изменить тип данных колонки

Прямого способа изменить тип существующей колонки нет — свойство ТипЗначения доступно только для чтения. Стандартный приём: создать новую колонку с нужным типом, перенести в неё данные из старой, затем удалить старую колонку.

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

// Меняем тип колонки "Количество" со Строки на Число

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

ТЗ.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число",,, Новый КвалификаторыЧисла(15, 2)));

Для Каждого Строка Из ТЗ Цикл

Попытка

Строка.Количество = Число(Строка.КоличествоСтарое);

Исключение

Строка.Количество = 0;

КонецПопытки;

КонецЦикла;

ТЗ.Колонки.Удалить("КоличествоСтарое");

Обратите внимание на обработку исключений: при конвертации строк в числа или даты всегда найдутся значения, которые не преобразуются. Без блока Попытка...Исключение обработка остановится на первом же «плохом» значении.

Как перенести данные из одной колонки в другую

Перенос значений между колонками — частная задача: например, данные загрузили из Excel в колонку с неправильным именем или нужно объединить две колонки в одну. Выполняется обычным циклом по строкам таблицы.

Для Каждого Строка Из ТЗ Цикл

Строка.НоваяКолонка = Строка.СтараяКолонка;

КонецЦикла;

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

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

Порядок смены типа колонки без потери имени
  1. 1
    Переименуйте старую колонку во временное имя
  2. 2
    Добавьте новую колонку с исходным именем и нужным типом
  3. 3
    Перенесите данные в цикле с обработкой ошибок преобразования
  4. 4
    Удалите временную колонку
  5. 5
    Проверьте результат на нескольких строках

Как добавить, вставить и удалить колонку

Метод Добавить() всегда помещает колонку в конец коллекции. Если нужна конкретная позиция (это важно при выводе таблицы на форму или в табличный документ), используйте метод Вставить(Индекс) — колонка займёт указанное место, а остальные сдвинутся.

// Колонка станет второй по счёту (индексация с нуля)

ТЗ.Колонки.Вставить(1, "Артикул", Новый ОписаниеТипов("Строка",,,, Новый КвалификаторыСтроки(50)));

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

ТЗ.Колонки.Удалить("ВременнаяКолонка");

При удалении колонки все данные в ней теряются безвозвратно. Если таблица заполнена в результате длительной обработки, перед удалением сделайте копию таблицы методом ТЗ.Скопировать() — это дешёвая страховка на этапе отладки.

Как изменить колонку таблицы значений на форме

Динамическое изменение реквизита формы

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

МассивДобавляемых = Новый Массив;

МассивДобавляемых.Добавить(Новый РеквизитФормы("НоваяКолонка",

Новый ОписаниеТипов("Строка"), "ТаблицаДанных", "Новая колонка"));

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

МассивУдаляемых.Добавить("ТаблицаДанных.СтараяКолонка");

ИзменитьРеквизиты(МассивДобавляемых, МассивУдаляемых);

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

Обмен через значение

Более простой путь для разовых операций — забрать таблицу с формы через РеквизитФормыВЗначение("ТаблицаДанных"), выполнить все изменения обычными методами таблицы значений, затем вернуть результат через ЗначениеВРеквизитФормы(). Способ удобен, но на больших таблицах создаёт лишние копии данных в памяти.

Способы изменения колонки на форме

ИзменитьРеквизиты()

Правильный способ для динамических форм; требует отдельной настройки элементов формы

РеквизитФормыВЗначение + ЗначениеВРеквизитФормы

Проще в коде, но создаёт копию таблицы; подходит для разовых операций

Пересоздание таблицы с нуля

Радикальный вариант: удобен, когда меняется сразу несколько колонок

Как проверить результат и не допустить типовых ошибок

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

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

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

ВызватьИсключение "Колонка не создана";

КонецЕсли;

Для Инд = 0 По Мин(ТЗ.Количество() - 1, 4) Цикл

Сообщить(ТипЗнч(ТЗ[Инд].Количество));

КонецЦикла;

Типичные ошибки
01
Обращение к колонке по индексу после вставки или удаления других колонок — индексы смещаются, используйте имена
02
Попытка присвоить значение свойству ТипЗначения — оно доступно только для чтения, тип меняют через новую колонку
03
Забытый перенос данных перед удалением старой колонки — данные теряются безвозвратно
04
Конвертация типов без Попытка/Исключение — обработка падает на первом непреобразуемом значении
05
Изменение структуры таблицы внутри цикла обхода её строк — логика становится непредсказуемой
Контрольные точки

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

Наличие колонки
Норма

ТЗ.Колонки.Найти(Имя) возвращает объект колонки

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

Возвращается Неопределено — колонка не создана или удалена

Тип данных
Норма

ТипЗнч() по строкам показывает ожидаемый тип

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

Встречаются Неопределено или старый тип — перенос не выполнен

Количество строк
Норма

Число строк до и после изменений совпадает

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

Строки потеряны — проверьте, не пересоздавали ли таблицу

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

Итог

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

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

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

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

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

Что произойдёт с данными при переименовании колонки?

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

Как поменять порядок колонок в таблице значений?

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

Почему после конвертации строки в число часть значений стала нулевой?

Значит, эти строки содержали символы, которые нельзя преобразовать в число: буквы, неразрывные пробелы, нестандартные разделители. Перед конвертацией очищайте строки функцией СтрЗаменить() от лишних символов и обрабатывайте ошибки через Попытка/Исключение.

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

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

Можно ли изменить ширину или заголовок колонки?

Заголовок колонки задаётся свойством Заголовок объекта колонки либо параметром при добавлении: ТЗ.Колонки.Добавить("Код", Тип, "Код номенклатуры"). Ширина относится уже к элементу формы (полю таблицы), а не к самой таблице значений, и настраивается через свойства элемента формы.