При разработке отчетов и печатных форм в интерфейсе "Такси" программисты часто сталкиваются с тем, что стандартный метод ТабличныйДокумент.Показать() открывает документ в виде новой вкладки в основной области приложения. Однако в некоторых бизнес-сценариях заказчик требует, чтобы документ открывался в отдельном окне, которое можно переместить на другой монитор или расположить поверх основного окна программы. В этой статье мы подробно разберем, как реализовать такое поведение программными средствами платформы 1С.
Рассмотрим наиболее быстрый способ, который не требует создания новых объектов в конфигурации. В платформе 1С существует встроенная системная форма для отображения табличных документов. Мы можем обратиться к ней напрямую, используя специальный путь. Проанализируем пример кода, который позволяет вызвать это окно:
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("sheet", ТабДок); // Передаем наш табличный документ
ПараметрыФормы.Вставить("Edit", Ложь); // Запрещаем редактирование
ПараметрыФормы.Вставить("ShowGrid", Ложь); // Скрываем сетку
ПараметрыФормы.Вставить("ShowHeaders", Ложь); // Скрываем заголовки строк и колонок
ФормаТабДока = ПолучитьФорму("sysForm:spreadsheetdocumentForm", ПараметрыФормы);
ФормаТабДока.РежимОткрытияОкна = РежимОткрытияОкнаФормы.Независимый;
ФормаТабДока.Заголовок = "Просмотр документа";
ФормаТабДока.Открыть();
Разберем подробнее параметры, которые мы передаем в структуру ПараметрыФормы. Ключ sheet является обязательным — именно в него мы помещаем объект ТабличныйДокумент. Параметры Edit, ShowGrid и ShowHeaders позволяют настроить визуальное отображение документа без изменения свойств самого объекта. Выясним важную деталь: обращение к sysForm:spreadsheetdocumentForm работает только в управляемом приложении. В режиме обычных форм данный синтаксис вызовет ошибку, так как там механизмы работы с окнами реализованы иначе.
Для того чтобы окно открылось именно как отдельное окно операционной системы, а не вкладка, мы установили свойство РежимОткрытияОкна в значение РежимОткрытияОкнаФормы.Независимый. Если же вам нужно заблокировать работу пользователя с основной программой до закрытия документа, используйте значение РежимОткрытияОкнаФормы.БлокироватьОкноВладельца.
Если возможностей системной формы недостаточно (например, нужно добавить свои кнопки в командную панель или перехватить событие расшифровки), рассмотрим создание Общей формы. Это более гибкий и "чистый" с точки зрения архитектуры подход. Разберем по шагам процесс реализации:
ПросмотрОтчета.ТабличныйДокумент и вынесем его на рабочую область формы как Поле табличного документа.РежимОткрытияОкна в значение Независимый.Теперь проанализируем программный код в модуле этой формы. Нам необходимо принять переданный документ и отобразить его:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("ТабличныйДокумент") Тогда
// Копируем содержимое переданного документа в реквизит формы
ЗначениеВРеквизитФормы(Параметры.ТабличныйДокумент, "ТабДокРеквизит");
Иначе
Отказ = Истина; // Если данные не переданы, не открываем форму
Конецесли;
КонецПроцедуры
Для вызова этой формы из любого места конфигурации (например, из модуля обработки или команды) используем следующий код:
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("ТабличныйДокумент", МойТабДок);
ОткрытьФорму("ОбщаяФорма.ПросмотрОтчета", ПараметрыОткрытия, , Истина);
Обратите внимание на четвертый параметр метода ОткрытьФорму. Если передать туда Истина (или уникальный ключ), 1С создаст новое уникальное окно. Если же этого не сделать, при повторном вызове кода платформа попытается найти уже открытое окно этой формы и просто активировать его, что не всегда удобно, если нужно сравнить два разных документа.
Проанализируем ситуацию с современными версиями платформы (8.3.15 и выше). Для полноценного выноса окна на второй монитор рекомендуется также использовать свойство формы ВариантОткрытияОкна. Если установить его в ВариантОткрытияОкна.ОтдельноеОкно, документ будет отображаться с собственной иконкой на панели задач Windows, что значительно повышает удобство работы пользователя.
Посмотрим на специфику работы в Веб-клиенте. Здесь ситуация сложнее: браузеры часто блокируют всплывающие окна. Если вы используете РежимОткрытияОкнаФормы.Независимый, убедитесь, что в настройках браузера разрешены всплывающие окна для адреса вашей базы 1С. В противном случае форма просто не откроется, и пользователь не получит никакого уведомления.
Если мы работаем с Обычными формами (Толстый клиент), то метод ТабличныйДокумент.Показать() по умолчанию открывает отдельное MDI-окно. Если этого не происходит, выясним причину в настройках пользователя. В параметрах интерфейса может быть установлен флаг "Отображать документы в закладках", который переопределяет стандартное поведение системы.
В заключение отметим дополнительные параметры системной формы, которые могут пригодиться. Параметр ReadOnly (логическое) позволяет жестко ограничить возможность изменения данных, даже если в самом табличном документе свойство ТолькоПросмотр установлено в Ложь. Параметр Title позволяет передать строку заголовка прямо в структуре параметров, что избавляет от необходимости обращаться к объекту формы после его создания. Эти знания помогут вам создавать профессиональные и удобные интерфейсы для конечных пользователей.