При интерактивной работе с отчетами в 1С:Предприятии 7.7 часто реализуют сортировку данных или расшифровку по двойному клику мыши на ячейках шапки. Однако разработчики нередко сталкиваются с ситуацией, когда при каждом таком действии отчет формируется заново и открывается в отдельном окне. В результате рабочее пространство программы быстро засоряется десятками одинаковых вкладок.
Разберем причины такого поведения платформы, проанализируем синтаксис методов табличного документа и рассмотрим надежные способы избежать дублирования окон.
Выясним причину появления множества окон. Если переменная таблицы инициализируется локально внутри процедуры формирования (например, с помощью конструкции Таб = СоздатьОбъект("Таблица")), при каждом повторном вызове создается полностью независимый экземпляр объекта. Платформа 1С 7.7 воспринимает его как новый документ и выводит в отдельное MDI-окно при вызове метода Показать().
Для управления отображением окна печатной формы используется метод со следующим полным синтаксисом:
Показать(<Заголовок>, <ИмяФайла>, <Активизировать>)
Рассмотрим подробнее назначение третьего параметра <Активизировать>:
Если разработчик передает значение -1 в самом конце процедуры вывода отчета (вместо отображения), платформа моментально закрывает только что сформированное окно, из-за чего пользователь вообще ничего не видит на экране. Чтобы управлять окнами правильно, применим один из двух проверенных подходов.
Посмотрим на пример типовых конфигураций 1С 7.7 (например, отчет «Остатки ТМЦ»). В них при нажатии кнопки «Сформировать» или «Обновить» окно не закрывается и не пересоздается — данные перезаполняются прямо в существующей форме. Это исключает мерцание интерфейса и блокирует открытие дублей.
Разберем реализацию по шагам:
Очистить() — он удаляет старые ячейки, но сохраняет привязку к открытому окну.СоздатьОбъект("Таблица").Показать() с нужным заголовком.Посмотрим на пример программного кода:
Перем Таб;
Процедура Сформировать()
Если ТипЗначенияСтр(Таб) <> "Таблица" Тогда
Таб = СоздатьОбъект("Таблица");
Иначе
Таб.Очистить();
КонецЕсли;
// Вывод секций отчета
Таб.ВывестиСекцию("Шапка");
// Здесь располагается цикл выборки данных и сортировки
Таб.ВывестиСекцию("Строка");
Таб.ВывестиСекцию("Подвал");
Таб.Показать("Отчет по остаткам", "");
КонецПроцедуры
Если логика отчета требует полного уничтожения предыдущего окна перед выводом нового, применим параметр -1. Главное правило — вызывать закрытие до создания нового отчета, а не после.
Проанализируем ситуацию: чтобы закрыть конкретное окно, нам требуется рабочая ссылка на объект этого окна. Поэтому переменная также должна быть объявлена на уровне модуля.
Разберем по шагам алгоритм закрытия:
Показать() с третьим параметром, равным -1. Окно на экране закрывается.1.Посмотрим на реализацию в коде:
Перем Таб;
Процедура ПереформироватьСНовойСортировкой()
// Закрываем предыдущую таблицу, если она открыта
Если ТипЗначенияСтр(Таб) = "Таблица" Тогда
Таб.Показать("Отчет", , -1);
КонецЕсли;
// Создаем объект заново
Таб = СоздатьОбъект("Таблица");
Таб.ВывестиСекцию("Шапка");
// Формирование строк с учетом новой сортировки
Таб.ВывестиСекцию("Строка");
// Открываем новое окно
Таб.Показать("Отчет", , 1);
КонецПроцедуры
Рассмотрим альтернативные способы организации интерфейса, когда требуется частая интерактивная сортировка колонок:
Таблица, метод Показать() не требуется вовсе, а вся перерисовка происходит внутри одной формы.