Разработка пользовательского интерфейса в платформе 1С:Предприятие 8 часто требует отображения сложных аналитических данных непосредственно внутри формы документа или справочника. Стандартный подход «открыть отдельное окно» не всегда удобен для пользователя, которому нужно видеть цифры в контексте редактируемого объекта. В таких случаях разработчики сталкиваются с задачей, как корректно и эффективно вывести готовый отчет прямо на элемент формы.
Существует несколько архитектурных подходов к решению этой задачи, каждый из которых имеет свои преимущества и ограничения. Выбор конкретного метода зависит от версии используемой конфигурации, типа отчета (построен на Системе Компоновки Данных или код) и требований к производительности интерфейса. Неправильный выбор механизма может привести к «зависанию» формы при открытии или некорректному отображению данных.
В данной статье мы детально разберем алгоритм вывода отчета на форму через управляемые формы, рассмотрим работу с макетами и табличными документами, а также уделим внимание настройке параметров, которые влияют на итоговый вид документа. Вы узнаете, как избежать типичных ошибок при передаче данных из запроса в визуальный компонент.
Архитектура вывода данных на управляемую форму
Прежде чем писать код, необходимо понять, как платформа 1С обрабатывает отображение табличных документов. В управляемом приложении форма клиента не имеет прямого доступа к серверным объектам метаданных в момент отрисовки. Поэтому процесс вывода отчета всегда строится по схеме: формирование данных на сервере → сериализация в табличный документ → передача на клиент → отображение в поле формы типа ТабличноеДокумент.
Ключевым элементом здесь является реквизит формы. Вы не можете просто «нарисовать» отчет где угодно; вам необходим специальный контейнер. В конфигураторе для этого используется элемент с типом ТабличноеДокумент. Важно отметить, что этот элемент может работать в двух режимах: как поле ввода (редактируемый) и как поле вывода (только чтение). Для отчетов почти всегда используется режим только чтения, чтобы пользователь случайно не исказил аналитику.
Существует распространенное заблуждение, что отчет на форме — это тот же самый объект отчета, что и в меню «Отчеты». На самом деле, на форме мы чаще всего работаем с результатом исполнения отчета, то есть с готовым ТабличнымДокументом, либо с данными, которые этот отчет генерирует. Прямая вставка объекта Отчет внутрь формы возможна, но требует специфических настроек и используется реже из-за сложности управления событиями.
⚠️ Внимание: Попытка передать на клиент слишком большой табличный документ (например, выгрузку за несколько лет с детализацией по секундам) может привести к превышению лимитов сериализации и ошибке «Превышен максимально допустимый размер передаваемых данных». Всегда используйте отборы!
Платформа автоматически оптимизирует передачу данных, но только если вы правильно структурируете запрос. Использование временных таблиц на сервере перед формированием макета является обязательным этапом для сложных отчетов. Это снижает нагрузку на канал связи между клиентом и сервером.
Используйте свойство «АвтоМакет» у поля табличного документа, если хотите, чтобы отчет занимал всю доступную область формы без лишних полос прокрутки внутри самого поля.
Подготовка формы и реквизитов в Конфигураторе
Процесс настройки начинается в дереве метаданных. Откройте нужную форму в режиме Конфигуратора. Первым шагом необходимо добавить новый реквизит формы, который будет хранить данные отчета. Тип этого реквизита должен быть строго определен как ТабличныйДокумент. Имя реквизита лучше выбирать говорящее, например, ТабДокОтчет или МакетАналитики.
После создания реквизита необходимо добавить визуальный элемент на макет формы. Перетащите элемент «Поле табличного документа» из палитры элементов на рабочую область. В свойствах этого элемента в поле «Путь к данным» укажите имя созданного ранее реквизита. Это связывает визуальную часть с логической переменной.
- 📁 Обязательно проверьте свойство Видимость: по умолчанию элемент может быть скрыт, если отчет формируется по нажатию кнопки.
- 🔒 Установите свойство ТолькоПросмотр в значение
Истина, чтобы запретить пользователю ручное редактирование ячеек отчета. - 📐 Настройте свойства Масштаб и ОтображатьЗаголовкиКолонок в зависимости от требований к читаемости данных на экране.
Если ваш отчет предполагает наличие параметров (период, контрагент, склад), их также необходимо вынести в отдельные реквизиты формы. Это позволит пользователю менять настройки отчета, не закрывая форму. Для каждого параметра создайте соответствующий элемент ввода (дата, поле ввода, список выбора) и свяжите их с реквизитами.
| Свойство элемента | Рекомендуемое значение | Назначение |
|---|---|---|
| Тип | ТабличноеДокумент | Хранение структуры отчета |
| Режим | ТолькоПросмотр | Защита от изменений |
| АвтоМакет | Авто | Адаптация под размер окна |
| Отбор | (Пусто) | Фильтрация на клиенте (редко) |
Важно помнить о контексте выполнения. Реквизиты формы существуют и на клиенте, и на сервере, но тяжелые вычисления должны происходить исключительно на сервере. Поэтому логика формирования отчета выносится в модуль объекта или в общий модуль с признаком Сервер.
Алгоритм формирования отчета на сервере
Сердцем процесса является серверная процедура, которая собирает данные и наполняет табличный документ. Обычно эта процедура вызывается по команде пользователя (кнопка «Сформировать») или при изменении ключевых параметров формы. Обработчик события должен быть размещен в модуле формы с квалификацией &НаКлиенте, но он должен вызывать серверную процедуру.
Рассмотрим классический сценарий. В модуле формы создается команда, например, СформироватьОтчет. В обработчике этой команды на клиенте мы вызываем серверный метод. Серверный метод получает текущие значения параметров формы, выполняет запрос к базе данных и записывает результат в реквизит ТабДокОтчет.
&НаСервере
Процедура СформироватьОтчетНаСервере
// 1. Получаем параметры с формы
ПериодНачала = Объект.ПериодНачала;
ПериодКонца = Объект.ПериодКонца;
// 2. Формируем запрос
Запрос = Новый Запрос;
Запрос.Текст ="ВЫБРАТЬ... ИЗ... ГДЕ Период МЕЖДУ &Нач И &Кон";
Запрос.УстановитьПараметр("Нач", ПериодНачала);
Запрос.УстановитьПараметр("Кон", ПериодКонца);
// 3. Выполняем и выводим в макет
Результат = Запрос.Выполнить;
ТабДок = Результат.ВыгрузитьТабличныйДокумент;
// 4. Записываем в реквизит формы
Объект.ТабДокОтчет = ТабДок;
КонецПроцедуры
Особое внимание следует уделить обработке пустых выборок. Если запрос не вернул данных, табличный документ не должен оставаться пустым или содержать ошибки. Хорошим тоном считается вывод сообщения «Данные не найдены» прямо в тело отчета или очистка поля с уведомлением пользователя.
При использовании Системы Компоновки Данных (СКД) процесс немного усложняется. Вам потребуется создать объект КомпоновщикНастроек, загрузить в него настройки отчета (либо стандартные, либо сохраненные пользователем), скомпоновать макет и только потом вывести его. СКД предоставляет гибкость, но требует больше кода для инициализации.
⚠️ Внимание: Никогда не выполняйте тяжелые запросы в цикле по элементам формы. Если вам нужно сформировать отчет для каждой строки табличной части, это приведет к критическому падению производительности. Используйте один общий запрос с группировкой.
Оптимизация запросов при выводе на форму
Если отчет формируется медленно, проверьте план выполнения запроса. Часто помогает добавление индексов на поля, используемые в отборах, или замена вложенных запросов на временные таблицы.
Работа с Системой Компоновки Данных (СКД)
Использование СКД для вывода отчетов на форму является современным стандартом разработки в 1С. Этот подход позволяет отделить логику получения данных от логики их отображения. Пользователь получает возможность настраивать отчет (добавлять поля, менять группировки) прямо на форме, если вы предоставите ему такую возможность через панель настроек.
Для реализации этого механизма на форме необходимо разместить не только поле табличного документа, но и поле для настройки отчета (тип ПолеНастроекКомпоновкиДанных). Однако, часто разработчики скрывают панель настроек, предоставляя только предопределенный вариант отчета. В этом случае настройка происходит программно.
Ключевой объект здесь — КомпоновщикНастроек. Он отвечает за трансформацию данных запроса в визуальную структуру. Вы можете программно устанавливать отборы, порядок сортировки и видимость полей перед компоновкой. Это позволяет создавать динамические отчеты, которые меняют свою структуру в зависимости от контекста документа.
- 🛠 Используйте метод
КомпоновщикНастроек.Настройки.Отборыдля программной фильтрации данных перед выводом. - 🎨 Свойства оформления (цвета, шрифты) можно задавать через
УсловноеОформлениев настройках СКД. - 💾 Сохраняйте варианты настроек в регистре сведений, чтобы пользователь не терял свою конфигурацию отчета при следующем входе.
Важным аспектом является передача параметров в схему запроса СКД. Параметры схемы должны быть связаны с реквизитами формы. Это делается через коллекцию Параметры компоновщика. Если связь не установлена, отчет сформируется с пустыми данными или выдаст ошибку выполнения.
СКД позволяет переиспользовать один и тот же отчет в разных местах конфигурации, просто меняя набор настроек и параметров, что значительно упрощает поддержку кода.
Вывод простого табличного документа из макета
Не всегда требуется мощь СКД. Для простых печатных форм, накладных или счетов-фактур, которые нужно показать пользователю перед печатью, достаточно использовать обычный макет, созданный в конфигураторе. Этот метод быстрее в реализации и менее требователен к ресурсам.
Макет хранится в ресурсах конфигурации или в общем макете. Для работы с ним на сервере используется метод ПолучитьМакет. После получения объекта макета, вы заполняете его области данными из запроса или переменных. Область — это именованный диапазон ячеек в макете, который служит шаблоном для строки таблицы.
&НаСервере
Процедура ЗаполнитьМакетНаСервере
// Получаем макет по имени
Макет = Объект.ПолучитьМакет("МакетСчет");
// Создаем табличный документ
ТабДок = Макет.ПолучитьТабличныйДокумент;
// Заполняем шапку
ТабДок.Область("Шапка").Параметры.Номер = Объект.Номер;
ТабДок.Область("Шапка").Параметры.Дата = Объект.Дата;
// Выводим на форму
Объект.ТабДокОтчет = ТабДок;
КонецПроцедуры
При работе с табличными частями документа цикл организуется стандартно: выводится область заголовка, затем в цикле по строкам части выводится область строки, и в конце — область итогов. Главное преимущество этого метода — полный визуальный контроль над каждым пикселем отчета, что критично для документов строгой отчетности.
Однако у этого подхода есть минус: сложность изменения структуры отчета «на лету». Если пользователю нужно добавить колонку, вам придется переписывать макет и код заполнения. СКД в этом плане гибче, но макеты дают более предсказуемый результат печати.
⚠️ Внимание: При использовании макетов следите за кодировкой шрифтов. Если на клиентских машинах установлены разные версии Windows или отсутствуют специфические шрифты, верстка отчета может «поехать». Используйте стандартные шрифты платформы.
Интерактивность и команды в отчете на форме
Вывод отчета на форму — это не всегда финальная точка. Часто требуется сделать отчет интерактивным. Платформа 1С позволяет назначать команды на ячейки табличного документа. Например, при двойном клике на сумму в отчете может открываться документ-основание, или при нажатии на кнопку внутри отчета может формироваться печатная форма PDF.
Для реализации этого используется механизм Команды табличного документа. В свойствах поля формы или программно в обработчике события НачалоВыбора или ПриАктивацииЯчейки вы можете определить, какая процедура будет вызвана при взаимодействии с конкретной областью отчета.
Пример сценария: пользователь видит отчет по продажам менеджера. Он нажимает на фамилию менеджера в отчете. Система должна открыть карточку этого сотрудника. Для этого в серверной процедуре формирования отчета нужно заполнить свойство Область.Параметры.Команда или использовать обработчик события формы КомандаТабличногоДокумента.
- 🖱 Настройте событие КомандаТабличногоДокумента в модуле формы для обработки кликов по отчету.
- 🔗 Передавайте идентификаторы объектов (Ссылка.Документ, Ссылка.Справочник) в параметрах команды для последующего открытия.
- 🎨 Визуально выделяйте кликабельные элементы (синий цвет текста, подчеркивание), чтобы пользователь понимал интерактивность.
Также стоит упомянуть возможность экспорта. Поле табличного документа на форме по умолчанию имеет контекстное меню, позволяющее пользователю выгрузить отчет в MXL, PDF, Excel или CSV. Не отключайте эту возможность, если нет строгих требований безопасности, так как это стандартный и ожидаемый пользователями функционал.
☑️ Чек-лист проверки отчета на форме
Часто задаваемые вопросы (FAQ)
Почему отчет на форме отображается пустым, хотя запрос возвращает данные?
Наиболее вероятная причина — несоответствие типов данных или ошибка в присваивании. Убедитесь, что вы присваиваете именно объект ТабличныйДокумент реквизиту формы, а не РезультатЗапроса или ТаблицаЗначений. Также проверьте, не скрыто ли поле условием видимости.
Можно ли редактировать данные прямо в отчете на форме?
Технически это возможно, если снять флаг «ТолькоПросмотр» у поля табличного документа. Однако это нарушает идеологию отчетов. Если вам нужно редактирование, лучше используйте обычную Таблицу или ТабличноеПоле с источником данных ТаблицаЗначений. Отчет предназначен для анализа, а не для ввода.
Как обновить отчет автоматически при изменении периода?
Используйте обработчик события ПриИзменении для реквизита даты на клиенте. Внутри этого обработчика вызывайте серверную процедуру формирования отчета. Для оптимизации можно добавить задержку или проверять, изменилось ли значение действительно, чтобы не гонять запросы при каждом нажатии клавиши.
Отчет формируется слишком долго, форма «висит». Что делать?
Проверьте текст запроса на наличие полного сканирования таблиц без индексов. Убедитесь, что отборы накладываются на поля с индексами. Если данных много, реализуйте пошаговую загрузку или ограничьте максимальный период выбора в интерфейсе. Также поможет вынесение формирования во фоновое задание, если платформа позволяет это для форм.
Можно ли вывести несколько разных отчетов в одно поле?
Да, поле одно, но объект ТабличныйДокумент внутри него можно перезаписывать. Вы можете сделать переключатель (радиокнопку) «Вид отчета», и в зависимости от выбора формировать разную логику заполнения, записывая результат в тот же реквизит ТабДокОтчет.