Разработка и Конфигурация · 9 мин
Как вывести табличный документ на форму 1С
Разбираем способы вывода табличного документа на форму в 1С: реквизит формы, элемент ПолеТабличногоДокумента, примеры кода и типичные ошибки.
Табличный документ в 1С — универсальный объект для отчётов, печатных форм и произвольных таблиц. Чтобы пользователь увидел результат, недостаточно сформировать документ кодом: его нужно связать с элементом формы. Ошибка на этом этапе — самая частая причина «пустой формы», когда отчёт вроде бы построился, но на экране ничего нет.
Механизм вывода отличается в обычных и управляемых формах, а также зависит от того, где формируется документ — на клиенте или на сервере. Ниже разобраны рабочие варианты для управляемого приложения, которое используется в большинстве современных конфигураций, с примерами кода и проверкой результата.
Что понадобится: реквизит формы и элемент поля
Вывод табличного документа строится на связке двух объектов. Первый — реквизит формы с типом «ТабличныйДокумент», который хранит само содержимое. Второй — элемент формы «Поле табличного документа», который отображает содержимое реквизита на экране. Без реквизита элементу нечего показывать, без элемента реквизит остаётся невидимым для пользователя.
Порядок создания в конфигураторе:
- Откройте нужную форму объекта или создайте общую форму отчёта.
- В панели реквизитов добавьте реквизит, например с именем «РезультатДокумент», и выберите тип «ТабличныйДокумент».
- Перетащите реквизит в дерево элементов формы — платформа автоматически создаст поле нужного вида и свяжет его через свойство «ПутьКДанным».
- При необходимости настройте свойства поля: «ТолькоПросмотр», «ОтображениеСетки», «Защита».
Базовый вывод: заполнение реквизита на сервере
В управляемой форме объекты типа «ТабличныйДокумент» живут на сервере, поэтому заполнение выполняют в серверной процедуре. Типовой сценарий: пользователь нажимает кнопку «Сформировать», вызывается клиентская команда, которая обращается к серверной процедуре, а та заполняет реквизит формы.
Пример кода модуля формы:
&НаКлиенте
Процедура Сформировать(Команда)
СформироватьНаСервере();
КонецПроцедуры
&НаСервере
Процедура СформироватьНаСервере()
РезультатДокумент.Очистить();
Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("МакетОтчета");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
РезультатДокумент.Вывести(ОбластьШапка);
// далее вывод строк данных
КонецПроцедуры
Обратите внимание на метод Очистить() перед формированием: без него при повторном нажатии кнопки новые области добавятся к старым, и документ будет дублироваться. Это одна из самых распространённых ошибок начинающих разработчиков.
- 1Добавьте реквизит формы типа «ТабличныйДокумент»
- 2Перетащите реквизит на форму и проверьте связь элемента с реквизитом
- 3Создайте команду и кнопку «Сформировать»
- 4В серверной процедуре очистите реквизит и выведите области макета
- 5Запустите форму в режиме предприятия и проверьте результат
- 6Проверьте повторное формирование — данные не должны дублироваться
Вывод без макета: программное заполнение ячеек
Макет не обязателен. Табличный документ можно заполнять напрямую, обращаясь к областям по координатам. Это удобно для простых таблиц, отладочных выгрузок или когда структура заранее неизвестна.
&НаСервере
Процедура ЗаполнитьПрограммно()
РезультатДокумент.Очистить();
РезультатДокумент.Область("R1C1").Текст = "Номенклатура";
РезультатДокумент.Область("R1C2").Текст = "Остаток";
НомерСтроки = 2;
Для Каждого Строка Из ТаблицаДанных Цикл
РезультатДокумент.Область("R" + НомерСтроки + "C1").Текст = Строка.Наименование;
РезультатДокумент.Область("R" + НомерСтроки + "C2").Текст = Строка.Остаток;
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
КонецПроцедуры
Нумерация областей ведётся с единицы, адресация — в стиле R1C1 (строка, колонка). Учтите, что программное заполнение построчно работает медленнее вывода готовых областей макета, поэтому для больших отчётов предпочтительнее макеты.
Вывод результата СКД в табличный документ
Если отчёт построен на системе компоновки данных, результат выводится через объект «ПроцессорВыводаРезультатаКомпоновкиДанных» с указанием элемента результата — того же реквизита формы. Это стандартный механизм, который использует типовой отчёт на СКД.
&НаСервере
Процедура СформироватьОтчетСКД()
РезультатДокумент.Очистить();
Схема = РеквизитФормыВЗначение("Объект").ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(РезультатДокумент);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Ключевая строка — УстановитьДокумент(РезультатДокумент): она определяет, куда попадёт результат. Если забыть её или указать другую переменную, отчёт сформируется «в никуда».
Обычные формы и тонкости переноса кода
В обычном приложении механизм проще: элемент «ПолеТабличногоДокумента» можно заполнять напрямую через свойство «Владелец» или через элемент формы, и весь код выполняется на клиенте без разделения на серверные вызовы. Там допустимо обращение вида ЭлементыФормы.Результат.Вывести(Область).
При переносе кода из обычной формы в управляемую это обращение перестаёт работать: в управляемой форме у элемента нет методов табличного документа, есть только реквизит. Правило переноса простое — всё, что касается формирования содержимого, уходит в серверную процедуру и работает с реквизитом формы, а клиентская часть только вызывает её.
Сравнение вариантов
Основной вариант для отчётов и печатных форм: структура хранится в макете, код компактный, легко поддерживать
Подходит для простых или динамических таблиц, но медленнее и сложнее в оформлении
Стандарт для аналитических отчётов с настройками пользователя; требует больше кода инициализации
Проверка результата и отладка
Если форма открывается, но документ пуст, проверяйте по цепочке. Сначала убедитесь, что серверная процедура вообще вызывается — поставьте точку останова или выведите сообщение. Затем проверьте, что реквизит заполняется: количество строк документа можно посмотреть через ВысотаТаблицы. Наконец, убедитесь, что элемент формы смотрит именно на этот реквизит.
Отдельный случай — документ формируется, но выглядит неправильно: съехали колонки, нет границ, обрезан текст. Это уже вопрос макета, а не механизма вывода. Проверяйте ширину колонок в макете, свойства ячеек и параметры объединения областей.
Как проверить результат
ПутьКДанным указывает на реквизит типа ТабличныйДокумент
ПутьКДанным пустой или ведёт на другой реквизит
Точка останова срабатывает, реквизит заполняется
Процедура не вызывается или падает с ошибкой
Документ перестраивается без дублей
Данные добавляются к предыдущим
Таблица видна, прокрутка и масштаб работают
Пустая область при заполненном реквизите
Часто задаваемые вопросы
Можно ли вывести табличный документ на форму без реквизита?
Нет, в управляемой форме элемент «Поле табличного документа» обязан быть связан с реквизитом формы соответствующего типа. Альтернатива — открыть документ в отдельном окне через метод Показать(), тогда форма не нужна вовсе.
Почему возникает ошибка при заполнении документа на клиенте?
В управляемой форме табличный документ — серверный объект. В клиентской процедуре у него недоступны методы вывода. Перенесите заполнение в процедуру с директивой &НаСервере и вызывайте её из клиентской команды.
Как сделать поле табличного документа доступным только для просмотра?
Установите у элемента формы свойство «ТолькоПросмотр» в значение «Истина». Дополнительно можно включить защиту документа через свойство реквизита, чтобы запретить редактирование ячеек пользователем.
Чем вывод на форму отличается от метода Показать()?
Метод Показать() открывает документ в отдельном окне просмотра, не привязанном к вашей форме. Вывод на форму встраивает таблицу в интерфейс, позволяет разместить рядом кнопки и настройки, но требует реквизита и элемента формы.
Как вывести табличный документ на форму внешней обработки?
Точно так же: у формы внешней обработки добавьте реквизит типа «ТабличныйДокумент» и элемент поля. Макет при этом получают методом ЭтотОбъект.ПолучитьМакет() в серверной процедуре формы обработки.
Тормозит форма с большим табличным документом — что делать?
Большие документы на тысячи строк замедляют передачу данных между сервером и клиентом. Ограничьте объём выборки, выводите данные порциями или используйте динамический список вместо табличного документа, если не нужны группировки и оформление макета.
Что важно запомнить
Вывод табличного документа на форму строится на паре «реквизит формы + элемент Поле табличного документа». Заполнение выполняется на сервере, перед формированием реквизит очищают, а связь элемента с реквизитом проверяют в первую очередь при пустом результате.