Разработка и Конфигурация · 12 мин
Как программно создать таблицу в 1С
Как программно создать таблицу в 1С: таблица значений, табличный документ, динамический список. Примеры кода, проверка результата, типичные ошибки.
В 1С слово «таблица» может означать несколько разных объектов: таблицу значений для промежуточных расчётов, табличный документ для вывода на экран и печати, табличную часть документа или справочника, а также динамический список на управляемой форме. У каждого объекта свой способ программного создания, и путаница между ними — самая частая причина ошибок у начинающих разработчиков.
Программное создание таблицы нужно, когда структура данных заранее неизвестна: например, колонки отчёта формируются по настройкам пользователя, данные загружаются из внешнего файла с произвольным набором полей или результат запроса нужно дополнить вычисляемыми колонками. Во всех этих случаях типовые средства конфигуратора не подходят, и таблица строится кодом.
Ниже разобраны основные сценарии: создание таблицы значений с колонками и строками, вывод результата в табличный документ, работа с таблицей на управляемой форме и типичные ошибки. Примеры кода написаны на встроенном языке 1С и подходят для платформы 8.3.
Какие «таблицы» существуют в 1С и что выбрать
Прежде чем писать код, определите, какой именно объект нужен. Таблица значений — это несохраняемая структура данных в памяти, аналог двумерного массива с типизированными колонками. Она используется для расчётов, сортировки, группировки и обмена данными между процедурами, но сама по себе не отображается пользователю.
Табличный документ — это объект для вывода информации: отчёты, печатные формы, предпросмотр. Он состоит из ячеек, как лист Excel, и заполняется построчно или из макета. Табличная часть — это данные, хранящиеся внутри объекта конфигурации (документа, справочника) в базе данных. Динамический список и таблица формы — способы показать данные на управляемой форме.
Сравнение вариантов
Промежуточные расчёты, обработка данных в памяти. Не сохраняется в базу и не видна пользователю без дополнительного вывода.
Отчёты и печатные формы. Подходит для вывода, но не для хранения и сложной обработки данных.
Данные, которые должны храниться в базе вместе с документом или справочником. Заполняется кодом, сохраняется при записи объекта.
Показ произвольной таблицы на управляемой форме. Требует программного создания реквизитов и элементов формы.
Если сомневаетесь, ориентируйтесь на конечную цель: посчитать — таблица значений, показать или напечатать — табличный документ, сохранить в базе — табличная часть.
Создание таблицы значений программно
Базовый сценарий состоит из трёх шагов: создать объект, описать колонки, добавить строки. Колонки без описания типов создать можно, но лучше сразу задавать тип через объект ОписаниеТипов — это предотвращает ошибки при сортировке и сравнении значений.
ТЗ = Новый ТаблицаЗначений;
// Описание типов для колонок
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("Строка"));
ТипСтрока = Новый ОписаниеТипов(МассивТипов, , Новый КвалификаторыСтроки(100));
ТипЧисло = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2));
// Добавление колонок
ТЗ.Колонки.Добавить("Номенклатура", ТипСтрока);
ТЗ.Колонки.Добавить("Количество", ТипЧисло);
ТЗ.Колонки.Добавить("Сумма", ТипЧисло);
// Добавление строк
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Номенклатура = "Товар 1";
НоваяСтрока.Количество = 5;
НоваяСтрока.Сумма = 1250.50;
Обратите внимание: метод Колонки.Добавить() принимает имя колонки, описание типов, заголовок и ширину. Имя колонки должно быть допустимым идентификатором — без пробелов и спецсимволов, не начинаться с цифры. Если имя сформировано из внешних данных (например, из заголовков файла Excel), очистите его от недопустимых символов, иначе получите ошибку выполнения.
Заполнять строки можно и по индексу: ТЗ[0].Сумма = 100. Для обхода всех строк используется цикл Для Каждого Строка Из ТЗ Цикл. Если нужно найти конкретную строку, применяйте методы Найти() или НайтиСтроки() с структурой отбора.
Добавление колонок динамически по данным пользователя
Типовая задача — построить таблицу, где набор колонок зависит от настроек или периода. Например, отчёт по продажам, где каждая колонка — месяц из выбранного интервала. В этом случае имена колонок формируются программно в цикле.
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Менеджер", Новый ОписаниеТипов("Строка"));
ТекДата = НачалоМесяца(НачалоПериода);
Пока ТекДата <= КонецПериода Цикл
ИмяКолонки = "Месяц" + Формат(ТекДата, "ДФ=ггггММ");
ТЗ.Колонки.Добавить(ИмяКолонки, Новый ОписаниеТипов("Число"),
Формат(ТекДата, "ДФ='ММММ гггг'"));
ТекДата = ДобавитьМесяц(ТекДата, 1);
КонецЦикла;
Здесь техническое имя колонки (Месяц202601) отделено от заголовка, который увидит пользователь («Январь 2026»). Такой подход позволяет обращаться к колонке в коде по предсказуемому имени, а заголовок формировать в удобном для чтения виде.
При заполнении такой таблицы обращение к колонке выполняется через квадратные скобки: Строка["Месяц" + Формат(Дата, "ДФ=ггггММ")] = Сумма. Точечный синтаксис (Строка.Месяц202601) для динамических имён не подходит, так как имя неизвестно на момент написания кода.
- 1Создайте объект Новый ТаблицаЗначений
- 2Добавьте фиксированные колонки с описанием типов
- 3В цикле сформируйте имена и добавьте динамические колонки
- 4Заполните строки, обращаясь к динамическим колонкам через квадратные скобки
- 5Проверьте результат: ТЗ.Количество() и состав ТЗ.Колонки
Вывод таблицы в табличный документ
Таблица значений невидима для пользователя, поэтому результат обычно выводят в табличный документ. Самый простой способ без макета — построчный вывод ячеек методом Область() с установкой текста.
ТабДок = Новый ТабличныйДокумент;
// Шапка
НомерКолонки = 1;
Для Каждого Колонка Из ТЗ.Колонки Цикл
Область = ТабДок.Область(1, НомерКолонки);
Область.Текст = ?(ПустаяСтрока(Колонка.Заголовок),
Колонка.Имя, Колонка.Заголовок);
НомерКолонки = НомерКолонки + 1;
КонецЦикла;
// Данные
НомерСтроки = 2;
Для Каждого СтрокаТЗ Из ТЗ Цикл
Для НомерКолонки = 1 По ТЗ.Колонки.Количество() Цикл
ТабДок.Область(НомерСтроки, НомерКолонки).Текст =
СтрокаТЗ[НомерКолонки - 1];
КонецЦикла;
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
ТабДок.Показать("Результат");
Для реальных отчётов удобнее макет: в конфигураторе создаётся макет табличного документа с областями «Шапка» и «Строка», а код получает области методом ПолучитьОбласть() и выводит через Вывести(). Это отделяет оформление от логики и упрощает доработку печатной формы без изменения кода.
Если отчёт должен быть интерактивным — с группировками, отборами, расшифровками — рассмотрите систему компоновки данных вместо ручного вывода. СКД умеет выводить произвольную таблицу значений через программный набор данных «Объект», хотя настройка сложнее.
Отображение таблицы значений на управляемой форме
На управляемой форме таблицу значений показывают через реквизит формы. Если набор колонок фиксирован, реквизит создаётся в конфигураторе, а в коде выполняется только загрузка: ЗначениеВРеквизитФормы(ТЗ, "ИмяРеквизита"). Сложнее сценарий с динамическими колонками — тогда реквизиты и элементы формы создаются программно.
// В модуле формы, серверная процедура
ДобавляемыеРеквизиты = Новый Массив;
Для Каждого Колонка Из ТЗ.Колонки Цикл
Реквизит = Новый РеквизитФормы(Колонка.Имя,
Колонка.ТипЗначения, "ТаблицаНаФорме", Колонка.Заголовок);
ДобавляемыеРеквизиты.Добавить(Реквизит);
КонецЦикла;
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
// Создание элементов формы
Для Каждого Колонка Из ТЗ.Колонки Цикл
Элемент = Элементы.Добавить("Эл_" + Колонка.Имя,
Тип("ПолеФормы"), Элементы.ТаблицаНаФорме);
Элемент.ПутьКДанным = "ТаблицаНаФорме." + Колонка.Имя;
КонецЦикла;
ЗначениеВРеквизитФормы(ТЗ, "ТаблицаНаФорме");
Перед добавлением реквизитов убедитесь, что реквизит «ТаблицаНаФорме» типа ТаблицаЗначений уже создан в конфигураторе — динамически добавляются только его колонки. При повторном формировании таблицы сначала удалите старые колонки через ИзменитьРеквизиты с массивом удаляемых, иначе получите ошибку о дублировании реквизита.
Заполнение табличной части документа кодом
Табличная часть создаётся в конфигураторе, а программно в неё добавляются строки. Код похож на работу с таблицей значений, но результат сохраняется в базе при записи объекта.
НовыйДок = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НовыйДок.Дата = ТекущаяДатаСеанса();
НовыйДок.Контрагент = КонтрагентСсылка;
Для Каждого СтрокаТЗ Из ТаблицаТоваров Цикл
СтрокаТЧ = НовыйДок.Товары.Добавить();
СтрокаТЧ.Номенклатура = СтрокаТЗ.Номенклатура;
СтрокаТЧ.Количество = СтрокаТЗ.Количество;
СтрокаТЧ.Цена = СтрокаТЗ.Цена;
КонецЦикла;
НовыйДок.Записать(РежимЗаписиДокумента.Проведение);
Перед записью проверяйте заполненность обязательных реквизитов: если проверка заполнения не пройдёт, Записать() выдаст ошибку или запишет непроведённый документ в зависимости от режима. Для массовой загрузки выполняйте запись в транзакции, чтобы при сбое не осталось частично созданных документов.
Проверка результата и отладка
После создания таблицы убедитесь, что структура и данные соответствуют ожиданиям. Быстрые проверки: ТЗ.Количество() возвращает число строк, ТЗ.Колонки.Количество() — число колонок, ТЗ.Колонки.Найти("Имя") — существование конкретной колонки.
В отладчике таблица значений просматривается через «Вычислить выражение» — платформа показывает её в виде сетки. Для вывода в журнал или сообщение используйте построчный обход с конкатенацией значений. Если таблица большая, ограничьте вывод первыми строками, чтобы не замедлять сеанс.
Для проверки итогов удобны методы Итог("Сумма"), Свернуть() для группировки и Сортировать() для упорядочивания. Метод Свернуть изменяет саму таблицу — если исходные данные ещё нужны, сначала сделайте копию методом Скопировать().
Как проверить результат
ТЗ.Количество() соответствует числу загруженных записей
Ноль строк или меньше ожидаемого — проверьте источник данных и условия отбора
Все нужные колонки находятся через ТЗ.Колонки.Найти()
Колонка не найдена — ошибка в формировании имени или ветка кода не выполнилась
Числовые колонки содержат числа, итог считается корректно
Числа хранятся как строки — не задано описание типов при добавлении колонки
Таблица видна, колонки подписаны заголовками
Пустая форма — не выполнен вызов ЗначениеВРеквизитФормы или неверно указан путь к данным
Часто задаваемые вопросы
Чем таблица значений отличается от результата запроса?
Запрос возвращает выборку или таблицу значений после вызова метода Выгрузить(). Если данные нужны только для чтения и обхода, можно работать с выборкой напрямую. Таблица значений нужна, когда требуется изменять данные, добавлять колонки, сортировать или передавать результат между процедурами.
Можно ли создать таблицу значений с колонкой ссылочного типа?
Да. В описании типов укажите нужный тип, например Новый ОписаниеТипов("СправочникСсылка.Номенклатура"). Тогда в колонке будут храниться ссылки, и при выводе в табличный документ они отобразятся представлением объекта.
Как скопировать одну таблицу значений в другую?
Используйте метод Скопировать() — он создаёт полную копию со структурой и данными. Для копирования части строк передайте структуру отбора: ТЗ.Скопировать(Новый Структура("Склад", СкладСсылка)). Простое присваивание переменной копирует только ссылку на тот же объект.
Почему табличный документ выводится медленно при большом числе строк?
Построчное обращение к ячейкам — ресурсоёмкая операция. Для больших объёмов используйте макет с областями и метод Вывести(), а ещё лучше — систему компоновки данных, которая оптимизирована для вывода больших отчётов. Также ограничивайте объём выводимых данных отборами.
Как удалить все строки таблицы значений, сохранив колонки?
Вызовите метод ТЗ.Очистить() — он удаляет строки, оставляя структуру колонок нетронутой. Если нужно удалить и колонки, присвойте переменной Новый ТаблицаЗначений или удалите колонки по одной через Колонки.Удалить().
Можно ли сохранить таблицу значений в файл?
Да, но не напрямую. Таблицу выгружают в табличный документ и сохраняют в Excel или MXL через ТабДок.Записать(), либо обходят построчно и записывают в CSV или XML. Также таблицу можно сериализовать через ЗначениеВСтрокуВнутр() для передачи между сеансами.
Что важно запомнить
Программное создание таблицы в 1С начинается с выбора правильного объекта: ТаблицаЗначений для расчётов, ТабличныйДокумент для вывода, табличная часть для хранения в базе. Всегда задавайте типы колонок, используйте допустимые имена и проверяйте результат по количеству строк и составу колонок.