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