Таблицы в 1С 8.3: макеты, СКД и табличный документ

· 9 мин

Содержание

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

Все три работают с одним и тем же объектом платформы — табличным документом (.mxl). Макет задаёт его шаблон, СКД строит его автоматически по схеме, а в коде вы заполняете его сами. Ниже — где какой способ уместен, точные шаги в Конфигураторе и примеры кода для платформы 8.3 в интерфейсе «Такси».

Макет табличного документа: фиксированная печатная форма

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

Как создать макет:

  1. Откройте Конфигуратор, найдите объект (например, документ РеализацияТоваровУслуг) в дереве конфигурации.
  2. Разверните его ветку, встаньте на Макеты, через контекстное меню выберите Добавить.
  3. В конструкторе макета задайте тип Табличный документ и имя, например Печать.

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

  • 🔹 Шапка — реквизиты документа: номер, дата, контрагент;
  • 🔹 Строка — одна строка табличной части, выводится в цикле;
  • 🔹 Подвал — итоги, подписи.

Чтобы выделить область, протяните мышью по номерам строк слева, затем Таблица → Имена → Назначить имя (либо через контекстное меню выделения). В ячейку, которую будет заполнять код, впишите имя параметра и в свойствах ячейки (палитра свойств, F4) поставьте Заполнение = Параметр.

Вывод макета в коде. В управляемом приложении печать обычно живёт в модуле менеджера объекта, в процедуре Печать(), но суть одна:

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

ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.НомерДокумента = Номер;
ОбластьШапка.Параметры.ДатаДокумента  = Дата;

ТабДок = Новый ТабличныйДокумент;
ТабДок.Вывести(ОбластьШапка);

ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Для Каждого СтрокаТЧ Из Товары Цикл
    ОбластьСтрока.Параметры.Номенклатура = СтрокаТЧ.Номенклатура;
    ОбластьСтрока.Параметры.Количество   = СтрокаТЧ.Количество;
    ОбластьСтрока.Параметры.Сумма         = СтрокаТЧ.Сумма;
    ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

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

В ячейке макета различают три типа заполнения: Текст (статичная надпись — «Итого», «Накладная №»), Параметр (подставляется из кода) и Шаблон (смешанный текст с параметрами в квадратных скобках, например Счёт № [НомерДокумента] от [ДатаДокумента]). Тип задаётся в свойстве ячейки Заполнение. Помимо горизонтальных областей бывают и вертикальные — их выводят через Присоединить рядом с предыдущей, когда число колонок переменное.

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

Отчёт на СКД: таблица с группировками и отбором

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

Как собрать отчёт на СКД:

  1. В Конфигураторе добавьте объект Отчёт, в его палитре свойств откройте Основная схема компоновки данных → Открыть.
  2. На вкладке Наборы данных добавьте набор типа Запрос и нажмите Конструктор запроса.
  3. Выберите таблицы (регистры, документы, справочники) и поля, которые попадут в отчёт.
  4. На вкладке Ресурсы отметьте числовые поля для итогов (сумма, количество) и функцию агрегации — обычно Сумма().
  5. На вкладке Настройки постройте структуру: добавьте группировки (например, по контрагенту, внутри — по документам), вынесите поля в колонки, задайте отборы и сортировку по умолчанию.

Готовый отчёт пользователь открывает в режиме 1С:Предприятие, жмёт Сформировать — и получает таблицу. Через Настройки (значок с шестерёнкой или кнопка Ещё → Изменить вариант) он сам перестраивает разрезы, не трогая код.

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

Пара приёмов, которые экономят время:

  • 🔹 Расшифровка. Двойной клик по ячейке с итогом раскрывает, из чего он сложился. Это работает без кода — достаточно, чтобы поле попало в набор данных.
  • 🔹 Несколько вариантов. В одной схеме можно сохранить несколько готовых настроек (вкладка Варианты в настройках отчёта) — например, «по контрагентам» и «по номенклатуре». Пользователь переключает их из списка, не меняя отбор вручную.
  • 🔹 Пользовательские настройки. Отметьте галочкой, какие отборы и поля пользователь видит в шапке отчёта (быстрые настройки), а какие остаются «под капотом».

Программная генерация табличного документа в коде

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

Минимальный вариант — вывод областей, как с макетом, но макет можно создать и программно либо заполнять ячейки напрямую:

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

// шапка таблицы
Шапка = Новый ТабличныйДокумент;
ЯчейкаName = Шапка.Область(1, 1, 1, 1);
ЯчейкаName.Текст = "Номенклатура";
// ... аналогично остальные колонки

Для Каждого Стр Из ТаблицаЗначений Строки Цикл
    // заполнение строк
КонецЦикла;

ТабДок.Показать();

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

Обращение к ячейкам идёт по номерам строки и колонки через ТабДок.Область(ВерхняяСтрока, ЛеваяКолонка, НижняяСтрока, ПраваяКолонка). У полученной области доступны Текст, Шрифт, ЦветФона, ЦветТекста, Границы, объединение ячеек. Это даёт полный контроль, но кода больше, чем в двух предыдущих способах.

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

Выборка = Запрос.Выполнить().Выбрать();
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Пока Выборка.Следующий() Цикл
    ЗаполнитьЗначенияСвойств(ОбластьСтрока.Параметры, Выборка);
    ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

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

