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