Вывод табличного документа на экран, в печать и в файл: разбор для 1С 8.3

· 9 мин

Содержание

Отобразить табличный документ в 1С можно двумя способами. Быстрый — вызвать ТабДок.Показать("Заголовок") на клиенте: документ откроется в отдельном окне. Правильный для управляемых форм — положить его в реквизит формы типа ТабличныйДокумент и вывести через поле табличного документа.

Частое заблуждение — что Показать() работает только в обычном приложении. На самом деле метод доступен и в тонком клиенте, и в веб-клиенте. Ограничение другое: его нельзя вызвать на сервере, а макеты, наоборот, читаются только на сервере. Отсюда и большинство ошибок, когда документ «не показывается».

Быстрый вывод: метод Показать() и окно документа

Показать() — самый короткий путь от сформированного документа до экрана. Он открывает отдельное окно, где пользователь может распечатать, сохранить или скопировать данные.

Синтаксис:

ТабДок.Показать(<Заголовок>, <КлючУникальности>);
  • 📝 Заголовок — текст в шапке окна.
  • 🔑 КлючУникальности — строка. Если окно с таким ключом уже открыто, 1С активирует его, а не плодит копии.

Пример для толстого клиента в обычном приложении — всё формируется и показывается в одном модуле:

ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Отчет");
Область = Макет.ПолучитьОбласть("Шапка");
Область.Параметры.Период = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
ТабДок.Вывести(Область);

ТабДок.ОтображатьСетку = Ложь;
ТабДок.ОтображатьЗаголовки = Ложь;
ТабДок.ТолькоПросмотр = Истина;
ТабДок.Показать("Отчёт на дату", "ОтчетНаДату");

Свойства перед показом:

СвойствоЧто делает
ОтображатьСеткуСерые линии ячеек. Для печатной формы обычно Ложь
ОтображатьЗаголовкиБуквы и номера строк/колонок по краям
ТолькоПросмотрЗапрещает правку ячеек пользователем
ФиксацияСверхуЧисло строк шапки, которые не прокручиваются

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

Табличный документ на управляемой форме

В управляемом приложении код делится на клиент и сервер. Схема рабочая и проверенная:

  1. Добавьте на форму реквизит с типом ТабличныйДокумент, например Результат.
  2. Перетащите его в дерево элементов — появится поле табличного документа.
  3. Добавьте команду «Сформировать» и обработчик на клиенте.
  4. Заполнение вынесите в серверную процедуру: там доступны макеты и запросы.
&НаКлиенте
Процедура Сформировать(Команда)
    СформироватьНаСервере();
КонецПроцедуры

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

    Шапка = Макет.ПолучитьОбласть("Шапка");
    Результат.Вывести(Шапка);
    // ... вывод строк
КонецПроцедуры

После возврата с сервера форма сама перерисует поле. Вызывать Показать() здесь не нужно.

Когда нужно отдельное окно

Иногда документ формируется кнопкой в списке документов, где поля под него нет. Тогда серверная функция возвращает табличный документ, а клиент его показывает. Табличный документ передаётся между клиентом и сервером без преобразований:

&НаКлиенте
Процедура ПечатьСписка(Команда)
    ТабДок = ПолучитьТабДокНаСервере();
    ТабДок.Показать("Список", "СписокПечать");
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьТабДокНаСервере()
    ТабДок = Новый ТабличныйДокумент;
    Макет = Обработки.ПечатьСписка.ПолучитьМакет("Макет");
    ТабДок.Вывести(Макет.ПолучитьОбласть("Шапка"));
    Возврат ТабДок;
КонецФункции

Где брать макет

Где лежит макетКак получить на сервере
Макет обработки или отчёта конфигурацииОбработки.Имя.ПолучитьМакет("Макет"), Отчеты.Имя.ПолучитьМакет(...)
Макет внешней обработкиРеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет")
Макет документа или справочникаДокументы.Имя.ПолучитьМакет("Макет")
Общий макетПолучитьОбщийМакет("Имя")

В типовых конфигурациях на БСП печатные формы документов показываются через общую форму печати подсистемы «Печать». Если дорабатываете типовую — добавляйте свою форму в механизм печати через расширение, а не открывайте окно напрямую. Так у пользователя останутся кнопки «Отправить», «Сохранить» и выбор количества копий.

Заполнение по макету: области, параметры, группировки

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