Запись файла методом Записать() на стороне сервера кладёт файл на диск сервера, а не пользователя. В клиент-серверной базе формируйте документ, помещайте во временное хранилище и отдавайте через ПолучитьФайл — иначе пользователь файл не увидит.

Какой способ выбрать под задачу

Три инструмента не конкурируют, а закрывают разные задачи. Коротко:

СпособКогда применятьСтруктураКто настраивает
Макет печатной формыЖёсткий бланк: счёт, акт, накладнаяФиксированнаяРазработчик в Конфигураторе
Отчёт на СКДАналитика с группировками, отборамиГибкая, меняет пользовательРазработчик + пользователь
Программно (ТабличныйДокумент)Нестандартная форма, динамические колонкиЛюбаяТолько разработчик

Практическое правило: печатаете документ — макет; анализируете данные — СКД; ни то ни другое не ложится на задачу — собираете табличный документ кодом. Для простого реестра на форме часто достаточно элемента Таблица значений, выведенного на форму, без печатного документа вообще.

Какой способ создания таблицы выбрать?

Оформление таблицы: шрифты, границы, условное выделение

Внешний вид задаётся по-разному в зависимости от способа.

В макете оформление рисуется сразу: выделяете ячейки, в палитре свойств (F4) задаёте Шрифт, Границы, ЦветФона, выравнивание, формат числа (свойство ФорматстрокиПараметра, например ЧДЦ=2 — два знака после запятой). Всё, что нарисовано в макете, попадёт в печатную форму как есть.

В коде свойства меняются у области после вывода:

ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ОбластьПодвал.Область.ЦветФона = WebЦвета.СветлоСерый;
ОбластьПодвал.Область.Шрифт = Новый Шрифт(, , Истина); // жирный
ТабДок.Вывести(ОбластьПодвал);

Условное оформление — подсветка строк по условию (просрочка красным, нулевой остаток серым) — в отчётах настраивается прямо в СКД: вкладка Настройки → Условное оформление. Там задаётся условие отбора и оформление (цвет, шрифт), код не нужен. В программной таблице условие проверяете сами в цикле и перед выводом строки меняете ЦветТекста или ЦветФона нужной области.

Повторяющиеся на каждой странице шапки таблицы задаются через Таблица → Повторение строк и колонок → Верхний повтор в макете — при печати многостраничной таблицы заголовок печатается на каждом листе.

Экспорт таблицы в Excel, PDF и другие форматы

Любой табличный документ 1С выгружается во внешний файл — и интерактивно, и кодом.

Пользователю. Когда сформированный отчёт или печатная форма открыты на экране, выберите Главное меню → Файл → Сохранить как, в типе файла укажите нужный формат: Лист Excel 2007 (*.xlsx), Лист Excel 97 (*.xls), Документ PDF (*.pdf), таблица HTML, текст. Из того же окна печатная форма уходит на принтер через Файл → Печать.

В коде сохранение делает метод Записать:

ТабДок.Записать("C:\Отчёты\Реестр.xlsx", ТипФайлаТабличногоДокумента.XLSX);

Доступные значения перечисления ТипФайлаТабличногоДокумента включают XLSX, XLS, PDF, ODS, HTML, TXT, MXL (родной формат 1С). Формат MXL сохраняет документ со всем оформлением и областями — его потом снова можно открыть в 1С.

Обратная задача — прочитать данные из Excel — решается методом ТабДок.Прочитать("файл.xlsx") либо через объект COM Excel.Application, но это уже загрузка, а не создание таблицы.

Перед печатью и выгрузкой проверьте параметры страницы табличного документа: у объекта доступны ОриентацияСтраницы (книжная/альбомная), поля, масштаб и ОбластьПечати. Широкую таблицу, которая не влезает по ширине, либо переводят в альбомную ориентацию, либо уменьшают масштаб — иначе при печати правые колонки уйдут на отдельный лист. Для PDF-выгрузки это так же важно, как для бумаги.

Проверка перед выпуском печатной формы или отчёта
Выполнено: 0 / 6

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

Чем макет отличается от СКД?
Макет — это жёсткий шаблон печатной формы, который заполняет код. СКД строит таблицу автоматически по схеме, и пользователь сам меняет группировки и отборы. Бланк документа — макет, аналитический отчёт — СКД.
Можно ли добавить свою печатную форму, не меняя типовую конфигурацию?
Да. Создайте расширение конфигурации, добавьте в него макет и команду печати. Обновления типовой конфигурации вашу доработку не затронут, а поддержку снимать не придётся.
Почему при записи файла на сервере пользователь его не получает?
Метод Записать, вызванный в серверном контексте, сохраняет файл на диск сервера. Чтобы отдать файл пользователю, поместите табличный документ во временное хранилище и передайте клиенту через механизм работы с файлами.
Как вывести таблицу с заранее неизвестным числом колонок?
Только программно: пройдите данные, определите набор колонок, а затем формируйте ТабличныйДокумент в коде или собирайте макет динамически. Макет с фиксированной разметкой и СКД здесь не подойдут.
Как настроить подсветку строк по условию?
В отчёте на СКД — через Настройки → Условное оформление: задаёте условие и цвет, кода не требуется. В программной таблице проверяете условие в цикле и меняете ЦветФона/ЦветТекста области перед выводом строки.