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

Отчеты и Аналитика · 11 мин

Как вывести данные в виде таблицы в 1С

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

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

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

Ниже разобраны практические сценарии с примерами кода на встроенном языке 1С, условия выбора инструмента и типичные ошибки, из-за которых таблица выводится пустой, «ломается» форматирование или отчёт работает медленно.

Выбор инструмента под задачу

Прежде чем писать код, определите, где пользователь будет видеть таблицу и что с ней будет делать. Если нужна печатная форма или отчёт «нажал — получил — распечатал», подойдёт табличный документ. Если пользователь должен менять отборы, группировки и настройки — только СКД. Если таблица — часть рабочего интерфейса (например, список товаров с возможностью редактирования) — таблица значений или динамический список на форме.

Частая ошибка новичков — выводить на форму табличный документ там, где нужна таблица значений, или наоборот, пытаться «оживить» табличный документ интерактивностью, для которой он не предназначен. Это приводит к переделкам, поэтому выбор стоит сделать до начала разработки.

Сравнение вариантов

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

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

СКД

Отчёты с настройками, группировками, отборами. Ограничение: сложнее освоить, оформление менее гибкое, чем в макете.

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

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

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

Списки документов и справочников с отборами. Ограничение: только данные из таблиц базы, произвольные вычисляемые строки добавить нельзя.

Вывод через табличный документ и макет

Классический способ: создать макет типа «Табличный документ», разметить в нём области (шапка, строка, подвал), получить данные запросом и вывести их построчно. Макет добавляется в общие макеты конфигурации или в макеты конкретного объекта — например, документа, для которого строится печатная форма.

В макете ячейки с параметрами помечаются именем в квадратных скобках, например [Номенклатура]. В коде эти параметры заполняются через свойство Параметры области, после чего область выводится в результирующий табличный документ.

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

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

"ВЫБРАТЬ

| Товары.Номенклатура КАК Номенклатура,

| Товары.Количество КАК Количество,

| Товары.Сумма КАК Сумма

|ИЗ

| Документ.РеализацияТоваровУслуг.Товары КАК Товары

|ГДЕ

| Товары.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", СсылкаНаДокумент);

Выборка = Запрос.Выполнить().Выбрать();

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

Макет = ПолучитьМакет("МакетРеестра");

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

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

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

Пока Выборка.Следующий() Цикл

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

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

КонецЦикла;

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

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

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

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

Вывод отчёта через СКД

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

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

Если отчёт нужно вывести программно (например, по кнопке из другой формы), используют объекты КомпоновщикМакетаКомпоновкиДанных и ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент. Это даёт тот же результат, что и интерактивное формирование, но под контролем кода.

Таблица значений на управляемой форме

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

Заполнение выполняется программно, обычно в обработчике ПриСозданииНаСервере или по команде:

&НаСервере

Процедура ЗаполнитьТаблицуНаСервере()

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

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

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Товар,

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

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| НЕ Номенклатура.ПометкаУдаления";

ТаблицаТоваров.Загрузить(Запрос.Выполнить().Выгрузить());

КонецПроцедуры

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

Динамический список для данных из базы

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

Чтобы вывести свои данные, установите у динамического списка свойство «Произвольный запрос» и напишите текст запроса. Обязательно укажите ключевое поле (обычно Ссылка), иначе список не сможет корректно позиционироваться и обновляться. Отборы пользователь настраивает стандартными средствами, без дополнительного кода.

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

Оформление и проверка результата

После вывода проверьте не только наличие данных, но и оформление: ширину колонок, выравнивание чисел, формат дат и сумм. В табличном документе формат задаётся в свойствах ячейки макета или через метод УстановитьФормат области. В СКД формат поля настраивается на закладке «Наборы данных» в свойствах поля или через оформление в настройках.

Для печатных форм дополнительно проверьте разбиение на страницы: метод ПроверитьВывод() табличного документа позволяет заранее узнать, поместится ли очередная область, и при необходимости вывести разрыв страницы или повторить шапку.

Контрольные точки

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

Данные в таблице
Норма

Количество строк совпадает с результатом запроса в консоли запросов

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

Строк меньше — проверьте отборы и соединения в запросе

Параметры макета
Норма

Все ячейки заполнены значениями

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

Пустые ячейки — имена параметров не совпадают с полями выборки

Числа и итоги
Норма

Суммы выровнены вправо, итоги сходятся с отчётом-источником

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

Числа выведены как текст, итоги не считаются

Печать
Норма

Таблица помещается на страницу, шапка повторяется

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

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

Типичные ошибки и ограничения

Наиболее частые проблемы связаны не с выводом как таковым, а с данными и именованием. Пустая таблица почти всегда означает, что запрос вернул ноль строк — проверяйте параметры отбора и период. Ошибка «Поле не найдено» при работе с макетом указывает на опечатку в имени параметра области.

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

Типичные ошибки
01
Запрос внутри цикла вывода строк — резкое падение производительности; вынесите все данные в один запрос
02
Несовпадение имён параметров макета с полями выборки — пустые ячейки без сообщений об ошибке
03
Вывод в табличный документ вместо таблицы значений там, где нужно редактирование — приходится всё переделывать
04
Загрузка в форму всей таблицы без отбора — медленное открытие формы и зависание клиента
05
Отсутствие ключевого поля в произвольном динамическом списке — некорректное обновление и позиционирование
Итог

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

Печатные формы и простые реестры выводите табличным документом с макетом, настраиваемые отчёты — через СКД, интерактивные таблицы — таблицей значений на форме, списки данных из базы — динамическим списком. Данные получайте одним запросом до цикла вывода и следите за совпадением имён полей и параметров.

Частые вопросы

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

Можно обойтись без макета: в цикле по строкам таблицы значений устанавливайте текст ячеек напрямую через ТабДок.Область("R" + НомерСтроки + "C" + НомерКолонки).Текст = Значение. Способ подходит для быстрых служебных выгрузок, но для печатных форм удобнее макет — оформление хранится отдельно от кода.

Как добавить итоги по колонкам при выводе через макет?

Используйте итоги самого запроса: добавьте в текст запроса конструкцию ИТОГИ СУММА(Сумма) ПО ОБЩИЕ, получите общий итог из выборки и заполните им параметры области «Подвал». Альтернатива — накапливать суммы в переменных внутри цикла вывода строк.

Можно ли вывести таблицу в Excel или сохранить в файл?

Да, табличный документ сохраняется методом Записать() с указанием типа файла, например ТипФайлаТабличногоДокумента.XLSX. Пользователь также может сохранить открытый табличный документ интерактивно через меню «Файл — Сохранить копию».

Почему СКД выводит не все строки, хотя запрос их возвращает?

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

Как раскрасить строки таблицы по условию?

В табличном документе задайте цвет области перед выводом: ОбластьСтрока.Область().ЦветФона = Новый Цвет(255, 230, 230). В СКД используйте условное оформление в настройках отчёта. В таблице значений на форме — условное оформление формы с отбором по полю.

Что быстрее для больших данных: табличный документ или СКД?

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