Разработка и Конфигурация · 11 мин
Как заполнить табличный документ в 1С
Как заполнить табличный документ в 1С: вывод областей из макета, заполнение параметров, программная запись в ячейки, типовые ошибки и проверка результата.
Табличный документ в 1С — это объект, который используется для печатных форм, отчётов и любых выводимых пользователю таблиц: актов, накладных, прайсов, универсальных передаточных документов. Заполнить его можно двумя принципиально разными способами: вручную через интерфейс (когда документ открыт как файл MXL или отчёт) и программно — на встроенном языке, когда разработчик формирует печатную форму из данных информационной базы.
На практике чаще всего требуется именно программное заполнение: взять макет, вывести из него нужные области, подставить в параметры реальные данные документа и вернуть готовый табличный документ пользователю или отправить на печать. Ниже разобран полный цикл — от структуры макета до проверки результата, с примерами кода и типичными ошибками.
Что такое табличный документ и где он применяется
Табличный документ (объект типа ТабличныйДокумент) — это электронная таблица, внешне похожая на лист Excel: строки, колонки, ячейки, объединения, рамки, шрифты. В отличие от Excel, он тесно связан с механизмом макетов: обычно документ не рисуют «с нуля», а собирают из готовых областей, заранее оформленных в конфигураторе.
Основные сценарии применения: печатные формы документов (счета, акты, ТОРГ-12), отчёты без СКД, этикетки и ценники, выгрузка произвольных таблиц в файл MXL или Excel. Во всех этих случаях логика одинакова: есть макет-шаблон и есть данные, которые нужно в него подставить.
Подготовка макета: области и параметры
Прежде чем заполнять документ, нужен макет. В конфигураторе макет создаётся у объекта (документа, справочника, обработки) или как общий макет с типом «Табличный документ». Внутри макета выделяют области: например, «Шапка», «СтрокаТовары», «Подвал». Область выделяют мышью и именуют через меню «Таблица — Имена — Назначить имя».
В ячейках макета бывают три типа заполнения, которые задаются в палитре свойств ячейки:
- Текст — неизменяемая строка, например заголовок «Покупатель:»;
- Параметр — место подстановки данных, в ячейке пишут имя параметра, например
Покупатель; - Шаблон — смесь текста и параметров в квадратных скобках:
Покупатель: [Покупатель].
Именно параметры — главный механизм заполнения. Разработчик обращается к ним через коллекцию Параметры области и присваивает значения перед выводом области в документ.
Базовый алгоритм программного заполнения
Классическая последовательность заполнения табличного документа из макета выглядит так: создать объект, получить макет, в цикле вывести области с заполненными параметрами. Минимальный пример для печатной формы накладной:
ТабДок = Новый ТабличныйДокумент;
Макет = Документы.РеализацияТоваровУслуг.ПолучитьМакет("Накладная");
// Шапка
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.НомерДокумента = Ссылка.Номер;
ОбластьШапка.Параметры.ДатаДокумента = Формат(Ссылка.Дата, "ДЛФ=D");
ОбластьШапка.Параметры.Покупатель = Ссылка.Контрагент;
ТабДок.Вывести(ОбластьШапка);
// Строки табличной части
ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаТовары");
Для Каждого СтрокаТовара Из Ссылка.Товары Цикл
ОбластьСтрока.Параметры.Заполнить(СтрокаТовара);
ОбластьСтрока.Параметры.Сумма = СтрокаТовара.Сумма;
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
// Подвал
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ОбластьПодвал.Параметры.ИтогоСумма = Ссылка.Товары.Итог("Сумма");
ТабДок.Вывести(ОбластьПодвал);
- 1Создайте объект: ТабДок = Новый ТабличныйДокумент
- 2Получите макет методом ПолучитьМакет() у менеджера объекта или обработки
- 3Получите нужную область макета методом ПолучитьОбласть()
- 4Заполните параметры области через Параметры.ИмяПараметра или Параметры.Заполнить()
- 5Выведите область в документ методом Вывести() или Присоединить()
- 6Повторите для всех строк и итоговых областей, затем покажите или напечатайте документ
Обратите внимание на метод Параметры.Заполнить(СтрокаТовара): он автоматически подставляет в параметры области значения одноимённых полей источника. Это удобно, когда имена колонок табличной части совпадают с именами параметров макета, но требует аккуратности — лишние параметры в макете останутся пустыми, а лишние поля источника будут проигнорированы.
Вывод областей: вертикально и горизонтально
Метод Вывести() добавляет область вниз документа — так строятся почти все печатные формы: шапка, строки, подвал. Метод Присоединить() добавляет область справа от уже выведенной. Присоединение нужно, когда таблица растёт вширь: например, прайс, где каждая колонка — отдельный склад или категория цен.
// Первая колонка — наименования
ТабДок.Вывести(Макет.ПолучитьОбласть("КолонкаТовар"));
// Остальные колонки присоединяем справа
Для Каждого Склад Из Склады Цикл
Область = Макет.ПолучитьОбласть("КолонкаСклад");
Область.Параметры.ИмяСклада = Склад.Наименование;
ТабДок.Присоединить(Область);
КонецЦикла;
Для многостраничных документов полезен метод ПроверитьВывод(): он сообщает, поместятся ли переданные области на текущей странице. Если нет — выводят горизонтальный разделитель страниц методом ВывестиГоризонтальныйРазделительСтраниц() и повторяют шапку таблицы. Это стандартный приём для длинных накладных.
Точечная запись в ячейки без макета
Иногда макет избыточен — например, нужно сформировать простую служебную таблицу или дописать значение в уже сформированный документ. Тогда ячейки заполняют напрямую через метод Область():
ТабДок = Новый ТабличныйДокумент;
ТабДок.Область("R1C1").Текст = "Номенклатура";
ТабДок.Область("R1C2").Текст = "Количество";
ТабДок.Область("R2C1").Текст = "Кирпич М-150";
ТабДок.Область("R2C2").Текст = 120;
// Оформление
ТабДок.Область("R1C1:R1C2").Шрифт = Новый Шрифт(, , Истина);
Адресация R1C1 означает строка 1, колонка 1. Можно обращаться и по имени области, если она есть: ТабДок.Область("ИтогоСумма").Текст = .... Учтите ограничение: через свойство Текст в ячейку попадает строковое представление. Если нужно сохранить тип значения (число, дату) для дальнейшей выгрузки в Excel, используйте свойство ячейки Значение при типе содержимого «Значение» — этот тип доступен при программной настройке расшифровки и в макетах отчётов.
Заполнение вручную и работа с файлом MXL
Табличный документ можно открыть и заполнить без программирования. В режиме предприятия файл MXL открывается через «Файл — Открыть», после чего ячейки редактируются как в обычной электронной таблице: ввод текста, копирование, вставка из Excel через буфер обмена. Для сохранения используется «Файл — Сохранить как» с выбором формата MXL, XLSX, PDF или HTML.
В конфигураторе макет редактируется аналогично, плюс доступна настройка параметров и шаблонов ячеек через палитру свойств. Ручной способ подходит для разовых задач: поправить форму, подготовить шаблон, проверить верстку. Для регулярного формирования документов из данных базы ручное заполнение не масштабируется — нужен программный код.
Сравнение способов заполнения
Подходит для печатных форм и отчётов. Централизованное оформление, легко менять шаблон. Требует заранее созданного макета.
Подходит для простых или динамических таблиц без шаблона. Гибко, но оформление приходится задавать в коде, поддержка сложнее.
Подходит для разовых правок и подготовки шаблонов. Не применимо для регулярного формирования из данных базы.
Типичные ошибки и как их избежать
Отдельная группа проблем — производительность. Если строк тысячи, вывод по одной области с интерактивным обновлением экрана заметно тормозит. Формируйте документ на сервере, не показывая его пользователю до завершения, и не вызывайте лишних обращений к базе внутри цикла — выбирайте данные одним запросом до начала вывода.
Проверка результата
Как проверить результат
В печатной форме нет пустых мест, где должны быть данные
Пустые ячейки или видимые имена параметров в квадратных скобках
Количество строк в форме совпадает с количеством строк документа, итоги сходятся
Строки дублируются, пропущены или содержат данные соседних строк
Шапка таблицы повторяется на каждой странице, строки не разрезаны
Половина строки на одной странице, половина на другой
Числа распознаются как числа, даты — как даты
Все значения выгружены текстом, суммы не считаются
Финальную проверку удобно выполнять, открыв сформированный документ через ТабДок.Показать() в толстом клиенте или вернув его в реквизит формы типа «ТабличныйДокумент» в управляемом приложении. Перед печатью пролистайте все страницы в режиме предварительного просмотра — именно там видны проблемы с разрывами и шириной колонок.
Что важно запомнить
Заполнение табличного документа строится вокруг макета: получить область, заполнить параметры, вывести. Для точечной записи используйте Область() с адресацией R1C1. Контролируйте совпадение имён параметров, очищайте параметры между итерациями и проверяйте разбиение на страницы для длинных документов.
Частые вопросы
Чем отличается Текст от Значения в ячейке табличного документа?
Свойство Текст хранит строковое представление — то, что видит пользователь. Значение хранит типизированные данные (число, дату, ссылку) и доступно, когда содержимое ячейки имеет тип «Значение», что характерно для расшифровки отчётов. Для печатных форм обычно достаточно параметров макета, которые сами формируют текст.
Как вывести табличный документ в файл Excel?
Используйте метод Записать() с указанием типа файла: ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX). Чтобы числа в Excel оставались числами, заполняйте документ через параметры или свойство Значение, а не через строковое свойство Текст.
Почему параметр не заполняется, хотя код выполняется без ошибок?
Чаще всего имя параметра в коде не совпадает с именем в макете — платформа не сообщает об этом. Также проверьте, что в свойствах ячейки макета заполнение установлено как «Параметр» или «Шаблон», а не «Текст»: в ячейку с типом «Текст» параметр подставить нельзя.
Как очистить табличный документ перед повторным заполнением?
Вызовите метод Очистить() — он удаляет все области, оформление и содержимое. Это безопаснее, чем создавать новый объект, если документ уже связан с элементом формы: очистка сохраняет связь, и пользователь увидит обновлённый результат.
Можно ли заполнить табличный документ без макета вообще?
Да, через прямую адресацию ячеек методом Область("R<строка>C<колонка>") с установкой Текст и оформления (шрифт, рамки, цвет). Такой подход оправдан для простых служебных таблиц, но для печатных форм с фирменным оформлением макет удобнее: вёрстку меняют в конфигураторе, не трогая код.
Как повторить шапку таблицы на каждой странице при печати?
Перед выводом строк проверяйте ПроверитьВывод() для очередной строки вместе с подвалом. Если не помещается — выводите горизонтальный разделитель страниц и повторно выводите область шапки таблицы. Альтернатива — задать в свойствах табличного документа сквозные строки через область повторения при печати.