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

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

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

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

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

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

Что такое таблица значений и когда нужно добавлять строки

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

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

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

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

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

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

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

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

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

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

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

НоваяСтрока.Сумма = 12500;

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

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

Добавление строки в управляемой форме

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

&НаКлиенте

Процедура ДобавитьСтроку(Команда)

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

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

КонецПроцедуры

Если заполнение строки требует данных из базы (остатки, цены, ссылки), добавление выполняют на сервере. В этом случае реквизит формы преобразуют в объект через РеквизитФормыВЗначение(), работают с ним как с обычной таблицей и возвращают обратно через ЗначениеВРеквизитФормы(). Либо добавляют строку напрямую в реквизит формы в серверной процедуре — это тоже работает и требует меньше кода.

Вставка строки в нужную позицию

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

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

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

НоваяСтрока.Наименование = "Первая строка";

// Вставка перед строкой с индексом 3

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

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

Заполнение строки данными: типовые приёмы

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

// Копирование из структуры

Данные = Новый Структура("Номенклатура, Количество", СсылкаНаТовар, 10);

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

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

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

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

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

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

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

Добавление строк из результата запроса и других источников

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

Запрос = Новый Запрос;

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

ТЗ = Запрос.Выполнить().Выгрузить();

// Дальше можно добавлять строки вручную

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

Если нужно объединить две таблицы, строки второй добавляют в цикле с копированием значений. Альтернатива без цикла — запрос с объединением ОБЪЕДИНИТЬ ВСЕ по двум таблицам, переданным как параметры, но для простых случаев цикл читабельнее.

Сравнение вариантов

ТЗ.Добавить()

Универсальный способ, строка добавляется в конец. Подходит везде: сервер, клиент, толстый и тонкий клиент.

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

Нужна строка в конкретной позиции. Требует контроля границ индекса.

Запрос.Выполнить().Выгрузить()

Массовое заполнение из базы. Ручное добавление строк не требуется, но структуру колонок определяет запрос.

Загрузить() для табличной части

Когда приёмник — табличная часть объекта: ТабЧасть.Загрузить(ТЗ) заменяет все строки разом.

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

После добавления строк убедитесь, что таблица содержит ожидаемые данные. Основные контрольные точки: количество строк (ТЗ.Количество()), значения в конкретных колонках, итоги по числовым колонкам (ТЗ.Итог("Сумма")). При отладке удобно вывести таблицу в табличный документ или смотреть её содержимое в табло переменных конфигуратора.

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

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

ТЗ.Количество() после добавления
Норма

Увеличилось на число добавленных строк

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

Не изменилось — метод Добавить() не выполнился или таблица другая

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

Совпадают с присвоенными данными

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

Пустые — результат Добавить() не сохранён в переменную или колонка названа иначе

Типы значений
Норма

Числа как числа, ссылки как ссылки

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

Строки вместо чисел — колонка не типизирована или присвоен неверный тип

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

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

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

Если таблица является реквизитом формы, на клиенте доступен тот же метод: НоваяСтрока = ИмяРеквизита.Добавить(). Заполнение простыми значениями (числа, строки, даты) тоже выполняется на клиенте. Серверный вызов нужен только когда для заполнения требуются данные из базы.

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

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

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

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

Почему после Добавить() строка пустая, хотя я присваивал значения?

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

Как добавить строку в табличную часть документа программно?

Получите объект документа через ПолучитьОбъект(), добавьте строку: НоваяСтрока = ДокументОбъект.Товары.Добавить(), заполните поля и вызовите ДокументОбъект.Записать(). Без вызова Записать() изменения в базе не сохранятся.

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

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

Итог

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

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