При разработке внешних отчетов или обработок в среде 1С начинающие программисты часто сталкиваются с ситуацией, когда код вроде бы написан верно, области макета получены и выведены, но при нажатии на кнопку «Сформировать» экран остается пустым. В этой статье мы подробно разберем, почему так происходит, и изучим лучшие практики работы с табличными документами.
Давайте проанализируем исходный код, который стал причиной вопроса. Мы видим создание объекта ТабличныйДокумент, получение макета и вывод области «Шапка». Однако выполнение кода на этом заканчивается. Проблема заключается в том, что в оперативной памяти объект ТабДок действительно содержит сформированную шапку, но команда на отображение этого объекта пользователю не была дана.
Для того чтобы система открыла новое окно с вашим отчетом, необходимо в конце процедуры добавить метод Показать(). Рассмотрим исправленный пример кода:
Процедура КнопкаСформироватьНажатие(Кнопка)
// 1. Создаем объект в памяти
ТабДок = Новый ТабличныйДокумент;
// 2. Получаем макет внешнего отчета
Макет = ПолучитьМакет("МаркировкаНоменклатуры");
// 3. Формируем область шапки
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
// 4. Выводим область в документ
ТабДок.Вывести(ОбластьШапка);
// 5. САМЫЙ ВАЖНЫЙ ШАГ: Показываем результат пользователю
ТабДок.Показать("Отчет по маркировке номенклатуры");
КонецПроцедуры
Метод Показать() принимает необязательный параметр — заголовок окна. Мы рекомендуем всегда его указывать, чтобы пользователю было проще ориентироваться среди множества открытых окон в интерфейсе программы.
Рассмотрим более профессиональный подход, который упоминался в обсуждении на форуме. Вместо того чтобы при каждом нажатии кнопки плодить новые окна методом Показать(), правильнее будет разместить элемент управления Табличный документ непосредственно на самой форме отчета.
Давайте разберем по шагам, как это реализовать:
Результат и типом ТабличныйДокумент.Проанализируем, как изменится наш код в этом случае:
Процедура КнопкаСформироватьНажатие(Кнопка)
// Очищаем поле на форме перед формированием, чтобы данные не наслаивались
ЭлементыФормы.Результат.Очистить();
// Получаем макет
Макет = ПолучитьМакет("МаркировкаНоменклатуры");
// Получаем область
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
// Заполняем параметры, если они есть в шапке
ОбластьШапка.Параметры.ДатаОтчета = ТекущаяДата();
// Выводим область напрямую в табличный документ на форме
ЭлементыФормы.Результат.Вывести(ОбластьШапка);
// Метод Показать() здесь не нужен — данные появятся на форме мгновенно
КонецПроцедуры
Если мы забудем вызвать метод Очистить(), то при повторном нажатии кнопки «Сформировать» программа просто добавит новую шапку и новые данные ниже тех, что уже были выведены ранее. Это одна из самых частых ошибок, приводящая к некорректному виду отчетов. Всегда очищайте табличный документ перед началом цикла вывода данных.
Зачастую шапка отчета содержит не только статический текст, но и динамическую информацию: название организации, период, дату формирования. Для этого в макете для ячейки устанавливается свойство Заполнение: Параметр. Выясним, как правильно передавать в них значения:
Проанализируем ситуацию: в макете у нас есть ячейка с именем параметра ЗаголовокОтчета. Код для её заполнения будет выглядеть так:
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.ЗаголовокОтчета = "Ведомость по остаткам на " + Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
ТабДок.Вывести(ОбластьШапка);
Важно помнить: параметры нужно заполнять ДО того, как область будет выведена методом Вывести() или Присоединить(). После вывода изменения в параметрах области макета уже не повлияют на то, что уже отображено в итоговом документе.
Чтобы ваш отчет выглядел профессионально, рассмотрим несколько дополнительных свойств объекта ТабличныйДокумент, которые стоит устанавливать программно:
ФиксацияСверху.ТолькоПросмотр = Истина, чтобы пользователь не мог случайно изменить цифры в отчете, но при этом мог пользоваться расшифровкой.ОтображатьСетку = Ложь.Автомасштаб = Истина.Посмотрим на комплексный пример настройки внешнего вида:
ТабДок.Очистить();
// ... код вывода областей ...
ТабДок.ТолькоПросмотр = Истина;
ТабДок.ОтображатьСетку = Ложь;
ТабДок.ОтображатьЗаголовки = Ложь; // Скрывает имена колонок A, B, C...
ТабДок.ФиксацияСверху = 3; // Фиксирует первые 3 строки
ТабДок.Автомасштаб = Истина;
Разберем разницу между этими двумя ключевыми методами. Рассмотрим ситуацию, когда шапка отчета состоит из двух частей: левой (с названием) и правой (с логотипом или датой). Если мы дважды вызовем Вывести(), вторая часть окажется под первой. Чтобы расположить их в одну строку, используется Присоединить().
ОбластьЛево = Макет.ПолучитьОбласть("Шапка|ЛеваяЧасть");
ТабДок.Вывести(ОбластьЛево); // Начинает новую строку
ОбластьПраво = Макет.ПолучитьОбласть("Шапка|ПраваяЧасть");
ТабДок.Присоединить(ОбластьПраво); // Добавляет справа в ту же строку
Мы выяснили, что отсутствие вывода шапки чаще всего связано либо с отсутствием вызова метода Показать(), либо с тем, что разработчик перепутал локальную переменную с реквизитом формы. Следуя правилам очистки документа, заполнения параметров и настройки свойств отображения, вы сможете создавать качественные и удобные отчеты для пользователей системы 1С.