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

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

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

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

Встроенный язык 1С не позволяет «добавить колонку в массив» напрямую: массив — это просто упорядоченный набор элементов без структуры колонок. Когда разработчик говорит о «массиве с колонками», почти всегда речь идёт о таблице значений (объект ТаблицаЗначений) или о табличной части объекта конфигурации. Именно таблица значений имеет коллекцию Колонки, и добавление новой колонки выполняется методом Колонки.Добавить().

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

Что именно вы хотите изменить: массив, таблица значений или табличная часть

Прежде чем писать код, определите, с каким объектом вы работаете, потому что синтаксис и последствия различаются:

  • Массив (Новый Массив) — линейный список значений без колонок. «Колонку» в него добавить нельзя, но можно хранить в элементах структуры и добавлять в структуру новое свойство.
  • Таблица значений (Новый ТаблицаЗначений) — полноценная таблица в памяти с колонками и строками. Колонки добавляются и удаляются программно в любой момент.
  • Табличная часть документа или справочника — её состав колонок (реквизитов) задаётся в конфигураторе. Программно добавить колонку в саму табличную часть нельзя, но можно добавить колонку в динамический список или таблицу на форме, связанную с ней.
Маршрут решения

Как выбрать подход

Данные обрабатываются только в коде, без сохранения в базуИспользуйте ТаблицаЗначений и метод Колонки.Добавить()
Нужно добавить поле, которое хранится в документе постоянноДобавьте реквизит табличной части в конфигураторе, а не в коде
Нужна временная колонка на форме без изменения конфигурацииСоздайте реквизит формы типа ТаблицаЗначений и добавьте колонку программно
У вас массив структурДобавляйте новое свойство в каждую структуру через Вставить()

Добавление колонки в таблицу значений: базовый синтаксис

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

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

// Колонка без указания типа (составной тип — любое значение)

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

// Колонка с явным типом "Строка" длиной 100

ОписаниеСтроки = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(100));

Таблица.Колонки.Добавить("Наименование", ОписаниеСтроки, "Товар", 30);

// Числовая колонка: 15 знаков, 2 после запятой

ОписаниеЧисла = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2));

Таблица.Колонки.Добавить("Сумма", ОписаниеЧисла, "Сумма");

// Колонка со ссылочным типом

ОписаниеСсылки = Новый ОписаниеТипов("СправочникСсылка.Номенклатура");

Таблица.Колонки.Добавить("ТоварСсылка", ОписаниеСсылки);

После добавления колонки к ней обращаются по имени при заполнении строк:

СтрокаТаблицы = Таблица.Добавить();

СтрокаТаблицы.Наименование = "Кабель ВВГ 3х2.5";

СтрокаТаблицы.Сумма = 1540.50;

Зачем указывать тип колонки и как это сделать правильно

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

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

// Составной тип: число или строка

МассивТипов = Новый Массив;

МассивТипов.Добавить(Тип("Число"));

МассивТипов.Добавить(Тип("Строка"));

Описание = Новый ОписаниеТипов(МассивТипов, , , Новый КвалификаторыЧисла(10, 2), Новый КвалификаторыСтроки(50));

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

// Дата без времени

ОписаниеДаты = Новый ОписаниеТипов("Дата", , , , , Новый КвалификаторыДаты(ЧастиДаты.Дата));

Таблица.Колонки.Добавить("ДатаОтгрузки", ОписаниеДаты);

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

Добавление колонки в уже заполненную таблицу

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

// Таблица уже загружена из запроса

Таблица = Запрос.Выполнить().Выгрузить();

// Добавляем вычисляемую колонку

ОписаниеЧисла = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2));

Таблица.Колонки.Добавить("СуммаСНДС", ОписаниеЧисла, "Сумма с НДС");

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

СтрокаТаблицы.СуммаСНДС = СтрокаТаблицы.Сумма * 1.2;

КонецЦикла;

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

Порядок добавления и заполнения колонки
  1. 1
    Создайте или получите таблицу значений
  2. 2
    Вызовите Таблица.Колонки.Добавить() с именем и описанием типа
  3. 3
    Пройдите по строкам циклом и заполните новую колонку
  4. 4
    Проверьте несколько строк через Сообщить() или отладчик
  5. 5
    Если таблица выводится на форму — обновите элементы формы

Колонка на форме: динамическое добавление в реквизит формы

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

&НаСервере

Процедура ДобавитьКолонкуНаФорму()

ДобавляемыеРеквизиты = Новый Массив;

