Таблицы в 1С 8.3: макеты, СКД и табличный документ
Содержание
Таблицу в 1С делают одним из трёх способов: макетом табличного документа (печатная форма документа или справочника), отчётом на системе компоновки данных (СКД) или программно — через объект ТабличныйДокумент. Выбор зависит от того, что нужно: фиксированный печатный бланк, гибкий отчёт с группировками и отборами или таблица, собираемая кодом на лету.
Все три работают с одним и тем же объектом платформы — табличным документом (.mxl). Макет задаёт его шаблон, СКД строит его автоматически по схеме, а в коде вы заполняете его сами. Ниже — где какой способ уместен, точные шаги в Конфигураторе и примеры кода для платформы 8.3 в интерфейсе «Такси».
Макет табличного документа: фиксированная печатная форма
Макет подходит, когда нужен бланк жёсткой структуры: счёт, акт, накладная, договор. Разметка задаётся один раз в Конфигураторе, а код только подставляет данные.
Как создать макет:
- Откройте Конфигуратор, найдите объект (например, документ
РеализацияТоваровУслуг) в дереве конфигурации. - Разверните его ветку, встаньте на
Макеты, через контекстное меню выберитеДобавить. - В конструкторе макета задайте тип
Табличный документи имя, напримерПечать.
Открывается редактор, похожий на лист Excel. В нём вы рисуете именованные области — горизонтальные (по строкам) и вертикальные (по колонкам). Типовой набор для печатной формы:
- 🔹
Шапка— реквизиты документа: номер, дата, контрагент; - 🔹
Строка— одна строка табличной части, выводится в цикле; - 🔹
Подвал— итоги, подписи.
Чтобы выделить область, протяните мышью по номерам строк слева, затем Таблица → Имена → Назначить имя (либо через контекстное меню выделения). В ячейку, которую будет заполнять код, впишите имя параметра и в свойствах ячейки (палитра свойств, F4) поставьте Заполнение = Параметр.
Вывод макета в коде. В управляемом приложении печать обычно живёт в модуле менеджера объекта, в процедуре Печать(), но суть одна:
Макет = Документы.РеализацияТоваровУслуг.ПолучитьМакет("Печать");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.НомерДокумента = Номер;
ОбластьШапка.Параметры.ДатаДокумента = Дата;
ТабДок = Новый ТабличныйДокумент;
ТабДок.Вывести(ОбластьШапка);
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Для Каждого СтрокаТЧ Из Товары Цикл
ОбластьСтрока.Параметры.Номенклатура = СтрокаТЧ.Номенклатура;
ОбластьСтрока.Параметры.Количество = СтрокаТЧ.Количество;
ОбластьСтрока.Параметры.Сумма = СтрокаТЧ.Сумма;
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
Метод ПолучитьОбласть берёт шаблон области из макета, Параметры подставляет значения, Вывести дописывает область вниз табличного документа. Шапка выводится один раз, строка — в цикле по табличной части.
В ячейке макета различают три типа заполнения: Текст (статичная надпись — «Итого», «Накладная №»), Параметр (подставляется из кода) и Шаблон (смешанный текст с параметрами в квадратных скобках, например Счёт № [НомерДокумента] от [ДатаДокумента]). Тип задаётся в свойстве ячейки Заполнение. Помимо горизонтальных областей бывают и вертикальные — их выводят через Присоединить рядом с предыдущей, когда число колонок переменное.
Готовые печатные формы для типовых документов уже встроены в конфигурацию. Свою форму удобнее добавлять не правкой типовой конфигурации, а через расширение конфигурации — тогда обновления не затрут вашу доработку.
Отчёт на СКД: таблица с группировками и отбором
Когда пользователю нужна аналитика — суммы по контрагентам, остатки по складам, продажи по месяцам — делают отчёт на системе компоновки данных. СКД сама строит табличный документ по схеме, а пользователь на лету меняет группировки, отборы и сортировку.
Как собрать отчёт на СКД:
- В Конфигураторе добавьте объект
Отчёт, в его палитре свойств откройтеОсновная схема компоновки данных → Открыть. - На вкладке
Наборы данныхдобавьте набор типаЗапроси нажмитеКонструктор запроса. - Выберите таблицы (регистры, документы, справочники) и поля, которые попадут в отчёт.
- На вкладке
Ресурсыотметьте числовые поля для итогов (сумма, количество) и функцию агрегации — обычноСумма(). - На вкладке
Настройкипостройте структуру: добавьте группировки (например, по контрагенту, внутри — по документам), вынесите поля в колонки, задайте отборы и сортировку по умолчанию.
Готовый отчёт пользователь открывает в режиме 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-выгрузки это так же важно, как для бумаги.
Частые вопросы
Чем макет отличается от СКД?
Можно ли добавить свою печатную форму, не меняя типовую конфигурацию?
Почему при записи файла на сервере пользователь его не получает?
Записать, вызванный в серверном контексте, сохраняет файл на диск сервера. Чтобы отдать файл пользователю, поместите табличный документ во временное хранилище и передайте клиенту через механизм работы с файлами.Как вывести таблицу с заранее неизвестным числом колонок?
ТабличныйДокумент в коде или собирайте макет динамически. Макет с фиксированной разметкой и СКД здесь не подойдут.Как настроить подсветку строк по условию?
Настройки → Условное оформление: задаёте условие и цвет, кода не требуется. В программной таблице проверяете условие в цикле и меняете ЦветФона/ЦветТекста области перед выводом строки.