К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как вывести табличный документ в поле табличного документа в 1С

Пошаговая инструкция: как вывести табличный документ в поле табличного документа 1С на форме, примеры кода для обычных и управляемых форм, типичные ошибки.

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

Причина почти всегда одна — не соблюдена цепочка «реквизит формы → элемент формы → программное заполнение». Поле табличного документа не показывает объект само по себе: оно отображает содержимое реквизита формы типа «ТабличныйДокумент», и именно в этот реквизит нужно поместить готовый документ.

Ниже разобран полный порядок действий для управляемых и обычных форм: создание реквизита, добавление элемента на форму, программный вывод, обновление данных и типичные ошибки, из-за которых поле остаётся пустым.

Что такое поле табличного документа и когда его использовать

Поле табличного документа — это элемент формы, предназначенный для отображения объекта встроенного языка «ТабличныйДокумент». Табличный документ в 1С — это не таблица значений и не динамический список, а форматированная электронная таблица с ячейками, объединениями, рамками, картинками и областями, аналогичная листу Excel.

Типовые сценарии использования поля табличного документа:

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

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

Создание реквизита и элемента формы

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

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

Для обычной формы порядок похожий: в редакторе формы добавьте элемент «Поле табличного документа» через панель инструментов и задайте ему имя, например ПолеТабличногоДокумента1. В обычных формах элемент можно заполнять напрямую, без промежуточного реквизита.

Порядок действий
  1. 1
    Откройте форму в конфигураторе и добавьте реквизит типа «ТабличныйДокумент»
  2. 2
    Перетащите реквизит в дерево элементов — создастся поле табличного документа
  3. 3
    Проверьте, что свойство «ПутьКДанным» элемента указывает на реквизит
  4. 4
    В модуле формы сформируйте табличный документ и присвойте его реквизиту
  5. 5
    Откройте форму в режиме предприятия и проверьте отображение

Вывод табличного документа на управляемой форме

На управляемой форме вся работа с табличным документом выполняется на сервере, потому что объект «ТабличныйДокумент» недоступен в клиентском контексте при тонком и веб-клиенте. Типовой код выглядит так:

&НаСервере

Процедура СформироватьНаСервере()

Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("МакетОтчета");

ОбластьШапка = Макет.ПолучитьОбласть("Шапка");

ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

РезультатДокумент.Очистить();

РезультатДокумент.Вывести(ОбластьШапка);

Для Каждого СтрокаДанных Из ДанныеДляВывода Цикл

ОбластьСтрока.Параметры.Заполнить(СтрокаДанных);

РезультатДокумент.Вывести(ОбластьСтрока);

КонецЦикла;

КонецПроцедуры

&НаКлиенте

Процедура Сформировать(Команда)

СформироватьНаСервере();

КонецПроцедуры

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

Если табличный документ уже существует как отдельный объект (например, получен из функции формирования печатной формы), достаточно одной строки присваивания:

РезультатДокумент = СформироватьПечатнуюФорму(ДокументСсылка);
bsl
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	РезультатДокумент.Очистить();
	РезультатДокумент.Вывести(Макет.ПолучитьОбласть("Шапка"));
КонецПроцедуры

Вывод на обычной форме

В обычных формах (режим обычного приложения) элемент формы доступен напрямую, и табличный документ можно выводить в него без промежуточного реквизита:

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

ТабДок.Вывести(Макет.ПолучитьОбласть("Шапка"));

ЭлементыФормы.ПолеТабличногоДокумента1.Очистить();

ЭлементыФормы.ПолеТабличногоДокумента1.Вывести(ТабДок);

Альтернатива — метод ВставитьОбласть(), если нужно перенести содержимое одного документа в другой с сохранением форматирования. На практике проще формировать документ сразу в элементе формы, вызывая у него Вывести() и Присоединить().

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

Настройка отображения: масштаб, защита, режим просмотра

После вывода документа полезно настроить параметры отображения. Основные свойства, доступные у реквизита или элемента:

  • ТолькоПросмотр — запрещает редактирование ячеек пользователем;
  • Защита — защищает документ от изменений, при этом расшифровка продолжает работать;
  • ОтображатьЗаголовки и ОтображатьСетку — показывают или скрывают заголовки строк/колонок и сетку;
  • МасштабПечати — задаёт масштаб отображения в процентах;
  • ФиксацияСверху — количество зафиксированных строк шапки при прокрутке.

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

Обновление и очистка поля при изменении данных

