Создание таблиц в 1С 8.3: от макета до готового отчёта

· 9 мин

Содержание

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

Ниже — как сделать таблицу каждым из этих способов: с путями в конфигураторе, рабочими примерами кода, настройкой оформления и выгрузкой результата в Excel или на принтер. Всё относится к платформе 8.3 с интерфейсом «Такси».

Четыре объекта под таблицу — и когда какой брать

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

  • 📄 Табличный документ (ТабличныйДокумент) — то, что видит пользователь: печатная форма, отчёт на экране, выгрузка в Excel. Состоит из ячеек с координатами, умеет объединять их, рисовать рамки, выводить итоги.
  • 🧩 Макет — заготовка табличного документа, нарисованная в конфигураторе мышью. Код только подставляет данные в именованные области.
  • 📊 СКД — конструктор отчётов с группировками, итогами, отборами и настройками пользователя. Сама формирует табличный документ на выходе.
  • 🔢 Таблица значений (ТаблицаЗначений) — структура данных в памяти: строки и колонки для вычислений, сортировки, поиска. На экран напрямую не выводится.
Что нужно сделать с таблицей?

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

Самый прямой путь — создать ТабличныйДокумент и заполнять его ячейки через области. Областью называют прямоугольный диапазон ячеек; к нему обращаются по координатам строк и колонок.

Простой пример — вывести заголовок и строку данных:

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

// Область первой строки, колонки 1–3
Область = ТабДок.Область(1, 1, 1, 3);
Область.Объединить();
Область.Текст = "Отчёт по продажам";
Область.ГоризонтальноеПоложение = ГоризонтальноеПоложениеВЯчейке.Центр;

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

// Строка данных
ТабДок.Область(3, 1).Текст = "Товар А";
ТабДок.Область(3, 2).Текст = 10;
ТабДок.Область(3, 3).Текст = 2500;

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

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

Когда строк много, не адресуйте каждую ячейку вручную. Удобнее завести счётчик текущей строки и наращивать его в цикле, собирая таблицу построчно. Так код не привязан к числу записей.

Чтобы шапка не уезжала при прокрутке длинной таблицы, у документа задают число зафиксированных строк и колонок: ТабДок.ФиксацияСверху = 2; закрепит две верхние строки, ТабДок.ФиксацияСлева — левые колонки. Это свойство самого документа, а не области, и работает при просмотре на экране.

Для рамок и ширины колонок у области есть свойства Границы и у документа — ШиринаКолонки. Но для сложного оформления проще не рисовать всё кодом, а подготовить макет.

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

Макет — это нарисованная заранее таблица с именованными областями. Код подставляет в неё значения и выводит область за областью. Так делают большинство печатных форм.

Создание макета по шагам:

  1. В конфигураторе откройте нужный объект (документ, обработку, справочник) и на ветке Макеты добавьте новый макет с типом Табличный документ.
  2. Нарисуйте шапку, строку таблицы и подвал — обычными ячейками, как в Excel.
  3. Выделите диапазон строк будущей шапки, через контекстное меню выберите Имена → Назначить имя и задайте имя, например Шапка. Так же назовите области Строка и Подвал.
  4. В ячейки, куда пойдут данные, впишите параметр в виде [Параметр] или через свойство ячейки задайте заполнение Параметр.

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

Макет = Обработки.ПечатьПродаж.ПолучитьМакет("Макет");
ТабДок = Новый ТабличныйДокумент;

// Шапка — один раз
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапка);

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

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

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

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

Метод Присоединить() вместо Вывести() ставит область не под предыдущей, а справа от неё — удобно для таблиц, которые растут вширь по колонкам-месяцам.

Таблица через систему компоновки данных (СКД)

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

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

Если отчёт строится кодом, схему компоновки прогоняют через три объекта:

Схема = Отчеты.ПродажиПоНоменклатуре.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

Компоновщик = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = Компоновщик.Выполнить(Схема, Схема.НастройкиПоУмолчанию);

Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(МакетКомпоновки);

ТабДок = Новый ТабличныйДокумент;
ВыводРезультата = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ВыводРезультата.УстановитьДокумент(ТабДок);
ВыводРезультата.Вывести(Процессор);

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

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

Если в отчёте есть параметры (например, период или организация), их значения проставляют в настройках перед выполнением. Параметр находят по имени и задают значение:

Настройки = Схема.НастройкиПоУмолчанию;
ПараметрПериод = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Период"));
ПараметрПериод.Значение = НачалоДня(ТекущаяДата());

Готовые настройки затем передают в Компоновщик.Выполнить. Так один и тот же отчёт строится под разные периоды и отборы без правки схемы.

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

Таблица значений — структура для расчётов в коде

ТаблицаЗначений живёт в памяти и на экран напрямую не выводится. Её берут, когда данные надо собрать, отфильтровать, сгруппировать или посчитать итоги перед выводом.

