Колонки таблицы значений в 1С: добавление, типы, удаление

· 9 мин

Содержание

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

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

Создание таблицы и первая колонка

Таблицу создают через Новый ТаблицаЗначений. Колонки добавляют сразу после создания.

Таб = Новый ТаблицаЗначений;
Таб.Колонки.Добавить("Номенклатура");
Таб.Колонки.Добавить("Количество");
Таб.Колонки.Добавить("Цена");

Строка = Таб.Добавить();
Строка.Номенклатура = "Стол письменный";
Строка.Количество = 2;
Строка.Цена = 8500;

После добавления колонка становится свойством каждой строки. К ней обращаются по имени (Строка.Цена) или по индексу (Строка[2]). Индексация начинается с нуля.

Метод Добавить принимает до четырёх параметров:

ПараметрЧто задаётОбязателен
ИмяИдентификатор колонки в кодеДа
ТипОписание допустимых типов значенийНет
ЗаголовокПодпись при выводе таблицы на формуНет
ШиринаШирина колонки на формеНет

Метод возвращает созданную колонку. Это удобно, если нужно сразу что-то с ней сделать:

Колонка = Таб.Колонки.Добавить("Сумма");
Колонка.Заголовок = "Сумма, руб.";

Имя колонки подчиняется правилам идентификаторов: буквы, цифры и подчёркивание, первой цифры быть не может. Пробелы и знаки препинания в имени недопустимы. Для красивой подписи есть заголовок.

Типы данных колонок

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

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

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

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

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

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

Что здесь важно:

  • 🔢 КвалификаторыЧисла(15, 3) — всего 15 знаков, из них 3 после запятой. Для денег обычно хватает (15, 2).
  • 🔤 КвалификаторыСтроки(100) — строка до 100 символов. Для длинных текстов длину не ограничивают.
  • 📅 КвалификаторыДаты(ЧастиДаты.Дата) — хранится только дата, без времени.
  • 🔗 Ссылочные типы называют строкой вида СправочникСсылка.Имя или ДокументСсылка.Имя. Имя справочника должно существовать в конфигурации.

Можно указать несколько типов сразу, через запятую в одной строке: Новый ОписаниеТипов("Число, Строка"). Такая колонка примет и число, и строку.

Что происходит при несовпадении типа

Если записать в типизированную колонку значение другого типа, платформа попробует привести его. Строку "15" в числовую колонку она превратит в 15. Строку "abc" превратит в 0, а в колонку-справочник запишет пустую ссылку. Ошибки при этом не будет, поэтому неверные данные легко пропустить.

Число с большим количеством знаков, чем позволяет квалификатор, тоже не вызовет исключения. Дробная часть будет округлена по разрядности колонки. Если считаете суммы с копейками, а в колонке стоит (15, 0), копейки исчезнут молча.

Колонки с заполнением данными

Структуру можно создать и заполнить в одном месте, не плодя повторяющийся код.

Заполнение через цикл по списку имён

Таб = Новый ТаблицаЗначений;
Для Каждого Имя Из СтрРазделить("Артикул,Склад,Остаток", ",") Цикл
    Таб.Колонки.Добавить(Имя);
КонецЦикла;

Так удобно, когда набор колонок приходит извне, например из настроек.

Заполнение всей колонки одним значением

Если у всех строк в колонке должно быть одно и то же, используйте ЗаполнитьЗначения:

Таб.ЗаполнитьЗначения(Дата(2026, 1, 1), "ДатаОтгрузки");

Второй параметр — список колонок через запятую. Без него значение запишется во все колонки.

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

Часто таблицу строят не руками, а из запроса. Тогда колонки создаются автоматически по полям выборки:

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

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

Таб.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));
Для Каждого Стр Из Таб Цикл
    Стр.Сумма = Стр.Количество * Стр.Цена;
КонецЦикла;

Так не нужно описывать каждую колонку вручную, а типы остальных колонок сохраняются.

Загрузка колонки массивом

ЗагрузитьКолонку кладёт значения из массива в существующую колонку, а ВыгрузитьКолонку делает обратное:

Остатки = Таб.ВыгрузитьКолонку("Остаток");
Таб.ЗагрузитьКолонку(Остатки, "Остаток");

Количество элементов массива должно совпадать с числом строк таблицы, иначе загрузка пойдёт не так, как вы ожидаете.

Вставка, удаление и перестановка колонок

Структуру таблицы можно менять и после создания. Пока в ней нет строк, это безопасно. С данными потребуется осторожность.

Вставка в нужную позицию

Добавить ставит колонку в конец. Чтобы вставить в середину, используйте Вставить с индексом первым параметром:

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

Колонка встанет на второе место (индекс 1), остальные сдвинутся вправо. На обращения по имени это не влияет, а вот код вида Строка[2] начнёт читать другую колонку.

Удаление колонки

Таб.Колонки.Удалить("Цена");

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

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

Безопасный вариант:

ЛишниеКолонки = Новый Массив;
Для Каждого Колонка Из Таб.Колонки Цикл
    Если Лев(Колонка.Имя, 4) = "Врем" Тогда
        ЛишниеКолонки.Добавить(Колонка.Имя);
    КонецЕсли;
КонецЦикла;

Для Каждого Имя Из ЛишниеКолонки Цикл
    Таб.Колонки.Удалить(Имя);
КонецЦикла;

Как изменить порядок колонок

Прямого переноса колонки на другое место в коллекции нет. Если нужен определённый порядок, например перед выводом в табличный документ или выгрузкой, делают копию с нужным набором:

