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

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

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

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

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

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

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

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

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

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

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

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

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

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

МассивТипов = Новый Массив;

МассивТипов.Добавить(Тип("Число"));

ОписаниеЧисла = Новый ОписаниеТипов(МассивТипов, , , Новый КвалификаторыЧисла(15, 2));

ТЗ.Колонки.Добавить("Сумма", ОписаниеЧисла, "Сумма документа");

Явное описание типов защищает от ошибок при сортировке, итогах и сравнениях: строки «10» и «9» в числовой колонке сравниваются как числа, а в нетипизированной — как строки, что даёт неожиданный порядок.

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

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

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

НоваяСтрока.Номенклатура = "Кабель ВВГ 3х2.5";

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

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

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

Для Каждого СтрокаДанных Из МассивДанных Цикл

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

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

НоваяСтрока.Количество = СтрокаДанных.Кол;

КонецЦикла;

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

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

Массовое заполнение через ЗаполнитьЗначения()

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

// Заполнить колонку "Склад" во всех строках

ТЗ.ЗаполнитьЗначения(ОсновнойСклад, "Склад");

// Заполнить несколько колонок сразу

ТЗ.ЗаполнитьЗначения(ТекущаяДатаСеанса(), "ДатаОбработки, ДатаИзменения");

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

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

МассивЦен = Новый Массив;

МассивЦен.Добавить(100);

МассивЦен.Добавить(250);

ТЗ.ЗагрузитьКолонку(МассивЦен, "Цена");

Копирование и перенос строк между таблицами

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

Для Каждого СтрокаИсточник Из ТЗИсточник Цикл

Если СтрокаИсточник.Количество > 0 Тогда

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

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

КонецЕсли;

КонецЦикла;

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

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

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

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

Универсальный способ, полный контроль над каждой строкой. Минус — многословный код при большом числе колонок.

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

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

ЗагрузитьКолонку()

Быстро переносит массив в колонку. Требует точного совпадения числа элементов и строк.

Скопировать() / НайтиСтроки()

Оптимально для отбора и переноса между таблицами. Требует совместимости структур.

Работа с типами данных и контроль значений

Ошибки при добавлении значений чаще всего связаны с несовпадением типов. Если колонка описана как число, а в неё присваивается строка, 1С попытается выполнить преобразование, а при невозможности выдаст ошибку исполнения. Надёжнее приводить значения к нужному типу до присваивания.

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

НоваяСтрока.Количество = Число(Строка(ВходноеЗначение));

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

Отдельный случай — значение Неопределено. В нетипизированной колонке оно хранится как есть, а в типизированной приводится к значению по умолчанию. Если логика различает «ноль» и «не задано», типизацию колонки нужно продумать заранее.

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

После наполнения таблицы результат проверяют несколькими способами. Количество строк возвращает ТЗ.Количество(), содержимое конкретной строки доступно по индексу ТЗ[0], а для отладки удобен вывод через Сообщить() или просмотр таблицы в отладчике через «Вычислить выражение».

Сообщить("Строк в таблице: " + ТЗ.Количество());

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

Сообщить(СтрокаТЗ.Номенклатура + " — " + СтрокаТЗ.Количество);

КонецЦикла;

На управляемых формах таблицу значений нельзя просто разместить на форме как реквизит произвольного типа — её преобразуют в ДанныеФормыКоллекция или добавляют как динамический реквизит с программным созданием колонок. Это частая причина ошибки «недопустимый тип реквизита» при попытке вывести таблицу пользователю.

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

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

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

ТЗ.Количество() совпадает с ожидаемым числом записей

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

Строк больше или меньше — проверьте условия цикла и фильтры

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

Поля заполнены, типы соответствуют описанию колонок

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

Пустые значения или строки вместо чисел — проверьте типизацию и присваивание

Итоги по числовым колонкам
Норма

ТЗ.Итог("Сумма") возвращает корректное число

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

Итог равен нулю при заполненных строках — колонка не числовая

FAQ: частые вопросы о добавлении значений в таблицу значений

Как добавить строку в начало или середину таблицы, а не в конец?

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

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

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

Как добавить строку только если такой записи ещё нет?

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

Почему при добавлении строки возникает ошибка «Поле объекта не обнаружено»?

Ошибка означает, что вы обращаетесь к колонке, которой нет в таблице: опечатка в имени, лишний пробел или колонка не была создана. Проверьте список колонок через ТЗ.Колонки в отладчике и сравните имена посимвольно — регистр значения не имеет, а скрытые пробелы имеют.

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

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

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

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

Итог

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

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