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