НовыйРеквизит = Новый РеквизитФормы("Комментарий",

Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(200)),

"ТаблицаТоваров", "Комментарий", Ложь);

ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);

ИзменитьРеквизиты(ДобавляемыеРеквизиты);

НовыйЭлемент = Элементы.Добавить("ТаблицаТоваровКомментарий", Тип("ПолеФормы"), Элементы.ТаблицаТоваров);

НовыйЭлемент.ПутьКДанным = "ТаблицаТоваров.Комментарий";

НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;

КонецПроцедуры

Здесь первый параметр конструктора РеквизитФормы — имя новой колонки, третий — путь к таблице-владельцу (имя реквизита формы типа «ТаблицаЗначений»). После вызова ИзменитьРеквизиты() колонка существует в данных формы, а добавленный элемент формы делает её видимой пользователю.

Учтите ограничение: метод ИзменитьРеквизиты() нельзя вызывать в клиентских процедурах — только на сервере. Поэтому динамическое изменение структуры таблицы формы всегда требует серверного вызова.

Работа с массивом структур вместо таблицы

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

МассивТоваров = Новый Массив;

Строка = Новый Структура("Наименование, Цена", "Гвоздь 100мм", 5.5);

МассивТоваров.Добавить(Строка);

// Добавляем "колонку" Склад всем элементам

Для Каждого Элемент Из МассивТоваров Цикл

Элемент.Вставить("Склад", "Основной");

КонецЦикла;

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

Массив структур или таблица значений

Массив структур

Подходит для небольших наборов и передачи параметров. Нет сортировки, поиска и итогов — всё вручную циклом.

Таблица значений

Подходит для выборок, отчётов и вывода на форму. Есть Найти(), Сортировать(), Свернуть(), Итог(), загрузка в запрос.

Табличная часть объекта

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

Типичные ошибки и как их проверить

Самая частая ошибка — обращение к колонке, которой нет: опечатка в имени вызывает исключение «Поле объекта не обнаружено». Перед обращением к колонке, имя которой приходит извне (из настроек или файла), проверяйте её существование методом Таблица.Колонки.Найти("ИмяКолонки") — он вернёт Неопределено, если колонки нет.

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

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

Типичные ошибки
01
Опечатка в имени колонки — исключение «Поле объекта не обнаружено»; проверяйте через Колонки.Найти()
02
Запись значения несовместимого типа — молчаливая подстановка пустого значения вместо ошибки
03
Короткий квалификатор строки — длинные значения обрезаются без предупреждения
04
Попытка добавить колонку в табличную часть документа из кода — состав реквизитов меняется только в конфигураторе
05
Вызов ИзменитьРеквизиты() на клиенте — метод доступен только в серверном контексте
Контрольные точки

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

Колонка создана
Норма

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

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

Возвращается Неопределено — проверьте имя и регистр символов

Данные записаны
Норма

В отладчике у нескольких строк колонка заполнена ожидаемыми значениями

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

Все значения пустые — вероятно, несовпадение типов при записи

Колонка видна на форме
Норма

Элемент формы создан и ПутьКДанным указывает на новую колонку

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

Колонка есть в данных, но не отображается — элемент формы не добавлен

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

Как добавить колонку не в конец, а в нужную позицию?

Метод Колонки.Вставить(Индекс, Имя, Тип, Заголовок, Ширина) вставляет колонку в указанную позицию. Индексация начинается с нуля: Таблица.Колонки.Вставить(0, "Код") сделает колонку первой. Сдвинуть существующую колонку можно методом Колонки.Сдвинуть().

Можно ли добавить колонку в результат запроса без выгрузки?

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

Как добавить колонку в динамический список на форме?

Состав полей динамического списка определяется его запросом, программно добавить колонку в данные нельзя. Можно изменить текст запроса списка через свойство ТекстЗапроса при создании формы, добавив туда вычисляемое поле, либо вывести рядом отдельную таблицу значений с дополнительными данными.

Почему значения в новой колонке обрезаются?

Причина в квалификаторе строки: если задана длина 50, а записывается строка длиннее, лишние символы отбрасываются без сообщения. Увеличьте длину в КвалификаторыСтроки или задайте неограниченную длину, передав длину 0.

Как удалить или переименовать добавленную колонку?

Удаление — Таблица.Колонки.Удалить("Имя") или по объекту колонки. Отдельного метода переименования нет: измените свойство Имя у объекта колонки, полученного через Колонки.Найти(), — данные в строках сохранятся.

Чем отличается заголовок колонки от её имени?

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

Итог

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

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