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

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

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

Разбираем способы вывода табличного документа на форму в 1С: реквизит формы, элемент ПолеТабличногоДокумента, примеры кода и типичные ошибки.

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

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

Что понадобится: реквизит формы и элемент поля

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

Порядок создания в конфигураторе:

  • Откройте нужную форму объекта или создайте общую форму отчёта.
  • В панели реквизитов добавьте реквизит, например с именем «РезультатДокумент», и выберите тип «ТабличныйДокумент».
  • Перетащите реквизит в дерево элементов формы — платформа автоматически создаст поле нужного вида и свяжет его через свойство «ПутьКДанным».
  • При необходимости настройте свойства поля: «ТолькоПросмотр», «ОтображениеСетки», «Защита».

Базовый вывод: заполнение реквизита на сервере

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

Пример кода модуля формы:

&НаКлиенте

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

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

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

&НаСервере

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

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

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

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

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

// далее вывод строк данных

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

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

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

Вывод без макета: программное заполнение ячеек

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

&НаСервере

Процедура ЗаполнитьПрограммно()

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

РезультатДокумент.Область("R1C1").Текст = "Номенклатура";

РезультатДокумент.Область("R1C2").Текст = "Остаток";

НомерСтроки = 2;

Для Каждого Строка Из ТаблицаДанных Цикл

РезультатДокумент.Область("R" + НомерСтроки + "C1").Текст = Строка.Наименование;

РезультатДокумент.Область("R" + НомерСтроки + "C2").Текст = Строка.Остаток;

НомерСтроки = НомерСтроки + 1;

КонецЦикла;

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

Нумерация областей ведётся с единицы, адресация — в стиле R1C1 (строка, колонка). Учтите, что программное заполнение построчно работает медленнее вывода готовых областей макета, поэтому для больших отчётов предпочтительнее макеты.

Вывод результата СКД в табличный документ

Если отчёт построен на системе компоновки данных, результат выводится через объект «ПроцессорВыводаРезультатаКомпоновкиДанных» с указанием элемента результата — того же реквизита формы. Это стандартный механизм, который использует типовой отчёт на СКД.

&НаСервере

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

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

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

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

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

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;

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

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

ПроцессорВывода.УстановитьДокумент(РезультатДокумент);

ПроцессорВывода.Вывести(ПроцессорКомпоновки);

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

Ключевая строка — УстановитьДокумент(РезультатДокумент): она определяет, куда попадёт результат. Если забыть её или указать другую переменную, отчёт сформируется «в никуда».

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

Обычные формы и тонкости переноса кода

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

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

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

Реквизит формы + макет

Основной вариант для отчётов и печатных форм: структура хранится в макете, код компактный, легко поддерживать

Программное заполнение ячеек

Подходит для простых или динамических таблиц, но медленнее и сложнее в оформлении

Вывод через СКД

Стандарт для аналитических отчётов с настройками пользователя; требует больше кода инициализации

Проверка результата и отладка

Если форма открывается, но документ пуст, проверяйте по цепочке. Сначала убедитесь, что серверная процедура вообще вызывается — поставьте точку останова или выведите сообщение. Затем проверьте, что реквизит заполняется: количество строк документа можно посмотреть через ВысотаТаблицы. Наконец, убедитесь, что элемент формы смотрит именно на этот реквизит.

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

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

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

Связь элемента и реквизита
Норма

ПутьКДанным указывает на реквизит типа ТабличныйДокумент

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

ПутьКДанным пустой или ведёт на другой реквизит

Выполнение серверной процедуры
Норма

Точка останова срабатывает, реквизит заполняется

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

Процедура не вызывается или падает с ошибкой

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

Документ перестраивается без дублей

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

Данные добавляются к предыдущим

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

Таблица видна, прокрутка и масштаб работают

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

Пустая область при заполненном реквизите

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

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

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

Почему возникает ошибка при заполнении документа на клиенте?

В управляемой форме табличный документ — серверный объект. В клиентской процедуре у него недоступны методы вывода. Перенесите заполнение в процедуру с директивой &НаСервере и вызывайте её из клиентской команды.

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

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

Чем вывод на форму отличается от метода Показать()?

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

Как вывести табличный документ на форму внешней обработки?

Точно так же: у формы внешней обработки добавьте реквизит типа «ТабличныйДокумент» и элемент поля. Макет при этом получают методом ЭтотОбъект.ПолучитьМакет() в серверной процедуре формы обработки.

Тормозит форма с большим табличным документом — что делать?

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

Итог

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

Вывод табличного документа на форму строится на паре «реквизит формы + элемент Поле табличного документа». Заполнение выполняется на сервере, перед формированием реквизит очищают, а связь элемента с реквизитом проверяют в первую очередь при пустом результате.