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