Как подготовить макет

  1. В конфигураторе откройте макет, выделите строки шапки.
  2. Через контекстное меню назначьте имя области, например Шапка. Так же — Строка и Подвал.
  3. В ячейке, куда подставляется значение, откройте свойства и задайте Заполнение:
    • Параметр — в ячейку целиком подставится значение параметра, имя параметра пишется в поле «Параметр»;
    • Шаблон — текст с подстановками в квадратных скобках: Итого: [Сумма] руб.;
    • Текст — статичная надпись, ничего не подставляется.

Вывод строк из запроса

ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Выборка = Запрос.Выполнить().Выбрать();
НомерСтроки = 0;
Пока Выборка.Следующий() Цикл
    НомерСтроки = НомерСтроки + 1;
    ОбластьСтрока.Параметры.Заполнить(Выборка);
    ОбластьСтрока.Параметры.Номер = НомерСтроки;
    ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

Параметры.Заполнить() переносит значения из полей выборки в одноимённые параметры. Поэтому псевдонимы в запросе удобно называть так же, как параметры в макете.

Документ без макета: заполнение ячеек из кода

Для служебной выгрузки или быстрой проверки данных макет рисовать не обязательно. К любой ячейке можно обратиться по адресу в формате R1C1 и записать в неё текст:

ТабДок = Новый ТабличныйДокумент;
Заголовок = ТабДок.Область("R1C1:R1C4");
Заголовок.Объединить();
Заголовок.Текст = "Остатки на складе";
Заголовок.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;

ТабДок.Область("C1").ШиринаКолонки = 40;
ТабДок.Область("R3C1").Текст = "Номенклатура";
ТабДок.Область("R3C2").Текст = "Количество";

Строки и колонки нумеруются с единицы. Адрес R3C2 — третья строка, вторая колонка. Так удобно собирать документы, у которых число колонок заранее неизвестно.

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

Свойства поля на форме

Часть настроек задаётся не у документа, а у элемента формы. В палитре свойств поля табличного документа есть режим редактирования, отображение сетки и заголовков, а также события. Самое востребованное событие — ОбработкаРасшифровки: оно срабатывает по двойному клику на ячейке с расшифровкой.

Если одна и та же настройка задана и у поля, и в коде у документа, проверьте результат на экране сразу после первого формирования.

Сохранить сформированный документ и показать позже

Готовую форму иногда нужно хранить: например, зафиксировать акт в том виде, в каком его подписали. Табличный документ помещается в реквизит типа ХранилищеЗначения:

Объект.СохраненнаяФорма = Новый ХранилищеЗначения(ТабДок, Новый СжатиеДанных(9));
// позже, на сервере
ТабДок = Объект.СохраненнаяФорма.Получить();

После Получить() документ возвращают на клиент и показывают любым из способов выше. Данные из базы при этом не перечитываются: пользователь видит ровно ту версию, что была сохранена.

Вывод вправо и с группировками

  • ➡️ ТабДок.Присоединить(Область) — выводит область справа от предыдущей, а не ниже. Так строят отчёты с колонками по месяцам.
  • 🌳 Группировки строк с плюсиками слева:
ТабДок.НачатьАвтогруппировкуСтрок();
ТабДок.Вывести(ОбластьГруппа, 1);   // уровень 1
ТабДок.Вывести(ОбластьСтрока, 2);   // вложенный уровень
ТабДок.ЗакончитьАвтогруппировкуСтрок();

Расшифровка по двойному клику: заполните у ячейки свойство «Параметр расшифровки», а в параметр положите ссылку. В управляемой форме обработайте событие поля ОбработкаРасшифровки, иначе 1С откроет ссылку стандартно.

Параметры страницы и вывод на принтер

Документ на экране и на бумаге — разные вещи. Чтобы печать не разъезжалась, задайте параметры страницы в коде, до показа:

ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДок.АвтоМасштаб = Истина;            // вписать по ширине страницы
ТабДок.ПолеСлева = 10;                  // миллиметры
ТабДок.ПолеСправа = 10;
ТабДок.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ОтчетПоСкладу";

Свойство ИмяПараметровПечати стоит задать всегда. По этому имени 1С запоминает, как пользователь настроил страницу в окне «Параметры страницы», и в следующий раз применит его настройки.

Разрыв страниц и повтор шапки

  • 📄 Шапка таблицы на каждом листе: ТабДок.ПовторятьПриПечатиСтрок = ТабДок.Область("R3:R4"); — номера строк укажите свои.
  • ✂️ Не рвать строку и подвал между листами — проверка через ПроверитьВывод:
