Создание таблиц в 1С 8.3: от макета до готового отчёта
Содержание
Таблицу в 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; закрепит две верхние строки, ТабДок.ФиксацияСлева — левые колонки. Это свойство самого документа, а не области, и работает при просмотре на экране.
Для рамок и ширины колонок у области есть свойства Границы и у документа — ШиринаКолонки. Но для сложного оформления проще не рисовать всё кодом, а подготовить макет.
Макет табличного документа в конфигураторе
Макет — это нарисованная заранее таблица с именованными областями. Код подставляет в неё значения и выводит область за областью. Так делают большинство печатных форм.
Создание макета по шагам:
- В конфигураторе откройте нужный объект (документ, обработку, справочник) и на ветке
Макетыдобавьте новый макет с типом Табличный документ. - Нарисуйте шапку, строку таблицы и подвал — обычными ячейками, как в Excel.
- Выделите диапазон строк будущей шапки, через контекстное меню выберите Имена → Назначить имя и задайте имя, например
Шапка. Так же назовите областиСтрокаиПодвал. - В ячейки, куда пойдут данные, впишите параметр в виде
[Параметр]или через свойство ячейки задайте заполнение Параметр.
В коде макет получают и выводят области:
Макет = Обработки.ПечатьПродаж.ПолучитьМакет("Макет");
ТабДок = Новый ТабличныйДокумент;
// Шапка — один раз
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапка);
// Строки — в цикле по выборке
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Для Каждого СтрокаДанных Из ТаблицаПродаж Цикл
ОбластьСтрока.Параметры.Номенклатура = СтрокаДанных.Номенклатура;
ОбластьСтрока.Параметры.Количество = СтрокаДанных.Количество;
ОбластьСтрока.Параметры.Сумма = СтрокаДанных.Сумма;
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
// Подвал с итогом
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ОбластьПодвал.Параметры.ВсегоСумма = ТаблицаПродаж.Итог("Сумма");
ТабДок.Вывести(ОбластьПодвал);
ТабДок.Показать();
Если менять печатную форму типовой конфигурации правкой макета напрямую, при обновлении изменения потеряются, а конфигурация снимется с поддержки. Для своих печатных форм в типовой базе используйте расширение конфигурации — так макет живёт отдельно и переживает обновления.
Метод Присоединить() вместо Вывести() ставит область не под предыдущей, а справа от неё — удобно для таблиц, которые растут вширь по колонкам-месяцам.
Таблица через систему компоновки данных (СКД)
СКД — штатный инструмент отчётов. Группировки, итоги, отборы и сортировку пользователь настраивает сам, а на выходе получается тот же табличный документ. Для отчёта «сумма продаж по номенклатуре с итогами» писать вывод ячеек руками не нужно.
Обычный путь — создать объект Отчёт с макетом типа Схема компоновки данных, где на вкладках задают запрос, ресурсы (итоговые поля), ресурсы-итоги и настройки по умолчанию. Готовый отчёт пользователь открывает через раздел Отчёты и жмёт Сформировать.
Если отчёт строится кодом, схему компоновки прогоняют через три объекта:
Схема = Отчеты.ПродажиПоНоменклатуре.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Компоновщик = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = Компоновщик.Выполнить(Схема, Схема.НастройкиПоУмолчанию);
Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(МакетКомпоновки);
ТабДок = Новый ТабличныйДокумент;
ВыводРезультата = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ВыводРезультата.УстановитьДокумент(ТабДок);
ВыводРезультата.Вывести(Процессор);
ТабДок.Показать();
Схема получает данные из запроса, компоновщик превращает её с настройками в макет компоновки, процессор проходит данные, а процессор вывода раскладывает результат по ячейкам табличного документа. Группировки и итоги СКД рисует сама — это её главное преимущество перед ручным выводом.
Если в отчёте есть параметры (например, период или организация), их значения проставляют в настройках перед выполнением. Параметр находят по имени и задают значение:
Настройки = Схема.НастройкиПоУмолчанию;
ПараметрПериод = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Период"));
ПараметрПериод.Значение = НачалоДня(ТекущаяДата());
Готовые настройки затем передают в Компоновщик.Выполнить. Так один и тот же отчёт строится под разные периоды и отборы без правки схемы.
Условное оформление в СКД задают на отдельной вкладке Условное оформление: выбирают поле, условие (например, «сумма меньше нуля») и формат (цвет, шрифт). Код для этого не нужен.
Таблица значений — структура для расчётов в коде
ТаблицаЗначений живёт в памяти и на экран напрямую не выводится. Её берут, когда данные надо собрать, отфильтровать, сгруппировать или посчитать итоги
перед выводом.
Создание и заполнение:
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("Строка"));
ТЗ.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
ТЗ.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Номенклатура = "Товар А";
НоваяСтрока.Количество = 10;
НоваяСтрока.Сумма = 2500;
На практике таблицу значений редко набивают построчно. Чаще её получают готовой из результата запроса одной строкой — колонки и типы при этом создаются автоматически по полям запроса:
ТЗ = Запрос.Выполнить().Выгрузить();
Такую таблицу уже можно сортировать, сворачивать и считать по ней итоги теми же методами.
Полезные методы, ради которых таблицу значений и берут:
| Метод | Что делает |
|---|---|
Итог("Сумма") | сумма по колонке |
Сортировать("Сумма Убыв") | сортировка по колонке |
НайтиСтроки(Отбор) | все строки по условию (структура отбора) |
Найти(Значение, "Колонка") | первая подходящая строка |
Свернуть("Номенклатура", "Сумма") | группировка: сворачивает строки и суммирует ресурсы |
Выгрузить() | копия таблицы (например, для возврата с сервера) |
Пример — свернуть строки по номенклатуре и получить общий итог:
ТЗ.Свернуть("Номенклатура", "Количество, Сумма");
ОбщаяСумма = ТЗ.Итог("Сумма");
Чтобы показать таблицу значений пользователю, её либо связывают с реквизитом формы типа «Таблица значений», либо выводят через макет в табличный документ, как в разделе выше.
Если нужно удалить строки по условию, идите по коллекции в обратном порядке: Для Сч = ТЗ.Количество() - 1 По 0 Цикл. При прямом цикле удаление сдвигает индексы, и часть строк проскочит.
Оформление ячеек и условное форматирование
У области табличного документа есть свойства оформления — их задают и в макете мышью, и кодом. Основные:
ЦветФонаиЦветТекста— через объектНовый Цвет(R, G, B)или веб-цвета.Шрифт—Новый Шрифт(, , Истина)для жирного начертания.Границы—Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная).ГоризонтальноеПоложение— выравнивание текста в ячейке.ФорматнаяСтрока— формат числа, например"ЧДЦ=2; ЧРД=."для двух знаков после запятой.
Выделить строку с отрицательной суммой красным прямо при выводе:
Если СтрокаДанных.Сумма < 0 Тогда
ОбластьСтрока.Область.ЦветТекста = Новый Цвет(200, 0, 0);
КонецЕсли;
ТабДок.Вывести(ОбластьСтрока);
Общее правило: постоянное оформление — рамки, шрифт шапки, выравнивание — задавайте один раз в макете мышью, а не кодом. Кодом меняйте только то, что зависит от данных: подсветку отрицательных сумм, выделение просроченных строк, цвет по статусу. Тогда код остаётся коротким, а внешний вид правится без программиста.
Это «условное форматирование руками». В СКД и в динамических списках есть штатное Условное оформление — там задают условие и формат декларативно, без кода, и правило применяется ко всем подходящим ячейкам автоматически. Для отчётов это предпочтительнее: правило видно в настройках и его меняет пользователь.
Печать таблицы и выгрузка в Excel
Готовый табличный документ — что из кода, что из макета, что из СКД — выгружают и печатают одними и теми же методами.
Сохранить в файл Excel:
ТабДок.Записать("C:\Отчёт.xlsx", ТипФайлаТабличногоДокумента.XLSX);
Для старого формата подойдёт ТипФайлаТабличногоДокумента.XLS, для PDF — PDF. На клиенте путь лучше не зашивать жёстко, а спрашивать через диалог выбора файла.
Отправить на принтер без предпросмотра:
ТабДок.Напечатать(РежимИспользованияМеханизмаПечатиБезПредупреждений.Использовать);
Если документ показан пользователю методом Показать(), печать и выгрузка доступны ему через меню Файл и кнопки командной панели окна — отдельный код не нужен.
Чтобы на печати таблица не рвалась посреди строки, в макете задают области печати и повторяемые при печати строки (свойства ОбластьПечати, ПовторятьПриПечатиСтроки). Для широких таблиц включают масштаб по ширине страницы через АвтоМасштаб или свойство РазмерКолонтитула/МасштабПечати.
Частые вопросы
Чем табличный документ отличается от таблицы значений?
Можно ли сделать таблицу без программирования?
Как добавить колонку в уже готовую таблицу значений?
ТЗ.Колонки.Добавить("ИмяКолонки", ОписаниеТипов). Новая колонка появится у всех строк со значением по умолчанию для своего типа. Удаляют колонку методом ТЗ.Колонки.Удалить("ИмяКолонки").Почему таблица не выводится, если строить её на сервере?
Показать() работает только на клиенте. Если документ сформирован в серверной процедуре, его возвращают на клиент — через реквизит формы типа «Табличный документ» или через временное хранилище — и уже там вызывают Показать().