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

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

Как создавать таблицы в 1С: все основные способы

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

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

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

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

Как определить, какой тип таблицы нужен

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

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

Маршрут решения

Как выбрать тип таблицы

Данные должны храниться в базе вместе с документом или справочникомСоздайте табличную часть объекта в конфигураторе
Таблица нужна только для расчётов внутри процедурыИспользуйте таблицу значений в коде
Нужно показать на форме записи из базы с возможностью фильтрацииИспользуйте динамический список
Нужна печатная форма или вывод в Excel-подобном видеСоздайте макет и табличный документ
Нужно ускорить сложный запрос с несколькими выборкамиИспользуйте временные таблицы в тексте запроса

Таблица значений в коде

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

Типичный сценарий: выгрузить данные запроса, дополнить их расчётными колонками и передать на форму или в другую процедуру. Метод Запрос.Выполнить().Выгрузить() сразу возвращает готовую таблицу значений — вручную создавать колонки в этом случае не нужно.

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

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

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

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

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

НоваяСтрока.Номенклатура = ТекущийТовар;

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

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

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

Табличная часть документа или справочника

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

Пошаговое создание в конфигураторе

Порядок создания табличной части
  1. 1
    Откройте конфигуратор и найдите нужный документ или справочник в дереве конфигурации
  2. 2
    Дважды щёлкните по объекту и перейдите на вкладку «Данные»
  3. 3
    В разделе «Табличные части» нажмите «Добавить» и задайте имя, например «Товары»
  4. 4
    Выделите созданную табличную часть и добавьте реквизиты: Номенклатура, Количество, Цена, Сумма
  5. 5
    Для каждого реквизита укажите тип данных и длину
  6. 6
    Обновите конфигурацию базы данных (F7) и согласитесь с реструктуризацией
  7. 7
    Проверьте: откройте документ в режиме предприятия — на форме появится вкладка с таблицей

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

Обращение к табличной части из кода

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

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

ДокументОбъект.Контрагент = ВыбранныйКонтрагент;

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

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

СтрокаТовара.Количество = 3;

СтрокаТовара.Цена = 500;

СтрокаТовара.Сумма = СтрокаТовара.Количество * СтрокаТовара.Цена;

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

Динамический список на форме

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

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

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

Табличный документ и макет печатной формы

Для печати и вывода отчётных форм используется табличный документ — аналог листа Excel с ячейками, объединениями и оформлением. Заполняется он по макету: шаблону с именованными областями и параметрами.

Создание печатной формы
  1. 1
    Откройте объект конфигурации, перейдите на вкладку «Макеты» и добавьте макет типа «Табличный документ»
  2. 2
    Выделите строки шапки, нажмите правой кнопкой — «Именованные область» и назовите область «Шапка»
  3. 3
    В ячейках, куда подставляются данные, введите имена в квадратных скобках: [НомерДокумента], [Контрагент]
  4. 4
    Для повторяющихся строк создайте область «Строка» с параметрами [Номенклатура], [Количество], [Сумма]
  5. 5
    Создайте область «Подвал» для итогов и подписей
  6. 6
    В модуле менеджера объекта напишите процедуру Печать, которая выводит области в табличный документ
Функция СформироватьПечатнуюФорму(СсылкаНаДокумент) Экспорт

Макет = Документы.РеализацияТоваровУслуг.ПолучитьМакет("Печать");

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

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

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

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

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

Для Каждого СтрокаТовара Из СсылкаНаДокумент.Товары Цикл

ОбластьСтрока.Параметры.Заполнить(СтрокаТовара);

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

КонецЦикла;

Возврат ТабДок;

КонецФункции

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

Временные таблицы в запросах

Временная таблица создаётся внутри запроса конструкцией ПОМЕСТИТЬ В ИмяТаблицы и существует только в рамках менеджера временных таблиц. Это основной инструмент оптимизации сложных запросов: вместо одного громоздкого запроса с вложенными подзапросами пишут цепочку простых, где промежуточные результаты складываются во временные таблицы.

Запрос = Новый Запрос;

Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

Запрос.Текст =

"ВЫБРАТЬ

| Продажи.Номенклатура КАК Номенклатура,

| СУММА(Продажи.СуммаОборот) КАК Сумма

|ПОМЕСТИТЬ ВТ_Продажи

|ИЗ

| РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи

|СГРУППИРОВАТЬ ПО

| Продажи.Номенклатура

|;

|ВЫБРАТЬ

| ВТ_Продажи.Номенклатура,

| ВТ_Продажи.Сумма,

| Спр.Артикул

|ИЗ

| ВТ_Продажи КАК ВТ_Продажи

| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Спр

| ПО ВТ_Продажи.Номенклатура = Спр.Ссылка";

Важные правила: один менеджер временных таблиц на всю цепочку запросов, иначе таблицы не будут видны между запросами; индексы создаются конструкцией ИНДЕКСИРОВАТЬ ПО и заметно ускоряют соединения больших временных таблиц; уничтожить таблицу можно командой УНИЧТОЖИТЬ ИмяТаблицы, чтобы освободить память.

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

Частые ошибки и как их проверить

Первая типичная ошибка — попытка создать таблицу значений на клиенте в управляемой форме. Платформа выдаст ошибку, потому что конструктор доступен только на сервере. Решение: заполняйте таблицу в серверной процедуре и передавайте через реквизит формы.

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

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

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

Табличная часть документа
Норма

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

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

После перезаписи документа таблица пуста

Таблица значений
Норма

Таблица.Количество() возвращает ожидаемое число строк, итоги сходятся

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

Колонки есть, но строк нет, либо типы колонок не совпадают с данными

Печатная форма
Норма

Все области выведены, параметры подставлены, итоги равны сумме строк

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

Пустые ячейки вместо значений или отсутствуют строки

Временная таблица
Норма

Следующий запрос в том же менеджере видит таблицу и возвращает строки

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

Ошибка «Таблица не найдена» — разные менеджеры временных таблиц

Итог

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

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

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

Можно ли программно добавить табличную часть к существующему документу?

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

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

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

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

Создайте реквизит формы типа «ТаблицаЗначений», добавьте ему колонки, перетащите реквизит в дерево элементов формы, а в серверной процедуре загрузите данные через ЗначениеВРеквизитФормы(Таблица, "ИмяРеквизита").

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

Чаще всего из-за соединений без индексов, отсутствия отборов на уровне запроса или выборки лишних полей. Упростите текст запроса, оставьте только нужные колонки и проверьте, что отборы пользователя передаются в условие ГДЕ, а не накладываются после выборки.

Как удалить временную таблицу и зачем это делать?

Командой УНИЧТОЖИТЬ ИмяТаблицы в тексте запроса. Удаление освобождает память сервера СУБД, что важно при работе с крупными выборками в длительных операциях, например при пакетном проведении документов.

Можно ли создать таблицу в 1С без программирования?

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