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