Создание и заполнение:

ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("Строка"));
ТЗ.Колонки.Добавить("Количество",   Новый ОписаниеТипов("Число"));
ТЗ.Колонки.Добавить("Сумма",         Новый ОписаниеТипов("Число"));

НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Номенклатура = "Товар А";
НоваяСтрока.Количество  = 10;
НоваяСтрока.Сумма        = 2500;

На практике таблицу значений редко набивают построчно. Чаще её получают готовой из результата запроса одной строкой — колонки и типы при этом создаются автоматически по полям запроса:

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

Такую таблицу уже можно сортировать, сворачивать и считать по ней итоги теми же методами.

Полезные методы, ради которых таблицу значений и берут:

МетодЧто делает
Итог("Сумма")сумма по колонке
Сортировать("Сумма Убыв")сортировка по колонке
НайтиСтроки(Отбор)все строки по условию (структура отбора)
Найти(Значение, "Колонка")первая подходящая строка
Свернуть("Номенклатура", "Сумма")группировка: сворачивает строки и суммирует ресурсы
Выгрузить()копия таблицы (например, для возврата с сервера)

Пример — свернуть строки по номенклатуре и получить общий итог:

ТЗ.Свернуть("Номенклатура", "Количество, Сумма");
ОбщаяСумма = ТЗ.Итог("Сумма");

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

Если нужно удалить строки по условию, идите по коллекции в обратном порядке: Для Сч = ТЗ.Количество() - 1 По 0 Цикл. При прямом цикле удаление сдвигает индексы, и часть строк проскочит.

Оформление ячеек и условное форматирование

У области табличного документа есть свойства оформления — их задают и в макете мышью, и кодом. Основные:

  • ЦветФона и ЦветТекста — через объект Новый Цвет(R, G, B) или веб-цвета.
  • Шрифт — Новый Шрифт(, , Истина) для жирного начертания.
  • Границы — Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная).
  • ГоризонтальноеПоложение — выравнивание текста в ячейке.
  • ФорматнаяСтрока — формат числа, например "ЧДЦ=2; ЧРД=." для двух знаков после запятой.

Выделить строку с отрицательной суммой красным прямо при выводе:

Если СтрокаДанных.Сумма < 0 Тогда
    ОбластьСтрока.Область.ЦветТекста = Новый Цвет(200, 0, 0);
КонецЕсли;
ТабДок.Вывести(ОбластьСтрока);

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

Это «условное форматирование руками». В СКД и в динамических списках есть штатное Условное оформление — там задают условие и формат декларативно, без кода, и правило применяется ко всем подходящим ячейкам автоматически. Для отчётов это предпочтительнее: правило видно в настройках и его меняет пользователь.

Печать таблицы и выгрузка в Excel

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

Сохранить в файл Excel:

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

Для старого формата подойдёт ТипФайлаТабличногоДокумента.XLS, для PDF — PDF. На клиенте путь лучше не зашивать жёстко, а спрашивать через диалог выбора файла.

Отправить на принтер без предпросмотра:

ТабДок.Напечатать(РежимИспользованияМеханизмаПечатиБезПредупреждений.Использовать);

Если документ показан пользователю методом Показать(), печать и выгрузка доступны ему через меню Файл и кнопки командной панели окна — отдельный код не нужен.

Чтобы на печати таблица не рвалась посреди строки, в макете задают области печати и повторяемые при печати строки (свойства ОбластьПечати, ПовторятьПриПечатиСтроки). Для широких таблиц включают масштаб по ширине страницы через АвтоМасштаб или свойство РазмерКолонтитула/МасштабПечати.

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

Чем табличный документ отличается от таблицы значений?
Табличный документ — это то, что видно на экране и печати: ячейки, рамки, объединения. Таблица значений — структура данных в памяти для расчётов, у неё нет оформления и на экран она напрямую не выводится. Часто их связывают: данные считают в таблице значений, а выводят через табличный документ.
Можно ли сделать таблицу без программирования?
Да. Для отчёта с таблицей, группировками и итогами создают отчёт на системе компоновки данных и настраивают его в конструкторе мышью. Для печатной формы рисуют макет табличного документа. Код нужен только чтобы подставить данные, а в типовых объектах он часто уже написан.
Как добавить колонку в уже готовую таблицу значений?
Методом ТЗ.Колонки.Добавить("ИмяКолонки", ОписаниеТипов). Новая колонка появится у всех строк со значением по умолчанию для своего типа. Удаляют колонку методом ТЗ.Колонки.Удалить("ИмяКолонки").
Почему таблица не выводится, если строить её на сервере?
Метод Показать() работает только на клиенте. Если документ сформирован в серверной процедуре, его возвращают на клиент — через реквизит формы типа «Табличный документ» или через временное хранилище — и уже там вызывают Показать().
Как сделать так, чтобы правки печатной формы не слетали при обновлении?
Не меняйте макет типовой конфигурации напрямую — это снимает её с поддержки. Создайте расширение конфигурации и правьте копию макета в нём. Расширение подключается поверх типовой и переживает обновления.