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