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