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

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

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

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

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

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

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

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

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

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

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

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

ТЗ.Колонки.Добавить("Комментарий"); // без типа — произвольное значение

Указание типа не обязательно, но полезно: платформа будет контролировать присваиваемые значения, а при выгрузке таблицы в табличное поле формы колонки получат корректное представление. Если тип не задан, колонка принимает значения любого типа.

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

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

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

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

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

НоваяСтрока.Комментарий = "Добавлено программно";

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

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

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

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

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

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

КонецЦикла;

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

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

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

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

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

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

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

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

СтрокаВСередину = ТЗ.Вставить(2);

Если передать индекс, равный текущему количеству строк, метод сработает как Добавить(). Если индекс больше количества строк или отрицательный — платформа выдаст ошибку «Недопустимое значение параметра». Перед вставкой по вычисленному индексу имеет смысл проверять его границы.

Вставка строки в табличную часть документа или формы

Частая практическая задача — добавить строку не в абстрактную таблицу значений, а в табличную часть документа или в таблицу на форме. С табличной частью объекта работа идёт так же: коллекция строк поддерживает методы Добавить() и Вставить().

// В модуле объекта или при работе со ссылкой

НоваяСтрока = ДокументОбъект.Товары.Добавить();

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

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

ДокументОбъект.Записать();

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

НоваяСтрока = ТаблицаНаФорме.Добавить();

Элементы.ТаблицаНаФорме.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();

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

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

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

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

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

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

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

КонецЕсли;

КонецЦикла;

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

Способы вставки строк

Добавить()

Строка в конец таблицы. Универсальный вариант для наполнения в цикле, не требует контроля индексов.

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

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

ЗаполнитьЗначенияСвойств()

Не метод вставки, а заполнение: копирует значения по совпадающим именам колонок, ускоряет перенос данных.

Загрузить()

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

Проверка результата и типичные ошибки

После вставки строки результат проверяют количеством строк и содержимым колонок. Метод Количество() у коллекции строк показывает, сколько строк в таблице; обращение по индексу ТЗ[0] позволяет прочитать конкретную строку. Для отладки удобно вывести значения в сообщение или посмотреть таблицу в отладчике через «Вычислить выражение».

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

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

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

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

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

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

Количество не изменилось — метод не выполнился или исключение прервало код

Значения колонок новой строки
Норма

Поля содержат присвоенные значения

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

Поля пустые — строка создана, но заполнение не выполнено

Позиция строки при Вставить()
Норма

Строка стоит на ожидаемом индексе, соседние сдвинуты

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

Порядок нарушен — передан неверный индекс

FAQ

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

Добавить() всегда помещает строку в конец таблицы и не принимает параметров. Вставить(Индекс) размещает строку в указанной позиции, сдвигая остальные вниз. По скорости в типовых задачах разница незаметна, выбор определяется требуемым порядком строк.

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

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

Почему возникает ошибка «Поле объекта не обнаружено» при заполнении строки?

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

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

Реквизит формы типа «ТаблицаЗначений» поддерживает те же методы Добавить() и Вставить(). После добавления, чтобы пользователь увидел и редактировал строку, назначьте её текущей: Элементы.ИмяТаблицы.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор().

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

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

Сохраняется ли таблица значений в базе данных после добавления строк?

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

Итог

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

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