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

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

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

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

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

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

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

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

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

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

Загрузка табличного документа из файла MXL

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

ТабДок = ЭлементыФормы.ПолеТабличногоДокумента;

ТабДок.Прочитать("C:\Данные\Отчет.mxl");

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

&НаКлиенте

Процедура ЗагрузитьФайл(Команда)

НачатьПомещениеФайла(

Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект),

, , Истина, УникальныйИдентификатор);

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

&НаКлиенте

Процедура ПослеПомещенияФайла(Результат, Адрес, ИмяФайла, Доп) Экспорт

Если Результат Тогда

ПрочитатьНаСервере(Адрес);

КонецЕсли;

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

&НаСервере

Процедура ПрочитатьНаСервере(Адрес)

Двоичные = ПолучитьИзВременногоХранилища(Адрес);

ИмяВременного = ПолучитьИмяВременногоФайла("mxl");

Двоичные.Записать(ИмяВременного);

ТабДокумент.Прочитать(ИмяВременного);

УдалитьФайлы(ИмяВременного);

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

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

Порядок загрузки из файла MXL
  1. 1
    Создайте реквизит формы типа ТабличныйДокумент и привяжите к нему поле
  2. 2
    На клиенте поместите файл во временное хранилище через НачатьПомещениеФайла
  3. 3
    На сервере извлеките двоичные данные и запишите их во временный файл с расширением mxl
  4. 4
    Вызовите у реквизита метод Прочитать() с путём к временному файлу
  5. 5
    Удалите временный файл и проверьте, что поле отобразило содержимое

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

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

&НаСервере

Процедура ЗаполнитьИзМакета()

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

ТабДокумент.Очистить();

ТабДокумент.Вывести(Макет);

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

Для общего макета достаточно ПолучитьОбщийМакет("ИмяМакета"). Если нужно вывести не весь макет, а отдельную область, используйте Макет.ПолучитьОбласть("Шапка") и выводите области последовательно. Перед загрузкой нового содержимого вызывайте Очистить(), иначе новые области добавятся ниже существующих.

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

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

Альтернатива — вывести один документ в другой через метод Вывести(): ТабДокумент.Вывести(ГотовыйДокумент). Этот способ добавляет содержимое, а не заменяет его, что полезно при объединении нескольких документов в один.

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

Прочитать() из файла

Подходит для файлов MXL, сохранённых ранее. В тонком клиенте требует передачи файла на сервер через временное хранилище.

Вывод макета

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

Присвоение объекта

Подходит, когда документ сформирован программно в том же серверном контексте. Не переносится между клиентом и сервером напрямую.

Вывести(ДругойДокумент)

Подходит для объединения нескольких документов. Добавляет содержимое в конец, требует предварительной очистки при замене.

Особенности управляемых форм: клиент и сервер

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

Если данные для документа приходят из внешнего источника (Excel, текстовый файл), загрузка строится в два этапа: клиент передаёт файл в хранилище, сервер разбирает его и заполняет реквизит. Для файлов Excel на сервере обычно строят новый табличный документ построчно, читая данные через COM-объект или через формат табличного документа, если файл предварительно конвертирован.

Типичные ошибки и как их избежать

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

Вторая группа ошибок — работа с файлами: попытка прочитать файл с клиентского пути на сервере (на сервере этого пути не существует), отсутствие расширения у временного файла, незакрытый файл другим процессом. Всегда используйте ПолучитьИмяВременногоФайла("mxl") и удаляйте временные файлы после чтения.

Типичные ошибки
01
Вызов Прочитать() на клиенте в тонком клиенте — метод недоступен, загрузку нужно выполнять на сервере
02
Чтение файла по клиентскому пути на сервере — файл не найден, сначала поместите его во временное хранилище
03
Отсутствие Очистить() перед загрузкой — новое содержимое добавляется к старому вместо замены
04
Попытка прочитать Excel или CSV методом Прочитать() — ошибка формата, поддерживается только MXL
05
Заполнение локальной переменной вместо реквизита формы — поле остаётся пустым

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

После загрузки убедитесь, что документ действительно заполнен. Программно это можно проверить через свойство ВысотаТаблицы — у пустого документа она равна нулю. Также полезно проверить ШиринаТаблицы и, при необходимости, текст конкретной ячейки через Область("R1C1").Текст.

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

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

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

Свойство ВысотаТаблицы после загрузки
Норма

Значение больше нуля

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

Равно нулю — документ пуст, загрузка не выполнилась

Отображение в поле формы
Норма

Содержимое видно сразу после серверного вызова

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

Поле пустое — проверьте привязку ПутьКДанным и контекст исполнения

Форматирование ячеек
Норма

Шрифты, границы и объединения соответствуют источнику

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

Форматирование потеряно — файл сохранён в другой версии платформы или загружен не как MXL

Итог

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

Поле табличного документа отображает реквизит формы типа «ТабличныйДокумент» — загружать нужно именно его. Из файла MXL используйте Прочитать() на сервере, передав файл через временное хранилище; из макета — Вывести(). Перед загрузкой очищайте документ, а после — проверяйте ВысотаТаблицы.

Частые вопросы

Можно ли загрузить в поле табличного документа файл Excel?

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

Почему в тонком клиенте метод Прочитать() недоступен?

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

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

Вызовите у реквизита формы метод Очистить(): ТабДокумент.Очистить(). Это удалит все области и содержимое. Без очистки методы Вывести() добавят новые данные ниже существующих.

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

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

Почему после загрузки поле остаётся пустым?

Чаще всего заполнен не тот объект: локальная переменная вместо реквизита формы, либо поле привязано к другому реквизиту. Проверьте свойство ПутьКДанным у поля и убедитесь, что код выполняется на сервере и обращается именно к реквизиту формы.

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

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