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