Частая задача — перестраивать документ при изменении параметров на форме (период, организация, настройки). Правильный подход: в обработчике изменения параметра вызывать серверную процедуру формирования, которая начинается с РезультатДокумент.Очистить().

Если формирование занимает заметное время, не вызывайте его на каждое изменение без необходимости — добавьте кнопку «Сформировать» или используйте обработчик ожидания с задержкой. Это снизит нагрузку на сервер и количество клиент-серверных вызовов.

Для полной очистки поля без формирования нового документа достаточно присвоить реквизиту пустой объект: РезультатДокумент = Новый ТабличныйДокумент; — поле станет пустым.

Контрольные точки

Как проверить результат

Отображение документа
Норма

После выполнения кода в поле видны области табличного документа

Тревожный признак

Поле пустое — проверьте связь элемента с реквизитом и вызов серверной процедуры

Повторное формирование
Норма

Новый результат заменяет старый

Тревожный признак

Новые области добавляются ниже старых — пропущен вызов Очистить()

Расшифровка
Норма

Клик по ячейке вызывает событие ОбработкаРасшифровки

Тревожный признак

Ничего не происходит — не заполнен параметр Расшифровка в ячейках или не назначен обработчик

Типичные ошибки и их устранение

Первая и самая частая ошибка — элемент формы не связан с реквизитом. Документ формируется в реквизите, а поле на форме смотрит в другой путь к данным или не имеет его вовсе. Проверьте свойство «ПутьКДанным» элемента.

Вторая ошибка — попытка работать с табличным документом в клиентской процедуре управляемой формы. На тонком клиенте объект «ТабличныйДокумент» недоступен, и код завершится с ошибкой. Всё формирование выносите в процедуры с директивой &НаСервере.

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

Типичные ошибки
01
Формирование документа в локальной переменной вместо реквизита формы — поле на форме остаётся пустым
02
Пропуск Очистить() перед повторным выводом — документ дублируется и растёт вниз
03
Работа с ТабличныйДокумент в клиентском контексте — ошибка на тонком и веб-клиенте
04
Опечатка в имени области макета — исключение «Область не найдена» при выполнении
05
Заполнение параметров области после её вывода — в документе пустые ячейки

Альтернативы полю табличного документа

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

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

Сравнение вариантов

Поле табличного документа

Полный контроль форматирования, печатные формы, схемы. Не подходит для интерактивного редактирования данных

Таблица формы (таблица значений)

Редактирование, сортировка, отбор строк. Нет свободного форматирования ячеек и объединений

СКД с выводом в табличный документ

Отчёты с настройками пользователя и группировками. Избыточна для простых произвольных таблиц

Часто задаваемые вопросы

Почему поле табличного документа пустое, хотя код выполняется без ошибок?

Чаще всего элемент формы не связан с реквизитом: проверьте свойство «ПутьКДанным» поля. Вторая причина — документ формируется в локальной переменной, а не в реквизите формы. Убедитесь, что методы Вывести() вызываются именно у реквизита.

Можно ли вывести табличный документ на клиенте без сервера?

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

Как сделать, чтобы при клике по ячейке открывалась расшифровка?

При формировании заполните параметр Расшифровка у области или ячейки: ОбластьСтрока.Параметры.Расшифровка = НужноеЗначение. Затем назначьте обработчик события «ОбработкаРасшифровки» у поля табличного документа и в нём опишите реакцию на значение расшифровки.

Как очистить поле табличного документа?

Вызовите у реквизита метод Очистить() в серверной процедуре либо присвойте реквизиту новый пустой объект: РезультатДокумент = Новый ТабличныйДокумент. Оба способа убирают всё содержимое из поля на форме.

Можно ли вывести в поле файл Excel или MXL?

Да. Загрузите файл в табличный документ методом Прочитать() с указанием способа чтения (для MXL — напрямую, для Excel — через соответствующий способ чтения табличного документа), затем присвойте результат реквизиту формы. Учтите, что чтение выполняется на сервере, и файл должен быть доступен серверу.

Почему после повторного формирования документ выводится ниже предыдущего?

Потому что метод Вывести() добавляет области в конец существующего документа. Перед новым формированием вызовите Очистить() у реквизита — тогда каждый результат будет заменять предыдущий.

Итог

Что важно запомнить

Поле табличного документа отображает реквизит формы типа «ТабличныйДокумент»: создайте реквизит, свяжите с ним элемент и формируйте документ на сервере с очисткой перед повторным выводом. Большинство проблем — это разорванная связь элемента с реквизитом или попытка работы с документом в клиентском контексте.