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

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

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

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

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

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

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

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

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

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

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

Таблица.Колонки.Добавить("Цена");

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

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

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

НоваяСтрока.Цена = 1200;

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

Количество строк в таблице проверяется свойством Таблица.Количество(). Для поиска нужной строки после добавления используют метод Найти() или НайтиСтроки() с отбором по значениям колонок.

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

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

ДокументОбъект = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

ДокументОбъект.Дата = ТекущаяДатаСеанса();

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

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

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

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

ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);

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

При добавлении строки в табличную часть на форме срабатывают обработчики событий «ПриИзменении» только при интерактивном вводе. Программное добавление строки эти обработчики не вызывает — пересчёт сумм, ставок НДС и скидок нужно выполнять в коде явно.

Как вывести строку в табличный документ

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

ТабДок = Новый ТабличныйДокумент;

Макет = ПолучитьМакет("МакетОтчета");

ОбластьШапка = Макет.ПолучитьОбласть("Шапка");

ТабДок.Вывести(ОбластьШапка);

ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

Для Каждого СтрокаТовара Из ТаблицаТоваров Цикл

ОбластьСтрока.Параметры.Номенклатура = СтрокаТовара.Номенклатура;

ОбластьСтрока.Параметры.Количество = СтрокаТовара.Количество;

ТабДок.Вывести(ОбластьСтрока);

КонецЦикла;

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

Порядок действий
  1. 1
    Определите тип таблицы: таблица значений, табличная часть или табличный документ
  2. 2
    Для таблицы значений создайте объект и опишите колонки
  3. 3
    Вызовите метод Добавить() и сохраните результат в переменную
  4. 4
    Заполните поля новой строки через точку
  5. 5
    Для табличной части запишите объект методом Записать()
  6. 6
    Проверьте результат: количество строк и значения полей

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

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

НоваяСтрока = Таблица.Вставить(0); // строка станет первой

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

Для изменения порядка существующих строк применяется метод Сдвинуть(Строка, Смещение). Сортировка всей таблицы по значениям колонок выполняется методом Сортировать("Цена Убыв, Номенклатура").

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

Добавить()

Строка в конец таблицы. Подходит для большинства задач заполнения и загрузки данных.

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

Строка в заданную позицию. Нужен, когда порядок строк важен, например при формировании иерархических списков.

Загрузить(Таблица)

Массовое заполнение из другой таблицы значений одной командой. Требует совпадения имён колонок.

Типичные ошибки при создании строк

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

Вторая группа — потеря данных. Строка добавлена в табличную часть, но объект не записан; таблица значений заполнена, но не передана дальше и уничтожена вместе с процедурой; документ записан без проведения, и данные не попали в регистры.

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

Как проверить, что строка создана корректно

После добавления строки убедитесь, что количество строк увеличилось: выведите Таблица.Количество() в сообщение или проверьте в отладчике. Для табличной части документа откройте записанный документ в пользовательском режиме и убедитесь, что строка видна и поля заполнены.

В отладчике таблицу значений удобно смотреть через «Вычислить выражение» — платформа покажет её в виде таблицы с колонками и строками. Это быстрее, чем перебирать строки в цикле с выводом сообщений.

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

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

Количество строк после Добавить()
Норма

Значение Количество() увеличилось на единицу

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

Количество не изменилось — метод вызван у другой таблицы

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

Поля заполнены ожидаемыми данными

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

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

Документ после записи
Норма

Строка видна при открытии документа

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

Строки нет — объект не был записан

Часто задаваемые вопросы

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

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

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

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

Почему программно добавленная строка не пересчитывает сумму документа?

Обработчики событий формы срабатывают только при интерактивном вводе. После программного добавления строки вызовите процедуру пересчёта явно или вычислите суммы в своём коде.

Как удалить созданную строку?

Используйте Таблица.Удалить(Строка) для конкретной строки или Таблица.Очистить() для удаления всех строк. В табличной части после удаления не забудьте записать объект.

Чем таблица значений отличается от табличной части?

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

Итог

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

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