НовыйПорядок = Таб.Скопировать(, "Номенклатура, Количество, Цена");

Колонки в копии идут в том порядке, в каком перечислены во втором параметре. Строки при этом сохраняются. Вторая важная особенность: в копию попадут только перечисленные колонки, остальные пропадут. Это заодно способ отсечь лишнее.

Переименование и смена типа

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

Таб.Колонки.Добавить("СуммаНовая", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));
Таб.ЗагрузитьКолонку(Таб.ВыгрузитьКолонку("Сумма"), "СуммаНовая");
Таб.Колонки.Удалить("Сумма");

Сохранить прежнее имя после этого не получится: добавьте ещё раз колонку со старым именем и перенесите данные в обратную сторону.

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

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

Схема для динамического случая такая:

  1. Собрать массив реквизитов: для каждой колонки создать Новый РеквизитФормы(Имя, Тип, "ТаблицаДанных", Заголовок), где третий параметр — путь к реквизиту-таблице.
  2. Вызвать ИзменитьРеквизиты(МассивРеквизитов) на форме.
  3. Для каждого реквизита создать поле: Элементы.Добавить(Имя, Тип("ПолеФормы"), Элементы.ТаблицаДанных) и привязать его через ПутьКДанным.

Изменять реквизиты формы можно только на клиенте и сервере по правилам платформы: вызов делают на сервере, в процедуре формы. Если таблица значений ещё и заполняется данными, колонки реквизита должны совпадать по именам с колонками таблицы, которую вы в него загружаете через ЗначениеВРеквизитФормы.

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

Колонки в свёртке, сортировке и поиске

Колонки — это ещё и «ключи» для операций над всей таблицей. Имена колонок передают строкой через запятую:

Таб.Свернуть("Номенклатура", "Количество, Сумма");
Таб.Сортировать("Номенклатура Убыв, Сумма");

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

В Сортировать после имени колонки можно написать Убыв или Возр. Сортировка идёт по значению с учётом типа: строки сравниваются как строки, числа как числа. Именно поэтому колонку с цифрами в виде строк лучше сразу создавать числовой, иначе «10» окажется раньше «2».

Для отбора строк по значениям колонок используют НайтиСтроки(Новый Структура("Склад", "Основной")). Ключ структуры — имя колонки. Если колонки с таким именем нет, будет ошибка. Для частых отборов по одной колонке заранее добавляйте индекс, как описано выше.

Проверка наличия колонки

Прежде чем обращаться к колонке, особенно в универсальном коде, проверьте, что она есть. Метод Найти возвращает колонку или Неопределено:

Если Таб.Колонки.Найти("Цена") = Неопределено Тогда
    Таб.Колонки.Добавить("Цена");
КонецЕсли;

Другие полезные приёмы:

  • Таб.Колонки.Количество() — сколько колонок в таблице.
  • Таб.Колонки.Индекс(Колонка) — позиция колонки.
  • Таб.Колонки[0].Имя — имя первой колонки.
  • Перебор: Для Каждого Колонка Из Таб.Колонки Цикл ... КонецЦикла с доступом к Имя, Заголовок, ТипЗначения, Ширина.

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

Скорость на больших таблицах

Таблица значений хранится в оперативной памяти. Колонки с типами занимают меньше места и работают быстрее, чем «любой тип». На десятках тысяч строк это уже заметно.

Что помогает:

  1. ✅ Создавайте все колонки до заполнения. Структуру таблицы с данными менять дороже.
  2. ✅ Задавайте типы. Особенно для колонок, по которым потом идёт поиск или сортировка.
  3. ✅ Добавляйте индекс на колонки, по которым часто ищете: Таб.Индексы.Добавить("Артикул"). Метод НайтиСтроки с отбором по такой колонке работает заметно быстрее.
  4. ✅ Не держите лишние колонки «на всякий случай». Свёртка и сортировка по узкой таблице проходят быстрее.
  5. ✅ Где можно, делайте группировку в запросе, а не в таблице значений.

Для сравнения, как выглядят основные способы создания колонок:

СпособКогда подходитМинус
Колонки.Добавить("Имя")Быстрый черновой расчётНет типа, нет контроля значений
Добавить с ОписаниеТиповСтруктура известна заранееБольше кода
Выгрузка результата запросаДанные берутся из базыСтруктуру задаёт запрос
Скопировать с перечнем колонокНужны выбранные колонки в заданном порядкеОстальные колонки теряются
Перед передачей таблицы дальше
Выполнено: 0 / 4

Частые ошибки и их причины

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

Диагностика: выберите симптом

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

Можно ли добавить колонку в таблицу, где уже есть строки?
Да. Новая колонка появится у всех строк с пустым значением своего типа. Заполните её циклом или через ЗаполнитьЗначения.
Как узнать, есть ли в таблице нужная колонка?
Вызовите Таб.Колонки.Найти("Имя"). Если результат равен Неопределено, колонки нет.
Можно ли переименовать колонку?
Нет, имя доступно только для чтения. Создайте новую колонку, перенесите в неё данные и удалите старую.
Чем колонка таблицы значений отличается от реквизита табличной части?
Колонки таблицы значений создаются кодом на лету и живут в памяти. Реквизиты табличной части задаются в конфигураторе и хранятся в базе вместе с документом.
Сколько колонок можно создать?
Жёсткое число платформа не называет. На практике ограничивает память и удобство работы с кодом: если колонок больше нескольких десятков, подумайте, нужна ли вся эта структура.