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