Разработка и Конфигурация · 12 мин
Как создавать таблицы в 1С: все основные способы
Как создавать таблицы в 1С: таблица значений в коде, табличная часть документа, динамический список, макет печатной формы и временные таблицы в запросах.
Слово «таблица» в 1С означает сразу несколько разных объектов: таблицу значений в коде, табличную часть документа или справочника, динамический список на форме, табличный документ печатной формы и временную таблицу в запросе. У каждого объекта своё назначение и свой способ создания, и путаница между ними — самая частая причина ошибок у начинающих разработчиков.
Выбор способа зависит от задачи. Если нужно временно хранить и обрабатывать данные в памяти — используется таблица значений. Если данные должны сохраняться в базе вместе с документом — нужна табличная часть. Для отображения списка записей из базы на форме подходит динамический список, а для печати — табличный документ. Временные таблицы в запросах ускоряют выборку сложных данных.
Ниже разобраны все пять способов с пошаговыми действиями, примерами кода и типичными ошибками. Примеры приведены для управляемых форм, но логика применима и в обычном приложении.
Как определить, какой тип таблицы нужен
Прежде чем писать код, ответьте на ключевой вопрос: должны ли данные таблицы сохраняться в информационной базе после закрытия программы. Если да — это табличная часть объекта конфигурации. Если таблица нужна только на время выполнения процедуры — это таблица значений, которая живёт в оперативной памяти и удаляется автоматически.
Второй критерий — где таблица будет показана пользователю. Для отображения на форме таблицу значений привязывают к реквизиту формы, список записей из базы выводят через динамический список, а печатную форму формируют как табличный документ с помощью макета.
Как выбрать тип таблицы
Таблица значений в коде
Таблица значений — универсальный объект для хранения и обработки данных в памяти. Создаётся конструктором Новый ТаблицаЗначений, после чего в неё добавляются колонки с указанием типов, а затем строки.
Типичный сценарий: выгрузить данные запроса, дополнить их расчётными колонками и передать на форму или в другую процедуру. Метод Запрос.Выполнить().Выгрузить() сразу возвращает готовую таблицу значений — вручную создавать колонки в этом случае не нужно.
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
Таблица.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
Таблица.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));
НоваяСтрока = Таблица.Добавить();
НоваяСтрока.Номенклатура = ТекущийТовар;
НоваяСтрока.Количество = 5;
НоваяСтрока.Сумма = 1250.50;
Полезные методы для обработки: Найти() и НайтиСтроки() — поиск по значению колонки, Сортировать() — сортировка, Свернуть() — группировка с суммированием, Итог() — сумма по колонке, Скопировать() — создание копии с отбором.
Табличная часть документа или справочника
Табличная часть — это таблица, данные которой физически хранятся в базе и привязаны к конкретному объекту: строки товаров в накладной, этапы работ в заказе, сотрудники в приказе. Создаётся она только в конфигураторе, программно добавить табличную часть к объекту нельзя.
Пошаговое создание в конфигураторе
- 1Откройте конфигуратор и найдите нужный документ или справочник в дереве конфигурации
- 2Дважды щёлкните по объекту и перейдите на вкладку «Данные»
- 3В разделе «Табличные части» нажмите «Добавить» и задайте имя, например «Товары»
- 4Выделите созданную табличную часть и добавьте реквизиты: Номенклатура, Количество, Цена, Сумма
- 5Для каждого реквизита укажите тип данных и длину
- 6Обновите конфигурацию базы данных (F7) и согласитесь с реструктуризацией
- 7Проверьте: откройте документ в режиме предприятия — на форме появится вкладка с таблицей
После создания табличной части перезаписывать существующие документы не требуется — платформа автоматически добавит пустую таблицу к каждому объекту при реструктуризации. Однако если база большая, обновление конфигурации может занять заметное время, поэтому в рабочих базах его выполняют в нерабочие часы.
Обращение к табличной части из кода
ДокументОбъект = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
ДокументОбъект.Дата = ТекущаяДатаСеанса();
ДокументОбъект.Контрагент = ВыбранныйКонтрагент;
СтрокаТовара = ДокументОбъект.Товары.Добавить();
СтрокаТовара.Номенклатура = Товар;
СтрокаТовара.Количество = 3;
СтрокаТовара.Цена = 500;
СтрокаТовара.Сумма = СтрокаТовара.Количество * СтрокаТовара.Цена;
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Динамический список на форме
Динамический список — способ показать на форме таблицу, данные которой читаются из базы автоматически: список документов, элементов справочника, записей регистра. Платформа сама обновляет данные, строит постраничную загрузку и даёт пользователю сортировку и отбор.
Чтобы создать динамический список, откройте форму в конфигураторе, добавьте реквизит формы типа «ДинамическийСписок», установите флаг «Основной реквизит» и задайте основную таблицу (например, Документ.ПоступлениеТоваровУслуг). Затем перетащите реквизит в дерево элементов формы — появится таблица с колонками.
Для нестандартных выборок включите свойство «Произвольный запрос» и напишите собственный текст запроса с соединениями и группировками. Учтите ограничение: произвольный запрос без указания основной таблицы не даёт интерактивно создавать и изменять объекты прямо из списка, а динамическое считывание данных может работать медленнее.
Табличный документ и макет печатной формы
Для печати и вывода отчётных форм используется табличный документ — аналог листа Excel с ячейками, объединениями и оформлением. Заполняется он по макету: шаблону с именованными областями и параметрами.
- 1Откройте объект конфигурации, перейдите на вкладку «Макеты» и добавьте макет типа «Табличный документ»
- 2Выделите строки шапки, нажмите правой кнопкой — «Именованные область» и назовите область «Шапка»
- 3В ячейках, куда подставляются данные, введите имена в квадратных скобках: [НомерДокумента], [Контрагент]
- 4Для повторяющихся строк создайте область «Строка» с параметрами [Номенклатура], [Количество], [Сумма]
- 5Создайте область «Подвал» для итогов и подписей
- 6В модуле менеджера объекта напишите процедуру Печать, которая выводит области в табличный документ
Функция СформироватьПечатнуюФорму(СсылкаНаДокумент) Экспорт
Макет = Документы.РеализацияТоваровУслуг.ПолучитьМакет("Печать");
ТабДок = Новый ТабличныйДокумент;
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.НомерДокумента = СсылкаНаДокумент.Номер;
ТабДок.Вывести(ОбластьШапка);
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Для Каждого СтрокаТовара Из СсылкаНаДокумент.Товары Цикл
ОбластьСтрока.Параметры.Заполнить(СтрокаТовара);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
Возврат ТабДок;
КонецФункции
Проверка результата проста: сформируйте печатную форму из документа с несколькими строками и убедитесь, что все строки выведены, итоги сходятся с табличной частью, а колонтитулы и нумерация страниц отображаются корректно при предварительном просмотре.
Временные таблицы в запросах
Временная таблица создаётся внутри запроса конструкцией ПОМЕСТИТЬ В ИмяТаблицы и существует только в рамках менеджера временных таблиц. Это основной инструмент оптимизации сложных запросов: вместо одного громоздкого запроса с вложенными подзапросами пишут цепочку простых, где промежуточные результаты складываются во временные таблицы.
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст =
"ВЫБРАТЬ
| Продажи.Номенклатура КАК Номенклатура,
| СУММА(Продажи.СуммаОборот) КАК Сумма
|ПОМЕСТИТЬ ВТ_Продажи
|ИЗ
| РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи
|СГРУППИРОВАТЬ ПО
| Продажи.Номенклатура
|;
|ВЫБРАТЬ
| ВТ_Продажи.Номенклатура,
| ВТ_Продажи.Сумма,
| Спр.Артикул
|ИЗ
| ВТ_Продажи КАК ВТ_Продажи
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Спр
| ПО ВТ_Продажи.Номенклатура = Спр.Ссылка";
Важные правила: один менеджер временных таблиц на всю цепочку запросов, иначе таблицы не будут видны между запросами; индексы создаются конструкцией ИНДЕКСИРОВАТЬ ПО и заметно ускоряют соединения больших временных таблиц; уничтожить таблицу можно командой УНИЧТОЖИТЬ ИмяТаблицы, чтобы освободить память.
Если запрос к регистру выполняется медленно, первым делом вынесите отбор по измерениям во временную таблицу с индексом, а затем соединяйте её с виртуальной таблицей регистра. Такой приём часто ускоряет выполнение в разы без изменения логики отчёта.
Частые ошибки и как их проверить
Первая типичная ошибка — попытка создать таблицу значений на клиенте в управляемой форме. Платформа выдаст ошибку, потому что конструктор доступен только на сервере. Решение: заполняйте таблицу в серверной процедуре и передавайте через реквизит формы.
Вторая ошибка — забыть вызвать Записать() у объекта после заполнения табличной части. Строки добавлены в объект в памяти, но в базе их нет, и при повторном открытии документа таблица пуста. Третья — обращение к параметру макета, которого нет в области: платформа молча оставит ячейку пустой или выдаст ошибку в зависимости от режима, поэтому имена параметров сверяйте с макетом посимвольно.
Как проверить результат
Строки видны при повторном открытии документа и попадают в движения
После перезаписи документа таблица пуста
Таблица.Количество() возвращает ожидаемое число строк, итоги сходятся
Колонки есть, но строк нет, либо типы колонок не совпадают с данными
Все области выведены, параметры подставлены, итоги равны сумме строк
Пустые ячейки вместо значений или отсутствуют строки
Следующий запрос в том же менеджере видит таблицу и возвращает строки
Ошибка «Таблица не найдена» — разные менеджеры временных таблиц
Что важно запомнить
Тип таблицы выбирается по задаче: хранение в базе — табличная часть, расчёты в памяти — таблица значений, список на форме — динамический список, печать — табличный документ с макетом, оптимизация запросов — временные таблицы. После заполнения табличной части всегда записывайте объект, а временные таблицы с соединениями снабжайте индексами.
Часто задаваемые вопросы
Можно ли программно добавить табличную часть к существующему документу?
Нет. Состав табличных частей определяется структурой конфигурации и меняется только в конфигураторе или через расширение. Программно можно лишь добавлять, изменять и удалять строки уже существующей табличной части.
Чем таблица значений отличается от массива структур?
Таблица значений поддерживает поиск, сортировку, свёртку, итоги и выгрузку из запроса одним методом, но требует больше памяти. Массив структур легче и удобнее для простого перебора, однако всю обработку в нём придётся писать вручную.
Как вывести таблицу значений на форму?
Создайте реквизит формы типа «ТаблицаЗначений», добавьте ему колонки, перетащите реквизит в дерево элементов формы, а в серверной процедуре загрузите данные через ЗначениеВРеквизитФормы(Таблица, "ИмяРеквизита").
Почему динамический список с произвольным запросом работает медленно?
Чаще всего из-за соединений без индексов, отсутствия отборов на уровне запроса или выборки лишних полей. Упростите текст запроса, оставьте только нужные колонки и проверьте, что отборы пользователя передаются в условие ГДЕ, а не накладываются после выборки.
Как удалить временную таблицу и зачем это делать?
Командой УНИЧТОЖИТЬ ИмяТаблицы в тексте запроса. Удаление освобождает память сервера СУБД, что важно при работе с крупными выборками в длительных операциях, например при пакетном проведении документов.
Можно ли создать таблицу в 1С без программирования?
Да, частично. Табличная часть создаётся в конфигураторе мышью без единой строки кода, динамический список настраивается свойствами формы, а макет печатной формы рисуется как таблица. Код понадобится только для заполнения данных и обработки событий.