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