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

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

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

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

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

Для добавления строк предусмотрены два основных метода: Добавить() — вставляет строку в конец таблицы, и Вставить() — вставляет строку в указанную позицию. Оба метода возвращают ссылку на созданную строку, через которую сразу можно заполнить значения колонок.

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

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

Прежде чем добавлять строки, таблицу значений нужно создать и описать её структуру. Без колонок таблица существует, но хранить данные в ней невозможно — при попытке обратиться к несуществующей колонке платформа выдаст ошибку «Поле объекта не обнаружено».

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

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

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

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

ТЗ.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));

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

Метод Добавить(): строка в конец таблицы

Метод Добавить() — основной способ наполнения таблицы. Он создаёт пустую строку в конце таблицы и возвращает ссылку на неё. Полученную строку заполняют через точечное обращение к колонкам по имени.

НоваяСтрока = ТЗ.Добавить();

НоваяСтрока.Номенклатура = ТекущийТовар;

НоваяСтрока.Количество = 5;

НоваяСтрока.Цена = 1200;

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

Пока Выборка.Следующий() Цикл

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

СтрокаТЗ.Номенклатура = Выборка.Номенклатура;

СтрокаТЗ.Количество = Выборка.Остаток;

КонецЦикла;

Порядок добавления строки
  1. 1
    Создайте таблицу значений и опишите колонки с типами
  2. 2
    Вызовите метод Добавить() и сохраните результат в переменную
  3. 3
    Заполните колонки строки через точечное обращение по имени
  4. 4
    Проверьте результат: ТЗ.Количество() должно увеличиться на единицу

Метод Вставить(): строка в нужную позицию

Если строку нужно разместить не в конце, а в конкретном месте таблицы, используется метод Вставить(Индекс). Индексация строк в таблице значений начинается с нуля: Вставить(0) добавит строку первой, сдвинув остальные вниз.

// Вставить строку в самое начало

ПерваяСтрока = ТЗ.Вставить(0);

ПерваяСтрока.Комментарий = "Строка-заголовок";

// Вставить строку после второй позиции

НоваяСтрока = ТЗ.Вставить(2);

Учитывайте ограничение: индекс не может превышать текущее количество строк. Если в таблице три строки, допустимые значения индекса — от 0 до 3. Передача большего значения приведёт к ошибке выполнения. Для добавления в конец всегда надёжнее использовать Добавить().

Сравнение методов

Добавить()

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

Вставить(Индекс)

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

Скопировать() / ЗагрузитьКолонку()

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

Заполнение строки: обращение к колонкам и типовые приёмы

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

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

НоваяСтрока = ТЗПриёмник.Добавить();

ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИсточник);

При заполнении следите за соответствием типов. Если колонка объявлена как Число, а вы пытаетесь записать строку, платформа либо выполнит преобразование, либо запишет пустое значение — поведение зависит от контекста, и молчаливая потеря данных здесь опаснее явной ошибки.

Проверка результата и контроль данных

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

В отладчике таблицу значений удобно просматривать через команду «Показать значение в отдельном окне» — платформа отобразит содержимое в табличном виде. Это быстрее, чем обход строк в цикле с выводом сообщений.

Контрольные точки

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

Количество строк
Норма

ТЗ.Количество() увеличилось на число добавленных строк

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

Количество не изменилось — метод Добавить() не выполнился или вызван для другой таблицы

Значения колонок
Норма

Все поля заполнены ожидаемыми значениями нужного типа

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

Поля пустые или содержат значения другого типа — ошибка в именах колонок или типах

Позиция строки
Норма

При Вставить() строка находится по нужному индексу, порядок остальных сохранён

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

Строка оказалась не на месте — перепутана нумерация с нуля

Частые ошибки при добавлении строк

Большинство проблем при работе с таблицей значений связано не с самим добавлением строк, а с подготовкой структуры и обращением к данным. Разбор типовых ошибок помогает быстро локализовать проблему.

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

Альтернативные способы наполнения таблицы

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

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

Итог

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

Сначала опишите колонки, затем добавляйте строки: Добавить() — в конец, Вставить(Индекс) — в позицию с нуля. Сохраняйте возвращаемую строку в переменную и заполняйте поля с учётом типов. Результат проверяйте через Количество() и просмотр таблицы в отладчике.

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

Как добавить строку в табличную часть документа, а не в таблицу значений?

Используйте тот же метод: Объект.Товары.Добавить(), где «Товары» — имя табличной части. Метод вернёт строку, которую нужно заполнить. Чтобы данные попали в базу, после наполнения вызовите Объект.Записать().

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

Технически Добавить() выполнится и создаст пустую строку, но заполнить её нечем — обращение к любой колонке вызовет ошибку. Поэтому колонки всегда описывают заранее.

Почему после Добавить() в таблице пустые строки?

Чаще всего результат метода не сохранён в переменную или заполнение выполняется для другой строки. Метод создаёт строку, но не заполняет её автоматически — значения присваиваются отдельно.

С какого индекса начинается нумерация строк?

С нуля. Первая строка имеет индекс 0, последняя — ТЗ.Количество() - 1. Это важно при использовании метода Вставить() и обращении к строкам по индексу.

Как быстро скопировать все строки из одной таблицы в другую?

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

Что быстрее: цикл с Добавить() или ЗагрузитьКолонку()?

При больших объёмах однотипных данных ЗагрузитьКолонку() и Скопировать() работают заметно быстрее, так как переносят данные пакетно. Цикл с Добавить() оправдан, когда каждая строка требует индивидуальной обработки или вычислений.