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