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

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

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

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

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

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

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

Базовый способ: метод Добавить()

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

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

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

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

ТЗ.Колонки.Добавить("Цена");

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

НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("000001");

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

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

Если переменную не сохранить, строка всё равно будет добавлена в таблицу, но останется пустой — обратиться к ней позже можно только через индекс: ТЗ[0].Количество = 5;. Такой подход менее читаем и чаще приводит к ошибкам, поэтому приём «Добавить → сохранить в переменную → заполнить» считается стандартным.

Колонки, которым не присвоено значение, получают значение по умолчанию для своего типа: пустая строка для строкового типа, ноль для числового, пустая ссылка для ссылочных типов, Неопределено для колонок без явного типа. Единственный способ получить NULL в таблице значений — выгрузить её из запроса, где поле приняло NULL.

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

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

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

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

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

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

// Вставить перед третьей строкой (индекс 2)

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

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

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

Заполнение колонок при добавлении

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

Запрос = Новый Запрос("ВЫБРАТЬ Номенклатура, Количество ИЗ ...");

Выборка = Запрос.Выполнить().Выбрать();

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

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

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

КонецЦикла;

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

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

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

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

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

Метод ТЗ.Загрузить(ДругаяТЗ) полностью замещает содержимое таблицы: старые строки удаляются, структура колонок приводится к структуре источника. Метод ТЗПриемник = ТЗИсточник.Скопировать() создаёт новую таблицу с теми же данными; у Скопировать() есть параметры для отбора строк и списка колонок.

// Копия только нужных строк и колонок

Отбор = Новый Структура("Склад", ОсновнойСклад);

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

// Построчное добавление с фильтром

Для Каждого СтрокаИсточника Из ТЗИсточник Цикл

Если СтрокаИсточника.Количество > 0 Тогда

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

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

КонецЕсли;

КонецЦикла;

Сравнение способов переноса строк

Добавить() в цикле

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

Загрузить()

Быстрое копирование всей таблицы, но старое содержимое и структура колонок приёмника теряются.

Скопировать()

Создаёт новую таблицу с отбором строк и списком колонок. Не добавляет в существующую таблицу, а возвращает новую.

Типичные ошибки и как их избежать

Наиболее частая ошибка — обращение к несуществующей колонке. Если колонка не добавлена в таблицу заранее, присвоение НоваяСтрока.Цена = 100; вызовет ошибку «Поле объекта не обнаружено». Перед заполнением убедитесь, что все колонки созданы через ТЗ.Колонки.Добавить() или появились при выгрузке запроса.

Вторая группа ошибок связана с типами данных. Если колонка объявлена с типом «Число», попытка записать в неё строку либо вызовет ошибку, либо приведёт к неявному преобразованию — поведение зависит от квалификаторов типа. При объявлении колонок указывайте тип явно через ОписаниеТипов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Меньше ожидаемого — часть итераций пропущена условием или выборка пуста

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

Колонки заполнены данными источника, типы соответствуют объявленным

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

Пустые значения или нули — имена колонок не совпали с именами полей при ЗаполнитьЗначенияСвойств

Порядок строк
Норма

Строки расположены в ожидаемой последовательности

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

Порядок нарушен после Вставить() — проверьте передаваемый индекс

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

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

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

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

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

Почему ЗаполнитьЗначенияСвойств не переносит часть значений?

Процедура копирует только свойства с совпадающими именами. Если колонка в таблице называется «Товар», а поле в источнике — «Номенклатура», значение не перенесётся. Либо переименуйте колонку, либо заполняйте такие поля вручную.

Чем отличается Добавить() от Вставить() по производительности?

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

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

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

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

Отдельного метода «ДобавитьНесколько» нет. Массовое добавление делается в цикле, либо таблица целиком замещается методом Загрузить(), либо создаётся копия через Скопировать() с отбором нужных строк.

Итог

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

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