Разработка и Конфигурация · 11 мин
Как добавить строку в таблицу значений в 1С
Пошаговая инструкция, как добавить строку в таблицу значений 1С: методы Добавить и Вставить, заполнение колонок, типичные ошибки и примеры кода на встроенном языке.
Таблица значений — один из самых востребованных объектов встроенного языка 1С. Она хранит данные в оперативной памяти в виде строк и колонок и используется для промежуточной обработки: выгрузки результатов запросов, подготовки данных к печати, обмена между процедурами, построения отчётов. Практически любая нетривиальная обработка рано или поздно сводится к тому, что в таблицу нужно программно добавить строки и заполнить их значениями.
Для добавления строк в таблицу значений предусмотрены два основных метода: Добавить() и Вставить(). Первый добавляет строку в конец таблицы, второй — в произвольную позицию по индексу. Оба метода возвращают ссылку на созданную строку, через которую сразу можно заполнить значения колонок. Понимание разницы между методами и правильная работа с колонками избавляют от большинства ошибок начинающих разработчиков.
Ниже разобраны синтаксис методов, способы заполнения строк, добавление данных из запроса и из другой таблицы, а также типичные ошибки: обращение к несуществующей колонке, потеря ссылки на строку, некорректная работа с индексами. Все примеры написаны на встроенном языке 1С и работают как в толстом, так и в тонком клиенте, включая серверный контекст.
Что нужно знать о таблице значений перед добавлением строк
Таблица значений создаётся конструктором Новый ТаблицаЗначений и сразу после создания не содержит ни колонок, ни строк. Прежде чем добавлять строки, необходимо описать колонки через коллекцию Колонки, иначе обращение к полям строки вызовет ошибку «Поле объекта не обнаружено». Колонка добавляется методом Колонки.Добавить("ИмяКолонки", ОписаниеТипа), где второй параметр задаёт тип данных.
Если таблица получена как результат запроса (Запрос.Выполнить().Выгрузить()), колонки уже существуют и повторно описывать их не нужно. То же относится к таблицам, загруженным из макета или полученным из другой процедуры. Проверить состав колонок можно перебором коллекции ТЗ.Колонки или через отладчик.
Метод Добавить() — добавление строки в конец таблицы
Метод Добавить() — стандартный способ пополнения таблицы. Он создаёт новую пустую строку в конце коллекции и возвращает на неё ссылку. Все значения колонок в новой строке изначально равны Неопределено либо пустым значениям соответствующего типа, если для колонки задано строгое описание типов.
Типовой фрагмент кода выглядит так:
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
ТЗ.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Номенклатура = ТекущийТовар;
НоваяСтрока.Количество = 5;
Обращение к колонкам выполняется через точку по имени колонки. Имя должно быть корректным идентификатором: начинаться с буквы, не содержать пробелов и спецсимволов. Если имя колонки хранится в переменной, используется индексное обращение: НоваяСтрока[ИмяКолонки] — это удобно при универсальных обработках, где структура таблицы заранее неизвестна.
НоваяСтрока = ТаблицаТоваров.Добавить();
НоваяСтрока.Номенклатура = Товар;
НоваяСтрока.Количество = 1;
НоваяСтрока.Цена = ПолучитьЦену(Товар);Метод Вставить() — добавление строки в заданную позицию
Когда порядок строк важен и новую запись нужно поместить не в конец, а в конкретное место, применяется метод Вставить(Индекс). Индекс указывает позицию, в которую будет вставлена строка; нумерация начинается с нуля. Все последующие строки смещаются вниз, их индексы увеличиваются на единицу.
Пример вставки строки в самое начало таблицы:
ПерваяСтрока = ТЗ.Вставить(0);
ПерваяСтрока.Комментарий = "Итоговая строка";
При работе с Вставить() важно контролировать границы: индекс не может превышать текущее количество строк. Вставка с индексом, равным ТЗ.Количество(), эквивалентна обычному Добавить(). Попытка вставить строку по индексу больше количества элементов приведёт к ошибке времени выполнения.
Сравнение методов добавления
Строка попадает в конец таблицы. Самый быстрый и безопасный вариант, подходит для большинства задач наполнения таблицы.
Строка вставляется в указанную позицию, остальные смещаются. Нужен, когда важен порядок: итоговые строки вверху, вставка в середину по условию.
Полностью заменяет содержимое таблицы строками источника. Подходит для копирования, но не для построчного добавления с условиями.
Заполнение строк данными из запроса и других источников
На практике строки редко добавляются по одной вручную — чаще таблица наполняется в цикле по выборке запроса или по коллекции другого объекта. Типовой шаблон: выполнить запрос, получить выборку и в цикле Пока Выборка.Следующий() Цикл добавлять строки, перенося нужные поля.
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Номенклатура = Выборка.Номенклатура;
НоваяСтрока.Остаток = Выборка.КоличествоОстаток;
КонецЦикла;
Если имена колонок целевой таблицы совпадают с именами полей выборки, вместо перечисления полей можно использовать ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка). Это сокращает код и снижает риск опечаток, но требует контроля: лишние поля источника, которых нет в таблице, будут проигнорированы, а несовпадение типов может привести к неожиданным значениям.
Для полного копирования одной таблицы значений в другую существует метод Загрузить(): ТЗПриемник.Загрузить(ТЗИсточник). Учтите, что он полностью замещает текущее содержимое приёмника. Если нужно дописать строки источника к существующим, используйте цикл с Добавить() и ЗаполнитьЗначенияСвойств.
- 1Убедитесь, что таблица создана и в ней описаны нужные колонки
- 2Вызовите ТЗ.Добавить() и сохраните результат в переменную
- 3Заполните колонки строки через точку или через индексное обращение
- 4При наполнении из запроса оберните добавление в цикл по выборке
- 5Проверьте результат: ТЗ.Количество() и значения первой строки в отладчике
Типичные ошибки при добавлении строк
Самая частая ошибка — обращение к колонке, которой нет в таблице. Возникает сообщение «Поле объекта не обнаружено», и выполнение прерывается. Причины: опечатка в имени, колонка не добавлена, либо код работает с другой таблицей, чем предполагалось. Перед заполнением строки полезно проверять наличие колонки через ТЗ.Колонки.Найти("ИмяКолонки").
Вторая группа ошибок связана с потерей ссылки на строку. Вызов ТЗ.Добавить() без сохранения результата создаёт строку, но заполнить её уже невозможно — в таблице остаётся пустая запись. Симметричная проблема — заполнение переменной НоваяСтрока в условной ветке, где добавление не выполнялось: тогда значения попадают в строку из предыдущей итерации цикла.
Третья типичная ситуация — несоответствие типов. Если колонка объявлена как число, а ей присваивается строка, платформа попытается выполнить преобразование. Когда оно невозможно, значение будет приведено к значению по умолчанию или возникнет ошибка. Особенно внимательно следует относиться к колонкам составного типа и к значениям NULL, пришедшим из запроса: их стоит заменять через Есть NULL в тексте запроса или проверкой в коде.
Проверка результата и отладка
После наполнения таблицы результат проверяется двумя простыми способами. Первый — количество строк: ТЗ.Количество() должно совпадать с ожидаемым числом записей источника. Если выборка запроса вернула сто строк, а в таблице девяносто девять, где-то в цикле есть условие, пропускающее добавление.
Второй способ — просмотр содержимого в отладчике. Таблица значений в конфигураторе отображается в удобном табличном виде: видны все колонки, значения и порядок строк. Дополнительно можно вывести таблицу в табличный документ для визуального контроля или пройтись по строкам циклом Для Каждого Строка Из ТЗ Цикл с проверкой ключевых полей на пустые значения.
Как проверить результат
ТЗ.Количество() равно числу записей источника
Строк меньше — часть данных потеряна в условиях цикла
Все ключевые поля заполнены, типы соответствуют ожиданию
Пустые значения или Неопределено в обязательных колонках
Строки расположены в ожидаемой последовательности
Итоговые строки оказались в середине из-за неверного индекса Вставить()
Ограничения и особенности работы
Таблица значений живёт только в памяти сеанса. Она не сохраняется в базе данных сама по себе: чтобы зафиксировать данные, их нужно перенести в документы, регистры или справочники. При передаче таблицы между клиентом и сервером в управляемых формах следует учитывать контекст: на клиенте доступны не все типы, и тяжёлые операции наполнения правильнее выполнять в серверных процедурах.
При больших объёмах данных добавление строк по одной в цикле с обращением к базе внутри итерации (например, получение цены каждого товара отдельным запросом) резко снижает производительность. Корректный подход — получить все данные одним запросом и наполнять таблицу уже из готовой выборки. Если строк десятки тысяч и более, стоит оценить, не подходит ли для задачи запрос с временными таблицами вместо таблицы значений.
Частые вопросы о добавлении строк в таблицу значений
Как добавить строку, если имена колонок заранее неизвестны?
Используйте индексное обращение: НоваяСтрока[ИмяКолонки] = Значение, где ИмяКолонки — строковая переменная. Состав доступных имён можно получить перебором коллекции ТЗ.Колонки, у каждой колонки есть свойство Имя.
Чем отличается Добавить() от Вставить()?
Добавить() всегда помещает строку в конец таблицы и не требует параметров. Вставить(Индекс) помещает строку в указанную позицию, сдвигая последующие строки вниз. Если порядок не важен, используйте Добавить() — это проще и безопаснее.
Почему после Добавить() строка остаётся пустой?
Чаще всего результат метода не сохранён в переменную: вызвано ТЗ.Добавить(), а заполнение идёт в другую переменную или не идёт вовсе. Метод возвращает ссылку на созданную строку, и только через неё можно присвоить значения колонкам.
Как скопировать строки из одной таблицы значений в другую?
Для полной замены содержимого используйте ТЗПриемник.Загрузить(ТЗИсточник). Для добавления строк к существующим — цикл по строкам источника с ТЗПриемник.Добавить() и ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИсточника). Структуры колонок таблиц должны быть совместимы.
Можно ли добавить строку в таблицу значений на форме?
Если таблица является реквизитом формы типа «ТаблицаЗначений», строки добавляются тем же методом Добавить(), и изменения сразу отображаются в связанном элементе формы. Для интерактивного добавления пользователем у табличного поля должно быть разрешено изменение состава строк.
Как удалить ошибочно добавленную строку?
Используйте ТЗ.Удалить(Строка) по ссылке на строку или ТЗ.Удалить(Индекс) по индексу. Для полной очистки таблицы с сохранением колонок вызовите ТЗ.Очистить().
Что важно запомнить
Строки добавляются методами Добавить() и Вставить(Индекс); оба возвращают ссылку на строку, которую нужно сохранить в переменную и через неё заполнить колонки. Перед добавлением убедитесь, что колонки описаны, а при наполнении из запроса используйте цикл по выборке без обращений к базе внутри итерации.