Вывод табличного документа на экран, в печать и в файл: разбор для 1С 8.3
Содержание
Отобразить табличный документ в 1С можно двумя способами. Быстрый — вызвать ТабДок.Показать("Заголовок") на клиенте: документ откроется в отдельном окне. Правильный для управляемых форм — положить его в реквизит формы типа ТабличныйДокумент и вывести через поле табличного документа.
Частое заблуждение — что Показать() работает только в обычном приложении. На самом деле метод доступен и в тонком клиенте, и в веб-клиенте. Ограничение другое: его нельзя вызвать на сервере, а макеты, наоборот, читаются только на сервере. Отсюда и большинство ошибок, когда документ «не показывается».
Быстрый вывод: метод Показать() и окно документа
Показать() — самый короткий путь от сформированного документа до экрана. Он открывает отдельное окно, где пользователь может распечатать, сохранить или скопировать данные.
Синтаксис:
ТабДок.Показать(<Заголовок>, <КлючУникальности>);
- 📝 Заголовок — текст в шапке окна.
- 🔑 КлючУникальности — строка. Если окно с таким ключом уже открыто, 1С активирует его, а не плодит копии.
Пример для толстого клиента в обычном приложении — всё формируется и показывается в одном модуле:
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Отчет");
Область = Макет.ПолучитьОбласть("Шапка");
Область.Параметры.Период = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
ТабДок.Вывести(Область);
ТабДок.ОтображатьСетку = Ложь;
ТабДок.ОтображатьЗаголовки = Ложь;
ТабДок.ТолькоПросмотр = Истина;
ТабДок.Показать("Отчёт на дату", "ОтчетНаДату");
Свойства перед показом:
| Свойство | Что делает |
|---|---|
ОтображатьСетку | Серые линии ячеек. Для печатной формы обычно Ложь |
ОтображатьЗаголовки | Буквы и номера строк/колонок по краям |
ТолькоПросмотр | Запрещает правку ячеек пользователем |
ФиксацияСверху | Число строк шапки, которые не прокручиваются |
Для отладки удобно вставить ТабДок.Показать() в любом месте клиентского кода: увидите, что успело вывестись, до того как документ попадёт на форму.
Табличный документ на управляемой форме
В управляемом приложении код делится на клиент и сервер. Схема рабочая и проверенная:
- Добавьте на форму реквизит с типом
ТабличныйДокумент, напримерРезультат. - Перетащите его в дерево элементов — появится поле табличного документа.
- Добавьте команду «Сформировать» и обработчик на клиенте.
- Заполнение вынесите в серверную процедуру: там доступны макеты и запросы.
&НаКлиенте
Процедура Сформировать(Команда)
СформироватьНаСервере();
КонецПроцедуры
&НаСервере
Процедура СформироватьНаСервере()
Результат.Очистить();
Обработка = РеквизитФормыВЗначение("Объект");
Макет = Обработка.ПолучитьМакет("Отчет");
Шапка = Макет.ПолучитьОбласть("Шапка");
Результат.Вывести(Шапка);
// ... вывод строк
КонецПроцедуры
После возврата с сервера форма сама перерисует поле. Вызывать Показать() здесь не нужно.
Когда нужно отдельное окно
Иногда документ формируется кнопкой в списке документов, где поля под него нет. Тогда серверная функция возвращает табличный документ, а клиент его показывает. Табличный документ передаётся между клиентом и сервером без преобразований:
&НаКлиенте
Процедура ПечатьСписка(Команда)
ТабДок = ПолучитьТабДокНаСервере();
ТабДок.Показать("Список", "СписокПечать");
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьТабДокНаСервере()
ТабДок = Новый ТабличныйДокумент;
Макет = Обработки.ПечатьСписка.ПолучитьМакет("Макет");
ТабДок.Вывести(Макет.ПолучитьОбласть("Шапка"));
Возврат ТабДок;
КонецФункции
Где брать макет
| Где лежит макет | Как получить на сервере |
|---|---|
| Макет обработки или отчёта конфигурации | Обработки.Имя.ПолучитьМакет("Макет"), Отчеты.Имя.ПолучитьМакет(...) |
| Макет внешней обработки | РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет") |
| Макет документа или справочника | Документы.Имя.ПолучитьМакет("Макет") |
| Общий макет | ПолучитьОбщийМакет("Имя") |
В типовых конфигурациях на БСП печатные формы документов показываются через общую форму печати подсистемы «Печать». Если дорабатываете типовую — добавляйте свою форму в механизм печати через расширение, а не открывайте окно напрямую. Так у пользователя останутся кнопки «Отправить», «Сохранить» и выбор количества копий.
Заполнение по макету: области, параметры, группировки
Макет — это заготовка с именованными областями. Код берёт область, подставляет значения и выводит её в итоговый документ. Повторяя вывод строки в цикле, получаем таблицу любой длины.
Как подготовить макет
- В конфигураторе откройте макет, выделите строки шапки.
- Через контекстное меню назначьте имя области, например
Шапка. Так же —СтрокаиПодвал. - В ячейке, куда подставляется значение, откройте свойства и задайте Заполнение:
Параметр— в ячейку целиком подставится значение параметра, имя параметра пишется в поле «Параметр»;Шаблон— текст с подстановками в квадратных скобках:Итого: [Сумма] руб.;Текст— статичная надпись, ничего не подставляется.
Вывод строк из запроса
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Выборка = Запрос.Выполнить().Выбрать();
НомерСтроки = 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);
Основные значения второго параметра:
| Значение | Формат |
|---|---|
ТипФайлаТабличногоДокумента.XLSX | Excel 2007 и новее |
ТипФайлаТабличногоДокумента.PDF | PDF для отправки |
ТипФайлаТабличногоДокумента.DOCX | Word |
ТипФайлаТабличногоДокумента.MXL | Формат 1С |
ТипФайлаТабличногоДокумента.HTML5 | Веб-страница |
Как отдать файл пользователю в тонком клиенте
В клиент-серверной базе путь вида C:\Temp\ на сервере и на компьютере пользователя — это разные диски. Поэтому схема в три шага:
- На сервере записать документ во временный файл:
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx"). - Поместить его во временное хранилище:
Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяВременногоФайла), УникальныйИдентификатор)и удалить временный файл черезУдалитьФайлы(). - На клиенте сохранить файл
пользователю. В конфигурациях на БСП —
ФайловаяСистемаКлиент.СохранитьФайл(Неопределено, Адрес, "Отчет.xlsx").
Сразу открыть в Excel
Сохранить файл на клиенте и запустить его связанной программой. В толстом клиенте — ЗапуститьПриложение(ИмяФайла). В конфигурациях на БСП удобнее ФайловаяСистемаКлиент.ОткрытьФайл(): он сам учитывает тонкий и веб-клиент.
Если Excel показывает числа как текст, проверьте в макете формат ячеек. Значение, выведенное через Формат(), приходит строкой. Для чисел подставляйте в параметр само число, а формат задавайте в свойствах ячейки.
Ошибки при отображении табличного документа и как их найти
Ещё две ловушки, которые не видно в тексте ошибок:
- 🐢 Медленный вывод больших отчётов. Вывод десятков тысяч строк по одной заметно тормозит. Сократите выборку отбором, отключите лишние группировки или стройте отчёт на системе компоновки данных.
- 🔒 Пользователь меняет цифры в готовом отчёте. Поставьте
ТолькоПросмотр = Истинау документа или запретите редактирование в свойствах поля на форме.