МассивОбластей = Новый Массив;
МассивОбластей.Добавить(ОбластьСтрока);
МассивОбластей.Добавить(ОбластьПодвал);
Если Не ТабДок.ПроверитьВывод(МассивОбластей) Тогда
    ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ТабДок.Вывести(ОбластьСтрока);

Печать без показа

Метод ТабДок.Напечатать() отправляет документ на принтер с клиента. Количество копий — свойство КоличествоЭкземпляров. Для массовой печати, например 200 накладных подряд, удобно сначала собрать всё в один табличный документ, разделяя формы через ВывестиГоризонтальныйРазделительСтраниц(), и напечатать один раз.

Поля и ориентация заработают только если документ влезает в лист в принципе. Широкая таблица на 30 колонок с АвтоМасштаб = Истина уменьшится так, что её не прочитать. Лучше альбомная ориентация и меньше колонок.

Сохранение в Excel, PDF и открытие во внешней программе

Пользователю: без кода

В открытом отчёте или окне табличного документа есть кнопка сохранения (значок дискеты) или пункт «Сохранить как» в главном меню. В диалоге выберите тип файла: .xlsx, .pdf, .docx, .mxl, .html, .txt, .ods.

Файл .mxl — родной формат табличного документа. Открыть его без базы можно бесплатной программой «1С:Предприятие — Работа с файлами».

Программисту: метод Записать()

ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);

Основные значения второго параметра:

ЗначениеФормат
ТипФайлаТабличногоДокумента.XLSXExcel 2007 и новее
ТипФайлаТабличногоДокумента.PDFPDF для отправки
ТипФайлаТабличногоДокумента.DOCXWord
ТипФайлаТабличногоДокумента.MXLФормат 1С
ТипФайлаТабличногоДокумента.HTML5Веб-страница

Как отдать файл пользователю в тонком клиенте

В клиент-серверной базе путь вида C:\Temp\ на сервере и на компьютере пользователя — это разные диски. Поэтому схема в три шага:

  1. На сервере записать документ во временный файл: ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx").
  2. Поместить его во временное хранилище: Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяВременногоФайла), УникальныйИдентификатор) и удалить временный файл через УдалитьФайлы().
  3. На клиенте сохранить файл пользователю. В конфигурациях на БСП — ФайловаяСистемаКлиент.СохранитьФайл(Неопределено, Адрес, "Отчет.xlsx").

Сразу открыть в Excel

Сохранить файл на клиенте и запустить его связанной программой. В толстом клиенте — ЗапуститьПриложение(ИмяФайла). В конфигурациях на БСП удобнее ФайловаяСистемаКлиент.ОткрытьФайл(): он сам учитывает тонкий и веб-клиент.

Если Excel показывает числа как текст, проверьте в макете формат ячеек. Значение, выведенное через Формат(), приходит строкой. Для чисел подставляйте в параметр само число, а формат задавайте в свойствах ячейки.

Ошибки при отображении табличного документа и как их найти

Диагностика: выберите симптом

Ещё две ловушки, которые не видно в тексте ошибок:

  • 🐢 Медленный вывод больших отчётов. Вывод десятков тысяч строк по одной заметно тормозит. Сократите выборку отбором, отключите лишние группировки или стройте отчёт на системе компоновки данных.
  • 🔒 Пользователь меняет цифры в готовом отчёте. Поставьте ТолькоПросмотр = Истина у документа или запретите редактирование в свойствах поля на форме.

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

Чем Вывести() отличается от Присоединить()?
Вывести() добавляет область ниже уже выведенного. Присоединить() ставит её справа от последней выведенной области в той же строке.
Можно ли показать табличный документ из фонового задания?
Нет, у фонового задания нет интерфейса. Сформируйте документ в задании, положите его во временное хранилище, а на клиенте заберите через ПолучитьИзВременногоХранилища() и покажите.
Как открыть сохранённый файл .mxl в 1С?
В режиме «1С:Предприятие» через главное меню «Файл → Открыть». Без базы — программой «1С:Предприятие — Работа с файлами».
Как вывести картинку или штрихкод в табличный документ?
Добавьте в макет рисунок, а в коде заполните его свойство Картинка через Область.Рисунки.ИмяРисунка.Картинка = Новый Картинка(ДвоичныеДанные).
Почему отчёт на СКД не нужно выводить вручную?
Отчёты на системе компоновки данных выводятся в табличный документ стандартной формой отчёта. Код вывода по областям нужен только для печатных форм и нестандартных отчётов.