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

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

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

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

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

Базовый приём выглядит так: создаётся объект ТаблицаЗначений, в него добавляются колонки с типами, затем методом Добавить() создаётся новая строка, и её полям присваиваются значения. Порядок важен: если колонка не описана, обращение к ней вызовет ошибку «Поле объекта не обнаружено».

Создание таблицы значений и описание колонок

Таблица значений создаётся конструктором Новый ТаблицаЗначений. Сразу после создания она пуста: в ней нет ни строк, ни колонок. Прежде чем добавлять записи, определите структуру — иначе платформа не поймёт, куда записывать данные.

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

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

Таблица.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));

Таблица.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));

Таблица.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));

Таблица.Колонки.Добавить("Комментарий", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(200)));

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

Добавление одной строки методом Добавить()

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

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

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

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

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

НоваяСтрока.Комментарий = "Добавлено вручную";

Обращаться к полям можно и по индексу строки: Таблица[0].Количество = 10;. Однако вариант с переменной читабельнее и безопаснее — индекс легко потерять при изменении логики кода.

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

Добавление строк в цикле

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

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

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

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

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

НоваяСтрока.Сумма = Выборка.Сумма;

КонецЦикла;

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

При обходе больших выборок помните о производительности: сам метод Добавить() работает быстро, но если внутри цикла выполняются запросы к базе, узким местом станут именно они. Выносите обращения к данным за пределы цикла, собирая всё одним запросом.

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

Пакетное заполнение: ЗаполнитьЗначения и Загрузить

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

// Полная копия другой таблицы

ТаблицаПриемник.Загрузить(ТаблицаИсточник);

// Добавление одной строки с копированием совпадающих полей

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

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

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

Если источник — результат запроса, альтернатива ручному циклу: Таблица = Запрос.Выполнить().Выгрузить();. Метод Выгрузить() сразу возвращает готовую таблицу значений, и добавлять записи вручную не требуется вовсе.

Способы наполнения таблицы

Добавить() в цикле

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

ЗаполнитьЗначения()

Быстрое копирование одноимённых полей из структуры или строки. Не работает, если имена полей различаются.

Загрузить()

Мгновенное наполнение из другой таблицы. Полностью замещает текущее содержимое и структуру.

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

Оптимально, когда данные берутся из базы. Не подходит для вычисляемых на лету значений.

Добавление записи в таблицу значений на форме

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

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

&НаКлиенте

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

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

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

Элементы.ТаблицаТоваров.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();

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

Установка текущей строки после добавления — небольшая, но важная деталь интерфейса: пользователь сразу видит новую запись и может продолжить её редактирование без лишних кликов.

Типичные ошибки и их диагностика

Чаще всего проблемы возникают не с самим добавлением, а с тем, что происходит до и после. Ниже — ошибки, которые регулярно встречаются у начинающих разработчиков.

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

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

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

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

Количество строк
Норма

Таблица.Количество() соответствует числу добавленных записей

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

Строк меньше ожидаемого — часть итераций цикла не сработала или был вызван Очистить()/Загрузить()

Значения полей
Норма

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

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

Поля содержат Неопределено или пустые значения — ЗаполнитьЗначения не нашло совпадений имён

Порядок строк
Норма

Записи идут в порядке добавления

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

Порядок нарушен — вероятно, использовался Вставить() или последующая Сортировать()

FAQ

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

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

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

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

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

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

Почему после Загрузить() пропали ранее добавленные строки?

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

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

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

Есть ли ограничение на количество строк в таблице значений?

Жёсткого лимита платформа не задаёт — ограничением служит доступная память сервера или клиента. Таблицы с сотнями тысяч строк работоспособны, но для больших объёмов эффективнее оставлять данные в запросе и использовать временные таблицы СУБД, а не выгружать всё в память.

Итог

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

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